@@ -888,6 +888,37 @@ static void sunxi_mmc_power_on(struct mmc_host *mmc, struct mmc_ios *ios)
/* Android code had a usleep_range(50000, 55000); here */
}
+static void sunxi_mmc_power_up(struct mmc_host *mmc, struct mmc_ios *ios)
+{
+ struct sunxi_mmc_host *host = mmc_priv(mmc);
+
+ dev_dbg(mmc_dev(mmc), "Powering up\n");
+
+ if (!IS_ERR(mmc->supply.vmmc)) {
+ host->ferror = mmc_regulator_set_ocr(mmc,
+ mmc->supply.vmmc,
+ ios->vdd);
+ if (host->ferror)
+ return;
+ }
+
+ if (!IS_ERR(mmc->supply.vqmmc)) {
+ host->ferror = regulator_enable(mmc->supply.vqmmc);
+ if (host->ferror) {
+ dev_err(mmc_dev(mmc),
+ "failed to enable vqmmc\n");
+ return;
+ }
+ host->vqmmc_enabled = true;
+ }
+
+ host->ferror = sunxi_mmc_init_host(mmc);
+ if (host->ferror)
+ return;
+
+ sunxi_mmc_power_on(mmc, ios);
+}
+
static void sunxi_mmc_power_off(struct mmc_host *mmc, struct mmc_ios *ios)
{
struct sunxi_mmc_host *host = mmc_priv(mmc);
@@ -906,45 +937,20 @@ static void sunxi_mmc_power_off(struct mmc_host *mmc, struct mmc_ios *ios)
static void sunxi_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
{
- struct sunxi_mmc_host *host = mmc_priv(mmc);
-
/* Set the power state */
switch (ios->power_mode) {
case MMC_POWER_ON:
+ sunxi_mmc_power_on(mmc, ios);
break;
case MMC_POWER_UP:
- if (!IS_ERR(mmc->supply.vmmc)) {
- host->ferror = mmc_regulator_set_ocr(mmc,
- mmc->supply.vmmc,
- ios->vdd);
- if (host->ferror)
- return;
- }
-
- if (!IS_ERR(mmc->supply.vqmmc)) {
- host->ferror = regulator_enable(mmc->supply.vqmmc);
- if (host->ferror) {
- dev_err(mmc_dev(mmc),
- "failed to enable vqmmc\n");
- return;
- }
- host->vqmmc_enabled = true;
- }
-
- host->ferror = sunxi_mmc_init_host(mmc);
- if (host->ferror)
- return;
-
- dev_dbg(mmc_dev(mmc), "power on!\n");
+ sunxi_mmc_power_up(mmc, ios);
break;
case MMC_POWER_OFF:
sunxi_mmc_power_off(mmc, ios);
break;
}
-
- sunxi_mmc_power_on(mmc, ios);
}
static int sunxi_mmc_volt_switch(struct mmc_host *mmc, struct mmc_ios *ios)
We'll need to have the power up behaviour in order to implement runtime_pm. Move it outside of the .set_ios callback for an easier access. And it improves readibility as a bonus. Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> --- drivers/mmc/host/sunxi-mmc.c | 60 ++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 27 deletions(-)