From 33ee9fb701814464930009c2a22b2bd36c6d91ee Mon Sep 17 00:00:00 2001 From: Venkat Gopalakrishnan Date: Thu, 4 Aug 2016 17:56:57 -0700 Subject: [PATCH] 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 --- drivers/scsi/ufs/ufshcd.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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;