mmc: core: Return 1 from mmc_regulator_set_vqmmc() if switch skipped
authorMarek Vasut <marex@denx.de>
Thu, 16 Apr 2020 16:36:48 +0000 (18:36 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Thu, 28 May 2020 09:20:58 +0000 (11:20 +0200)
Adjust mmc_regulator_set_vqmmc() to return 1 if the voltage switch was
skipped because the regulator voltage was already correct. This allows
drivers to detect such condition and possibly skip various voltage
switching extras.

Signed-off-by: Marek Vasut <marex@denx.de>
Link: https://lore.kernel.org/r/20200416163649.336967-2-marex@denx.de
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/core/regulator.c

index b6febbc..96b1d15 100644 (file)
@@ -136,6 +136,8 @@ static int mmc_regulator_set_voltage_if_supported(struct regulator *regulator,
                                                  int min_uV, int target_uV,
                                                  int max_uV)
 {
+       int current_uV;
+
        /*
         * Check if supported first to avoid errors since we may try several
         * signal levels during power up and don't want to show errors.
@@ -143,6 +145,14 @@ static int mmc_regulator_set_voltage_if_supported(struct regulator *regulator,
        if (!regulator_is_supported_voltage(regulator, min_uV, max_uV))
                return -EINVAL;
 
+       /*
+        * The voltage is already set, no need to switch.
+        * Return 1 to indicate that no switch happened.
+        */
+       current_uV = regulator_get_voltage(regulator);
+       if (current_uV == target_uV)
+               return 1;
+
        return regulator_set_voltage_triplet(regulator, min_uV, target_uV,
                                             max_uV);
 }
@@ -198,9 +208,10 @@ int mmc_regulator_set_vqmmc(struct mmc_host *mmc, struct mmc_ios *ios)
                 * voltage in two steps and try to stay close to vmmc
                 * with a 0.3V tolerance at first.
                 */
-               if (!mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc,
-                                               min_uV, volt, max_uV))
-                       return 0;
+               ret = mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc,
+                                                       min_uV, volt, max_uV);
+               if (ret >= 0)
+                       return ret;
 
                return mmc_regulator_set_voltage_if_supported(mmc->supply.vqmmc,
                                                2700000, volt, 3600000);