Skip to content

Commit

Permalink
scsi: ufs: ufs-mediatek: Fix the timing of configuring device regulators
Browse files Browse the repository at this point in the history
Currently the LPM configurations of device regulators may not work since
VCC is not disabled yet while ufs_mtk_vreg_set_lpm() is executed.

Fix this by changing the timing of invoking ufs_mtk_vreg_set_lpm().

Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Stanley Chu <[email protected]>
Signed-off-by: Po-Wen Kao <[email protected]>
Signed-off-by: Stanley Chu <[email protected]>
Signed-off-by: Martin K. Petersen <[email protected]>
  • Loading branch information
powen-kao-mtk authored and martinkpetersen committed Jun 17, 2022
1 parent 3f9b6ce commit 3fd23b8
Showing 1 changed file with 53 additions and 5 deletions.
58 changes: 53 additions & 5 deletions drivers/ufs/host/ufs-mediatek.c
Original file line number Diff line number Diff line change
Expand Up @@ -1082,7 +1082,6 @@ static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
* ufshcd_suspend() re-enabling regulators while vreg is still
* in low-power mode.
*/
ufs_mtk_vreg_set_lpm(hba, true);
err = ufs_mtk_mphy_power_on(hba, false);
if (err)
goto fail;
Expand All @@ -1106,12 +1105,13 @@ static int ufs_mtk_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
{
int err;

if (hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL)
ufs_mtk_vreg_set_lpm(hba, false);

err = ufs_mtk_mphy_power_on(hba, true);
if (err)
goto fail;

ufs_mtk_vreg_set_lpm(hba, false);

if (ufshcd_is_link_hibern8(hba)) {
err = ufs_mtk_link_set_hpm(hba);
if (err)
Expand Down Expand Up @@ -1276,9 +1276,57 @@ static int ufs_mtk_remove(struct platform_device *pdev)
return 0;
}

int ufs_mtk_system_suspend(struct device *dev)
{
struct ufs_hba *hba = dev_get_drvdata(dev);
int ret;

ret = ufshcd_system_suspend(dev);
if (ret)
return ret;

ufs_mtk_vreg_set_lpm(hba, true);

return 0;
}

int ufs_mtk_system_resume(struct device *dev)
{
struct ufs_hba *hba = dev_get_drvdata(dev);

ufs_mtk_vreg_set_lpm(hba, false);

return ufshcd_system_resume(dev);
}

int ufs_mtk_runtime_suspend(struct device *dev)
{
struct ufs_hba *hba = dev_get_drvdata(dev);
int ret = 0;

ret = ufshcd_runtime_suspend(dev);
if (ret)
return ret;

ufs_mtk_vreg_set_lpm(hba, true);

return 0;
}

int ufs_mtk_runtime_resume(struct device *dev)
{
struct ufs_hba *hba = dev_get_drvdata(dev);

ufs_mtk_vreg_set_lpm(hba, false);

return ufshcd_runtime_resume(dev);
}

static const struct dev_pm_ops ufs_mtk_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(ufshcd_system_suspend, ufshcd_system_resume)
SET_RUNTIME_PM_OPS(ufshcd_runtime_suspend, ufshcd_runtime_resume, NULL)
SET_SYSTEM_SLEEP_PM_OPS(ufs_mtk_system_suspend,
ufs_mtk_system_resume)
SET_RUNTIME_PM_OPS(ufs_mtk_runtime_suspend,
ufs_mtk_runtime_resume, NULL)
.prepare = ufshcd_suspend_prepare,
.complete = ufshcd_resume_complete,
};
Expand Down

0 comments on commit 3fd23b8

Please sign in to comment.