|
@@ -409,6 +409,59 @@ err_set_voltage:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int omap_hsmmc_disable_boot_regulator(struct regulator *reg)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (!reg)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (regulator_is_enabled(reg)) {
|
|
|
+ ret = regulator_enable(reg);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = regulator_disable(reg);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int omap_hsmmc_disable_boot_regulators(struct omap_hsmmc_host *host)
|
|
|
+{
|
|
|
+ struct mmc_host *mmc = host->mmc;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * disable regulators enabled during boot and get the usecount
|
|
|
+ * right so that regulators can be enabled/disabled by checking
|
|
|
+ * the return value of regulator_is_enabled
|
|
|
+ */
|
|
|
+ ret = omap_hsmmc_disable_boot_regulator(mmc->supply.vmmc);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(host->dev, "fail to disable boot enabled vmmc reg\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = omap_hsmmc_disable_boot_regulator(mmc->supply.vqmmc);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(host->dev,
|
|
|
+ "fail to disable boot enabled vmmc_aux reg\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = omap_hsmmc_disable_boot_regulator(host->pbias);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(host->dev,
|
|
|
+ "failed to disable boot enabled pbias reg\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
|
|
|
{
|
|
|
int ocr_value = 0;
|
|
@@ -456,17 +509,10 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
|
|
|
/* For eMMC do not power off when not in sleep state */
|
|
|
if (mmc_pdata(host)->no_regulator_off_init)
|
|
|
return 0;
|
|
|
- /*
|
|
|
- * To disable boot_on regulator, enable regulator
|
|
|
- * to increase usecount and then disable it.
|
|
|
- */
|
|
|
- if ((mmc->supply.vmmc && regulator_is_enabled(mmc->supply.vmmc) > 0) ||
|
|
|
- (mmc->supply.vqmmc && regulator_is_enabled(mmc->supply.vqmmc))) {
|
|
|
- int vdd = ffs(mmc_pdata(host)->ocr_mask) - 1;
|
|
|
|
|
|
- omap_hsmmc_set_power(host->dev, 1, vdd);
|
|
|
- omap_hsmmc_set_power(host->dev, 0, 0);
|
|
|
- }
|
|
|
+ ret = omap_hsmmc_disable_boot_regulators(host);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
|
|
|
return 0;
|
|
|
}
|