mmc: enable/disable VQMMC regulator only during MMC power cycle
authorKaustabh Chakraborty <kauschluss@disroot.org>
Fri, 17 Oct 2025 15:24:11 +0000 (20:54 +0530)
committerPeng Fan <peng.fan@nxp.com>
Thu, 30 Oct 2025 02:11:17 +0000 (10:11 +0800)
Disrupting the regulator voltage during ios configuration messes with
the MMC initialization sequence. Move the VQMMC regulator enable/disable
functions to the MMC power cycle function, similar to how its done for
the VMMC regulator.

Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
drivers/mmc/dw_mmc.c
drivers/mmc/mmc.c

index 9b143f9..f3c0cc5 100644 (file)
@@ -644,20 +644,12 @@ static int dwmci_set_ios(struct mmc *mmc)
        if (mmc->vqmmc_supply) {
                int ret;
 
-               ret = regulator_set_enable_if_allowed(mmc->vqmmc_supply, false);
-               if (ret)
-                       return ret;
-
                if (mmc->signal_voltage == MMC_SIGNAL_VOLTAGE_180)
                        ret = regulator_set_value(mmc->vqmmc_supply, 1800000);
                else
                        ret = regulator_set_value(mmc->vqmmc_supply, 3300000);
                if (ret && ret != -ENOSYS)
                        return ret;
-
-               ret = regulator_set_enable_if_allowed(mmc->vqmmc_supply, true);
-               if (ret)
-                       return ret;
        }
 #endif
 
index ec61ed9..0f07955 100644 (file)
@@ -2844,6 +2844,16 @@ static int mmc_power_on(struct mmc *mmc)
                        return ret;
                }
        }
+
+       if (mmc->vqmmc_supply) {
+               int ret = regulator_set_enable_if_allowed(mmc->vqmmc_supply,
+                                                         true);
+
+               if (ret && ret != -ENOSYS) {
+                       printf("Error enabling VQMMC supply : %d\n", ret);
+                       return ret;
+               }
+       }
 #endif
        return 0;
 }
@@ -2861,6 +2871,16 @@ static int mmc_power_off(struct mmc *mmc)
                        return ret;
                }
        }
+
+       if (mmc->vqmmc_supply) {
+               int ret = regulator_set_enable_if_allowed(mmc->vqmmc_supply,
+                                                         false);
+
+               if (ret && ret != -ENOSYS) {
+                       pr_debug("Error disabling VQMMC supply : %d\n", ret);
+                       return ret;
+               }
+       }
 #endif
        return 0;
 }