scsi: ufs: ufs-mediatek: Support low-power mode for VCCQ
authorPeter Wang <peter.wang@mediatek.com>
Thu, 16 Jun 2022 05:37:20 +0000 (13:37 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 17 Jun 2022 02:08:43 +0000 (22:08 -0400)
Allow VCCQ to enter low-power mode, and also remove the restriction of VCC
because VCCQ/VCCQ2 can be changed to low-power mode even if VCC stays on
while the device is not in active power mode.

Link: https://lore.kernel.org/r/20220616053725.5681-7-stanley.chu@mediatek.com
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/host/ufs-mediatek.c

index 03762ec..65a2a41 100644 (file)
@@ -1031,7 +1031,13 @@ static int ufs_mtk_link_set_lpm(struct ufs_hba *hba)
 
 static void ufs_mtk_vreg_set_lpm(struct ufs_hba *hba, bool lpm)
 {
-       if (!hba->vreg_info.vccq2 || !hba->vreg_info.vcc)
+       struct ufs_vreg *vccqx = NULL;
+
+       if (!hba->vreg_info.vccq && !hba->vreg_info.vccq2)
+               return;
+
+       /* Skip if VCC is assumed always-on */
+       if (!hba->vreg_info.vcc)
                return;
 
        /* Bypass LPM when device is still active */
@@ -1042,12 +1048,13 @@ static void ufs_mtk_vreg_set_lpm(struct ufs_hba *hba, bool lpm)
        if (lpm && hba->vreg_info.vcc->enabled)
                return;
 
-       if (lpm)
-               regulator_set_mode(hba->vreg_info.vccq2->reg,
-                                  REGULATOR_MODE_IDLE);
+       if (hba->vreg_info.vccq)
+               vccqx = hba->vreg_info.vccq;
        else
-               regulator_set_mode(hba->vreg_info.vccq2->reg,
-                                  REGULATOR_MODE_NORMAL);
+               vccqx = hba->vreg_info.vccq2;
+
+       regulator_set_mode(vccqx->reg,
+                          lpm ? REGULATOR_MODE_IDLE : REGULATOR_MODE_NORMAL);
 }
 
 static void ufs_mtk_auto_hibern8_disable(struct ufs_hba *hba)