scsi: ufs: core: Fix ufs clk specs violation
authorZiqi Chen <ziqichen@codeaurora.org>
Fri, 8 Jan 2021 10:56:24 +0000 (18:56 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 13 Jan 2021 04:37:34 +0000 (23:37 -0500)
According to the spec (JESD220E chapter 7.2), while powering off/on the ufs
device, REF_CLK signal should be between VSS(Ground) and VCCQ/VCCQ2.

Link: https://lore.kernel.org/r/1610103385-45755-2-git-send-email-ziqichen@codeaurora.org
Reviewed-by: Can Guo <cang@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>
drivers/scsi/ufs/ufshcd.c

index c6559e9..1701929 100644 (file)
@@ -8748,8 +8748,6 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
        if (ret)
                goto set_dev_active;
 
-       ufshcd_vreg_set_lpm(hba);
-
 disable_clks:
        /*
         * Call vendor specific suspend callback. As these callbacks may access
@@ -8773,6 +8771,8 @@ disable_clks:
                                        hba->clk_gating.state);
        }
 
+       ufshcd_vreg_set_lpm(hba);
+
        /* Put the host controller in low power mode if possible */
        ufshcd_hba_vreg_set_lpm(hba);
        goto out;
@@ -8840,18 +8840,18 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
        old_link_state = hba->uic_link_state;
 
        ufshcd_hba_vreg_set_hpm(hba);
+       ret = ufshcd_vreg_set_hpm(hba);
+       if (ret)
+               goto out;
+
        /* Make sure clocks are enabled before accessing controller */
        ret = ufshcd_setup_clocks(hba, true);
        if (ret)
-               goto out;
+               goto disable_vreg;
 
        /* enable the host irq as host controller would be active soon */
        ufshcd_enable_irq(hba);
 
-       ret = ufshcd_vreg_set_hpm(hba);
-       if (ret)
-               goto disable_irq_and_vops_clks;
-
        /*
         * Call vendor specific resume callback. As these callbacks may access
         * vendor specific host controller register space call them when the
@@ -8859,7 +8859,7 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
         */
        ret = ufshcd_vops_resume(hba, pm_op);
        if (ret)
-               goto disable_vreg;
+               goto disable_irq_and_vops_clks;
 
        /* For DeepSleep, the only supported option is to have the link off */
        WARN_ON(ufshcd_is_ufs_dev_deepsleep(hba) && !ufshcd_is_link_off(hba));
@@ -8926,8 +8926,6 @@ set_old_link_state:
        ufshcd_link_state_transition(hba, old_link_state, 0);
 vendor_suspend:
        ufshcd_vops_suspend(hba, pm_op);
-disable_vreg:
-       ufshcd_vreg_set_lpm(hba);
 disable_irq_and_vops_clks:
        ufshcd_disable_irq(hba);
        if (hba->clk_scaling.is_allowed)
@@ -8938,6 +8936,8 @@ disable_irq_and_vops_clks:
                trace_ufshcd_clk_gating(dev_name(hba->dev),
                                        hba->clk_gating.state);
        }
+disable_vreg:
+       ufshcd_vreg_set_lpm(hba);
 out:
        hba->pm_op_in_progress = 0;
        if (ret)