]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
scsi: ufs: ufs-mediatek: support linkoff state during suspend
authorStanley Chu <stanley.chu@mediatek.com>
Wed, 29 Jan 2020 10:52:49 +0000 (18:52 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 11 Feb 2020 03:46:54 +0000 (22:46 -0500)
If system suspend or runtime suspend mode is configured as linkoff state,
phy can be powered off and reference clock can be gated in MediaTek
Chipsets.

At the same time, remove redundant reference clock control in suspend and
resume callbacks because such control can be well-handled in setup_clocks
callback.

Link: https://lore.kernel.org/r/20200129105251.12466-3-stanley.chu@mediatek.com
Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
Reviewed-by: Bean Huo <beanhuo@micron.com>
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufs-mediatek.c

index 7ac838cc15d16a3cb6787f19d4ccc6c5595b754f..d78897a1490542232bf4687a74262ea8c5bb1dc6 100644 (file)
@@ -167,7 +167,7 @@ static int ufs_mtk_setup_clocks(struct ufs_hba *hba, bool on,
 
        switch (status) {
        case PRE_CHANGE:
-               if (!on) {
+               if (!on && !ufshcd_is_link_active(hba)) {
                        ufs_mtk_setup_ref_clk(hba, on);
                        ret = phy_power_off(host->mphy);
                }
@@ -437,10 +437,11 @@ static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
                err = ufs_mtk_link_set_lpm(hba);
                if (err)
                        return -EAGAIN;
-               phy_power_off(host->mphy);
-               ufs_mtk_setup_ref_clk(hba, false);
        }
 
+       if (!ufshcd_is_link_active(hba))
+               phy_power_off(host->mphy);
+
        return 0;
 }
 
@@ -449,9 +450,10 @@ static int ufs_mtk_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
        struct ufs_mtk_host *host = ufshcd_get_variant(hba);
        int err;
 
-       if (ufshcd_is_link_hibern8(hba)) {
-               ufs_mtk_setup_ref_clk(hba, true);
+       if (!ufshcd_is_link_active(hba))
                phy_power_on(host->mphy);
+
+       if (ufshcd_is_link_hibern8(hba)) {
                err = ufs_mtk_link_set_hpm(hba);
                if (err)
                        return err;