2020-02-08 00:53:41

by Can Guo

[permalink] [raw]
Subject: [PATCH 7/7] scsi: ufs-qcom: Delay specific time before gate ref clk

After enter hibern8, as UFS JEDEC ver 3.0 requires, a specific gating wait
time is required before disable the device reference clock. If it is not
specified, use the old delay.

Signed-off-by: Can Guo <[email protected]>
Reviewed-by: Asutosh Das <[email protected]>
Reviewed-by: Hongwu Su <[email protected]>

diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
index 85d7c17..db14a83 100644
--- a/drivers/scsi/ufs/ufs-qcom.c
+++ b/drivers/scsi/ufs/ufs-qcom.c
@@ -845,11 +845,27 @@ static void ufs_qcom_dev_ref_clk_ctrl(struct ufs_qcom_host *host, bool enable)
/*
* If we are here to disable this clock it might be immediately
* after entering into hibern8 in which case we need to make
- * sure that device ref_clk is active at least 1us after the
+ * sure that device ref_clk is active for specific time after
* hibern8 enter.
*/
- if (!enable)
- udelay(1);
+ if (!enable) {
+ unsigned long gating_wait;
+
+ gating_wait = host->hba->dev_info.clk_gating_wait_us;
+ if (!gating_wait) {
+ udelay(1);
+ } else {
+ /*
+ * bRefClkGatingWaitTime defines the minimum
+ * time for which the reference clock is
+ * required by device during transition from
+ * HS-MODE to LS-MODE or HIBERN8 state. Give it
+ * more delay to be on the safe side.
+ */
+ gating_wait += 10;
+ usleep_range(gating_wait, gating_wait + 10);
+ }
+ }

writel_relaxed(temp, host->dev_ref_clk_ctrl_mmio);

--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


2020-02-09 07:50:57

by Avri Altman

[permalink] [raw]
Subject: RE: [PATCH 7/7] scsi: ufs-qcom: Delay specific time before gate ref clk

> + gating_wait += 10;
> + usleep_range(gating_wait, gating_wait + 10);
You didn't addressed Bjorn's comment concerning setting larger upper bound.

Thanks,
Avri

2020-02-09 07:58:46

by Avri Altman

[permalink] [raw]
Subject: RE: [PATCH 7/7] scsi: ufs-qcom: Delay specific time before gate ref clk

>
> > + gating_wait += 10;
> > + usleep_range(gating_wait, gating_wait + 10);
> You didn't addressed Bjorn's comment concerning setting larger upper
> bound.

Sorry - you did. Please ignore.