2020-07-23 02:34:54

by Can Guo

[permalink] [raw]
Subject: [PATCH v5 1/9] 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]>
Reviewed-by: Avri Altman <[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 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)
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.


2020-07-23 02:48:23

by hongwus

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

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 <[email protected]>
> Reviewed-by: Avri Altman <[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 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 <[email protected]>