Commit 528db9e5 authored by Ziqi Chen's avatar Ziqi Chen Committed by Martin K. Petersen

scsi: ufs: core: Fix ufs clk specs violation

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.orgReviewed-by: default avatarCan Guo <cang@codeaurora.org>
Acked-by: default avatarAvri Altman <avri.altman@wdc.com>
Signed-off-by: default avatarZiqi Chen <ziqichen@codeaurora.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent dc0bfdb5
...@@ -8748,8 +8748,6 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) ...@@ -8748,8 +8748,6 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
if (ret) if (ret)
goto set_dev_active; goto set_dev_active;
ufshcd_vreg_set_lpm(hba);
disable_clks: disable_clks:
/* /*
* Call vendor specific suspend callback. As these callbacks may access * Call vendor specific suspend callback. As these callbacks may access
...@@ -8773,6 +8771,8 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) ...@@ -8773,6 +8771,8 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
hba->clk_gating.state); hba->clk_gating.state);
} }
ufshcd_vreg_set_lpm(hba);
/* Put the host controller in low power mode if possible */ /* Put the host controller in low power mode if possible */
ufshcd_hba_vreg_set_lpm(hba); ufshcd_hba_vreg_set_lpm(hba);
goto out; goto out;
...@@ -8840,18 +8840,18 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) ...@@ -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; old_link_state = hba->uic_link_state;
ufshcd_hba_vreg_set_hpm(hba); ufshcd_hba_vreg_set_hpm(hba);
ret = ufshcd_vreg_set_hpm(hba);
if (ret)
goto out;
/* Make sure clocks are enabled before accessing controller */ /* Make sure clocks are enabled before accessing controller */
ret = ufshcd_setup_clocks(hba, true); ret = ufshcd_setup_clocks(hba, true);
if (ret) if (ret)
goto out; goto disable_vreg;
/* enable the host irq as host controller would be active soon */ /* enable the host irq as host controller would be active soon */
ufshcd_enable_irq(hba); 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 * Call vendor specific resume callback. As these callbacks may access
* vendor specific host controller register space call them when the * 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) ...@@ -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); ret = ufshcd_vops_resume(hba, pm_op);
if (ret) if (ret)
goto disable_vreg; goto disable_irq_and_vops_clks;
/* For DeepSleep, the only supported option is to have the link off */ /* 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)); WARN_ON(ufshcd_is_ufs_dev_deepsleep(hba) && !ufshcd_is_link_off(hba));
...@@ -8926,8 +8926,6 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) ...@@ -8926,8 +8926,6 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
ufshcd_link_state_transition(hba, old_link_state, 0); ufshcd_link_state_transition(hba, old_link_state, 0);
vendor_suspend: vendor_suspend:
ufshcd_vops_suspend(hba, pm_op); ufshcd_vops_suspend(hba, pm_op);
disable_vreg:
ufshcd_vreg_set_lpm(hba);
disable_irq_and_vops_clks: disable_irq_and_vops_clks:
ufshcd_disable_irq(hba); ufshcd_disable_irq(hba);
if (hba->clk_scaling.is_allowed) if (hba->clk_scaling.is_allowed)
...@@ -8938,6 +8936,8 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) ...@@ -8938,6 +8936,8 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
trace_ufshcd_clk_gating(dev_name(hba->dev), trace_ufshcd_clk_gating(dev_name(hba->dev),
hba->clk_gating.state); hba->clk_gating.state);
} }
disable_vreg:
ufshcd_vreg_set_lpm(hba);
out: out:
hba->pm_op_in_progress = 0; hba->pm_op_in_progress = 0;
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment