2020-07-14 02:28:52

by Can Guo

[permalink] [raw]
Subject: [PATCH v2 1/4] scsi: ufs: Add checks before setting clk-gating states

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 <[email protected]>
---
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 efc0a6c..ebf7a95 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);
@@ -2538,7 +2540,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);
+ if (ufshcd_is_clkgating_allowed(hba))
+ WARN_ON(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)
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.


2020-07-14 03:38:55

by Bart Van Assche

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] scsi: ufs: Add checks before setting clk-gating states

On 2020-07-13 19:28, Can Guo wrote:
> @@ -2538,7 +2540,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);
> + if (ufshcd_is_clkgating_allowed(hba))
> + WARN_ON(hba->clk_gating.state != CLKS_ON);

A minor comment: has it been considered to change this into the
following?

WARN_ON(ufshcd_is_clkgating_allowed(hba) &&
hba->clk_gating.state != CLKS_ON);

Thanks,

Bart.

2020-07-14 04:16:06

by Can Guo

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] scsi: ufs: Add checks before setting clk-gating states

Hi Bart,

On 2020-07-14 11:38, Bart Van Assche wrote:
> On 2020-07-13 19:28, Can Guo wrote:
>> @@ -2538,7 +2540,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);
>> + if (ufshcd_is_clkgating_allowed(hba))
>> + WARN_ON(hba->clk_gating.state != CLKS_ON);
>
> A minor comment: has it been considered to change this into the
> following?
>
> WARN_ON(ufshcd_is_clkgating_allowed(hba) &&
> hba->clk_gating.state != CLKS_ON);
>
> Thanks,
>
> Bart.

Sure, will do that.

Thanks,

Can Guo.