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>
This commit is contained in:
Venkat Gopalakrishnan 2016-08-04 17:56:57 -07:00
parent e94b446eac
commit 33ee9fb701

View file

@ -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;