Message ID | 1595471649-25675-2-git-send-email-cang@codeaurora.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Fix up and simplify error recovery mechanism | expand |
On 2020-07-23 10:34, Can Guo wrote: > Clock gating features can be turned on/off selectively which means its > state information is only important if it is enabled. This change makes > sure that we only look at state of clk-gating if it is enabled. > > Signed-off-by: Can Guo <cang@codeaurora.org> > Reviewed-by: Avri Altman <avri.altman@wdc.com> > --- > drivers/scsi/ufs/ufshcd.c | 17 ++++++++++++++--- > 1 file changed, 14 insertions(+), 3 deletions(-) > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c > index cdff7e5..99bd3e4 100644 > --- a/drivers/scsi/ufs/ufshcd.c > +++ b/drivers/scsi/ufs/ufshcd.c > @@ -1839,6 +1839,8 @@ static void ufshcd_init_clk_gating(struct ufs_hba > *hba) > if (!ufshcd_is_clkgating_allowed(hba)) > return; > > + hba->clk_gating.state = CLKS_ON; > + > hba->clk_gating.delay_ms = 150; > INIT_DELAYED_WORK(&hba->clk_gating.gate_work, ufshcd_gate_work); > INIT_WORK(&hba->clk_gating.ungate_work, ufshcd_ungate_work); > @@ -2541,7 +2543,8 @@ static int ufshcd_queuecommand(struct Scsi_Host > *host, struct scsi_cmnd *cmd) > err = SCSI_MLQUEUE_HOST_BUSY; > goto out; > } > - WARN_ON(hba->clk_gating.state != CLKS_ON); > + WARN_ON(ufshcd_is_clkgating_allowed(hba) && > + (hba->clk_gating.state != CLKS_ON)); > > lrbp = &hba->lrb[tag]; > > @@ -8315,8 +8318,11 @@ static int ufshcd_suspend(struct ufs_hba *hba, > enum ufs_pm_op pm_op) > /* If link is active, device ref_clk can't be switched off */ > __ufshcd_setup_clocks(hba, false, true); > > - hba->clk_gating.state = CLKS_OFF; > - trace_ufshcd_clk_gating(dev_name(hba->dev), hba->clk_gating.state); > + if (ufshcd_is_clkgating_allowed(hba)) { > + hba->clk_gating.state = CLKS_OFF; > + trace_ufshcd_clk_gating(dev_name(hba->dev), > + hba->clk_gating.state); > + } > > /* Put the host controller in low power mode if possible */ > ufshcd_hba_vreg_set_lpm(hba); > @@ -8456,6 +8462,11 @@ static int ufshcd_resume(struct ufs_hba *hba, > enum ufs_pm_op pm_op) > if (hba->clk_scaling.is_allowed) > ufshcd_suspend_clkscaling(hba); > ufshcd_setup_clocks(hba, false); > + if (ufshcd_is_clkgating_allowed(hba)) { > + hba->clk_gating.state = CLKS_OFF; > + trace_ufshcd_clk_gating(dev_name(hba->dev), > + hba->clk_gating.state); > + } > out: > hba->pm_op_in_progress = 0; > if (ret) Reviewed-by: Hongwu Su <hongwus@codeaurora.org>
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index cdff7e5..99bd3e4 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -1839,6 +1839,8 @@ static void ufshcd_init_clk_gating(struct ufs_hba *hba) if (!ufshcd_is_clkgating_allowed(hba)) return; + hba->clk_gating.state = CLKS_ON; + hba->clk_gating.delay_ms = 150; INIT_DELAYED_WORK(&hba->clk_gating.gate_work, ufshcd_gate_work); INIT_WORK(&hba->clk_gating.ungate_work, ufshcd_ungate_work); @@ -2541,7 +2543,8 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) err = SCSI_MLQUEUE_HOST_BUSY; goto out; } - WARN_ON(hba->clk_gating.state != CLKS_ON); + WARN_ON(ufshcd_is_clkgating_allowed(hba) && + (hba->clk_gating.state != CLKS_ON)); lrbp = &hba->lrb[tag]; @@ -8315,8 +8318,11 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) /* If link is active, device ref_clk can't be switched off */ __ufshcd_setup_clocks(hba, false, true); - hba->clk_gating.state = CLKS_OFF; - trace_ufshcd_clk_gating(dev_name(hba->dev), hba->clk_gating.state); + if (ufshcd_is_clkgating_allowed(hba)) { + hba->clk_gating.state = CLKS_OFF; + trace_ufshcd_clk_gating(dev_name(hba->dev), + hba->clk_gating.state); + } /* Put the host controller in low power mode if possible */ ufshcd_hba_vreg_set_lpm(hba); @@ -8456,6 +8462,11 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) if (hba->clk_scaling.is_allowed) ufshcd_suspend_clkscaling(hba); ufshcd_setup_clocks(hba, false); + if (ufshcd_is_clkgating_allowed(hba)) { + hba->clk_gating.state = CLKS_OFF; + trace_ufshcd_clk_gating(dev_name(hba->dev), + hba->clk_gating.state); + } out: hba->pm_op_in_progress = 0; if (ret)