From: Peter Wang <peter.wang@xxxxxxxxxxxx> After ufshcd_wl_shutdown set device poweroff and link off, ufshcd_shutdown not turn off regulators/clocks. Correct the flow to wait ufshcd_wl_shutdown done and turn off regulators/clocks by polling ufs device/link state 500ms. Also remove pm_runtime_get_sync because it is unnecessary. Signed-off-by: Peter Wang <peter.wang@xxxxxxxxxxxx> --- drivers/ufs/core/ufshcd.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index c7b337480e3e..1c11af48b584 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -9461,10 +9461,14 @@ EXPORT_SYMBOL(ufshcd_runtime_resume); */ int ufshcd_shutdown(struct ufs_hba *hba) { - if (ufshcd_is_ufs_dev_poweroff(hba) && ufshcd_is_link_off(hba)) - goto out; + ktime_t timeout = ktime_add_ms(ktime_get(), 500); - pm_runtime_get_sync(hba->dev); + /* Wait ufshcd_wl_shutdown clear ufs state, timeout 500 ms */ + while (!ufshcd_is_ufs_dev_poweroff(hba) || !ufshcd_is_link_off(hba)) { + if (ktime_after(ktime_get(), timeout)) + goto out; + msleep(1); + } ufshcd_suspend(hba); out: -- 2.18.0