]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: ufs: exynos: gs101: Put UFS device in reset on .suspend()
authorPeter Griffin <peter.griffin@linaro.org>
Wed, 19 Mar 2025 15:30:24 +0000 (15:30 +0000)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 3 Apr 2025 13:53:51 +0000 (09:53 -0400)
GPIO_OUT[0] is connected to the reset pin of embedded UFS device.
Before powering off the phy assert the reset signal.

This is added as a gs101 specific suspend hook so as not to have any
unintended consequences for other SoCs supported by this driver.

Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
Link: https://lore.kernel.org/r/20250319-exynos-ufs-stability-fixes-v2-7-96722cc2ba1b@linaro.org
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/host/ufs-exynos.c
drivers/ufs/host/ufs-exynos.h

index b9fbc78be74ee80eadefa4fd76a13d6ba64c6667..2436b9454480b01e719157768a9dc4c3a082c6fc 100644 (file)
@@ -1700,6 +1700,12 @@ static void exynos_ufs_hibern8_notify(struct ufs_hba *hba,
        }
 }
 
+static int gs101_ufs_suspend(struct exynos_ufs *ufs)
+{
+       hci_writel(ufs, 0 << 0, HCI_GPIO_OUT);
+       return 0;
+}
+
 static int exynos_ufs_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
        enum ufs_notify_change_status status)
 {
@@ -1708,6 +1714,9 @@ static int exynos_ufs_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
        if (status == PRE_CHANGE)
                return 0;
 
+       if (ufs->drv_data->suspend)
+               ufs->drv_data->suspend(ufs);
+
        if (!ufshcd_is_link_active(hba))
                phy_power_off(ufs->phy);
 
@@ -2170,6 +2179,7 @@ static const struct exynos_ufs_drv_data gs101_ufs_drvs = {
        .pre_link               = gs101_ufs_pre_link,
        .post_link              = gs101_ufs_post_link,
        .pre_pwr_change         = gs101_ufs_pre_pwr_change,
+       .suspend                = gs101_ufs_suspend,
 };
 
 static const struct of_device_id exynos_ufs_of_match[] = {
index d0b3df221503c61d88702873054cec99139e049a..3c6fe5132190abcd4b31186a13142a44ba0dce7b 100644 (file)
@@ -192,6 +192,7 @@ struct exynos_ufs_drv_data {
                                struct ufs_pa_layer_attr *pwr);
        int (*pre_hce_enable)(struct exynos_ufs *ufs);
        int (*post_hce_enable)(struct exynos_ufs *ufs);
+       int (*suspend)(struct exynos_ufs *ufs);
 };
 
 struct ufs_phy_time_cfg {