diff options
| author | Venkat Gopalakrishnan <venkatg@codeaurora.org> | 2016-08-04 17:56:57 -0700 |
|---|---|---|
| committer | Venkat Gopalakrishnan <venkatg@codeaurora.org> | 2016-08-10 16:34:35 -0700 |
| commit | 33ee9fb701814464930009c2a22b2bd36c6d91ee (patch) | |
| tree | 11921e52a22d6bddc0f0168270adbf7c49b541af /drivers/scsi | |
| parent | e94b446eac88a43e42ecde105275d48b677ea5b3 (diff) | |
scsi: ufs: disable ah8 during suspend and enable it on resume
Auto hibern8 is useful during active requests for efficient power
savings. Since we are anyway in suspend path, disable auto
hibern8 until a successful resume. This prevents unnecessary hibern8
enter/exit during the suspend/resume path.
Change-Id: Ie5a76dddd662e67ae8ce6e6f37f437ff4665b066
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/ufs/ufshcd.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 4d406c51d884..12333572ba70 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -7977,6 +7977,13 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) hba->clk_gating.is_suspended = true; hba->hibern8_on_idle.is_suspended = true; + /* + * Disable auto hibern8 to prevent unnecessary hibern8 enter/exit + * during suspend path + */ + if (ufshcd_is_auto_hibern8_supported(hba)) + ufshcd_set_auto_hibern8_timer(hba, 0); + if (hba->clk_scaling.is_allowed) { cancel_work_sync(&hba->clk_scaling.suspend_work); cancel_work_sync(&hba->clk_scaling.resume_work); @@ -8084,6 +8091,10 @@ enable_gating: ufshcd_resume_clkscaling(hba); hba->hibern8_on_idle.is_suspended = false; hba->clk_gating.is_suspended = false; + /* Re-enable auto hibern8 in case of suspend failure */ + if (ufshcd_is_auto_hibern8_supported(hba)) + ufshcd_set_auto_hibern8_timer(hba, + hba->hibern8_on_idle.delay_ms); ufshcd_release_all(hba); out: hba->pm_op_in_progress = 0; @@ -8177,6 +8188,13 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) if (hba->clk_scaling.is_allowed) ufshcd_resume_clkscaling(hba); + /* + * Enable auto hibern8 after successful resume to prevent + * unnecessary hibern8 enter/exit during resume path + */ + if (ufshcd_is_auto_hibern8_supported(hba)) + ufshcd_set_auto_hibern8_timer(hba, + hba->hibern8_on_idle.delay_ms); /* Schedule clock gating in case of no access to UFS device yet */ ufshcd_release_all(hba); goto out; |
