* [PATCH v6 2/2] scsi: ufs-qcom: Fix ufs RST_n specs violation
[not found] <1610103385-45755-1-git-send-email-ziqichen@codeaurora.org>
@ 2021-01-08 10:56 ` Ziqi Chen
2021-01-12 9:18 ` Avri Altman
0 siblings, 1 reply; 2+ messages in thread
From: Ziqi Chen @ 2021-01-08 10:56 UTC (permalink / raw)
To: asutoshd, nguyenb, cang, hongwus, rnayak, vinholikatti, jejb,
martin.petersen, linux-scsi, kernel-team, saravanak, salyzyn,
ziqichen, kwmad.kim, stanley.chu
Cc: Andy Gross, Bjorn Andersson, Alim Akhtar, Avri Altman,
James E.J. Bottomley, open list:ARM/QUALCOMM SUPPORT, open list
As per specs, e.g, JESD220E chapter 7.2, while powering
off/on the ufs device, RST_n signal should be between
VSS(Ground) and VCCQ/VCCQ2.
Signed-off-by: Ziqi Chen <ziqichen@codeaurora.org>
---
drivers/scsi/ufs/ufs-qcom.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
index 2206b1e..f97d7b0 100644
--- a/drivers/scsi/ufs/ufs-qcom.c
+++ b/drivers/scsi/ufs/ufs-qcom.c
@@ -568,6 +568,17 @@ static int ufs_qcom_link_startup_notify(struct ufs_hba *hba,
return err;
}
+static void ufs_qcom_device_reset_ctrl(struct ufs_hba *hba, bool asserted)
+{
+ struct ufs_qcom_host *host = ufshcd_get_variant(hba);
+
+ /* reset gpio is optional */
+ if (!host->device_reset)
+ return;
+
+ gpiod_set_value_cansleep(host->device_reset, asserted);
+}
+
static int ufs_qcom_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
{
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
@@ -582,6 +593,9 @@ static int ufs_qcom_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
ufs_qcom_disable_lane_clks(host);
phy_power_off(phy);
+ /* reset the connected UFS device during power down */
+ ufs_qcom_device_reset_ctrl(hba, true);
+
} else if (!ufs_qcom_is_link_active(hba)) {
ufs_qcom_disable_lane_clks(host);
}
@@ -1421,10 +1435,10 @@ static int ufs_qcom_device_reset(struct ufs_hba *hba)
* The UFS device shall detect reset pulses of 1us, sleep for 10us to
* be on the safe side.
*/
- gpiod_set_value_cansleep(host->device_reset, 1);
+ ufs_qcom_device_reset_ctrl(hba, true);
usleep_range(10, 15);
- gpiod_set_value_cansleep(host->device_reset, 0);
+ ufs_qcom_device_reset_ctrl(hba, false);
usleep_range(10, 15);
return 0;
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
^ permalink raw reply related [flat|nested] 2+ messages in thread