]> git.hungrycats.org Git - linux/commitdiff
scsi: ufs: exynos: Fix hibern8 notify callbacks
authorPeter Griffin <peter.griffin@linaro.org>
Thu, 31 Oct 2024 15:00:31 +0000 (15:00 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 9 Dec 2024 09:41:06 +0000 (10:41 +0100)
commit ceef938bbf8b93ba3a218b4adc244cde94b582aa upstream.

v1 of the patch which introduced the ufshcd_vops_hibern8_notify()
callback used a bool instead of an enum. In v2 this was updated to an
enum based on the review feedback in [1].

ufs-exynos hibernate calls have always been broken upstream as it
follows the v1 bool implementation.

Link: https://patchwork.kernel.org/project/linux-scsi/patch/001f01d23994$719997c0$54ccc740$@samsung.com/
Fixes: 55f4b1f73631 ("scsi: ufs: ufs-exynos: Add UFS host support for Exynos SoCs")
Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
Link: https://lore.kernel.org/r/20241031150033.3440894-13-peter.griffin@linaro.org
Cc: stable@vger.kernel.org
Reviewed-by: Tudor Ambarus <tudor.ambarus@linaro.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/ufs/host/ufs-exynos.c

index d198e8aad7c8d539a66298cc8369c1945b682913..fb550a7c16b34b6f2977fe744125b851a5027734 100644 (file)
@@ -1487,12 +1487,12 @@ static void exynos_ufs_dev_hw_reset(struct ufs_hba *hba)
        hci_writel(ufs, 1 << 0, HCI_GPIO_OUT);
 }
 
-static void exynos_ufs_pre_hibern8(struct ufs_hba *hba, u8 enter)
+static void exynos_ufs_pre_hibern8(struct ufs_hba *hba, enum uic_cmd_dme cmd)
 {
        struct exynos_ufs *ufs = ufshcd_get_variant(hba);
        struct exynos_ufs_uic_attr *attr = ufs->drv_data->uic_attr;
 
-       if (!enter) {
+       if (cmd == UIC_CMD_DME_HIBER_EXIT) {
                if (ufs->opts & EXYNOS_UFS_OPT_BROKEN_AUTO_CLK_CTRL)
                        exynos_ufs_disable_auto_ctrl_hcc(ufs);
                exynos_ufs_ungate_clks(ufs);
@@ -1520,11 +1520,11 @@ static void exynos_ufs_pre_hibern8(struct ufs_hba *hba, u8 enter)
        }
 }
 
-static void exynos_ufs_post_hibern8(struct ufs_hba *hba, u8 enter)
+static void exynos_ufs_post_hibern8(struct ufs_hba *hba, enum uic_cmd_dme cmd)
 {
        struct exynos_ufs *ufs = ufshcd_get_variant(hba);
 
-       if (!enter) {
+       if (cmd == UIC_CMD_DME_HIBER_EXIT) {
                u32 cur_mode = 0;
                u32 pwrmode;
 
@@ -1543,7 +1543,7 @@ static void exynos_ufs_post_hibern8(struct ufs_hba *hba, u8 enter)
 
                if (!(ufs->opts & EXYNOS_UFS_OPT_SKIP_CONNECTION_ESTAB))
                        exynos_ufs_establish_connt(ufs);
-       } else {
+       } else if (cmd == UIC_CMD_DME_HIBER_ENTER) {
                ufs->entry_hibern8_t = ktime_get();
                exynos_ufs_gate_clks(ufs);
                if (ufs->opts & EXYNOS_UFS_OPT_BROKEN_AUTO_CLK_CTRL)
@@ -1630,15 +1630,15 @@ static int exynos_ufs_pwr_change_notify(struct ufs_hba *hba,
 }
 
 static void exynos_ufs_hibern8_notify(struct ufs_hba *hba,
-                                    enum uic_cmd_dme enter,
+                                    enum uic_cmd_dme cmd,
                                     enum ufs_notify_change_status notify)
 {
        switch ((u8)notify) {
        case PRE_CHANGE:
-               exynos_ufs_pre_hibern8(hba, enter);
+               exynos_ufs_pre_hibern8(hba, cmd);
                break;
        case POST_CHANGE:
-               exynos_ufs_post_hibern8(hba, enter);
+               exynos_ufs_post_hibern8(hba, cmd);
                break;
        }
 }