]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: ufs-qcom: Fix ufs RST_n spec violation
authorZiqi Chen <ziqichen@codeaurora.org>
Fri, 8 Jan 2021 10:56:25 +0000 (18:56 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 16 Jun 2024 11:32:03 +0000 (13:32 +0200)
[ Upstream commit b61d0414136853fc38898829cde837ce5d691a9a ]

According to the spec (JESD220E chapter 7.2), while powering off/on the ufs
device, RST_n signal should be between VSS(Ground) and VCCQ/VCCQ2.

Link: https://lore.kernel.org/r/1610103385-45755-3-git-send-email-ziqichen@codeaurora.org
Acked-by: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Ziqi Chen <ziqichen@codeaurora.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Stable-dep-of: a862fafa263a ("scsi: ufs: qcom: Perform read back after writing REG_UFS_SYS1CLK_1US")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/ufs/ufs-qcom.c

index 08331ecbe91fbce88a895f9743d9ba0a12d93694..a432c561c3df053540d8a74343a850164be7f337 100644 (file)
@@ -578,6 +578,17 @@ out:
        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);
@@ -592,6 +603,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);
        }
@@ -1441,10 +1455,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;