summaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorMaxime Ripard <maxime.ripard@bootlin.com>2018-04-16 16:23:03 +0200
committerUlf Hansson <ulf.hansson@linaro.org>2018-05-02 15:08:42 +0200
commite27e1f3d04061ccc3735361554088cd7aa286e31 (patch)
tree5a87db2d8f61899eaf9f4e46caa113039a882167 /drivers/mmc
parentad04d9555da02c719de25b7d1e81ea8d0d2c4838 (diff)
downloadop-kernel-dev-e27e1f3d04061ccc3735361554088cd7aa286e31.zip
op-kernel-dev-e27e1f3d04061ccc3735361554088cd7aa286e31.tar.gz
mmc: sunxi: Move the card power configuration to a function
In order to improve readibility and reusability, let's move the card setup to a small function called by our .set_ios hook. Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/sunxi-mmc.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c
index 3c1ab46..0165da0 100644
--- a/drivers/mmc/host/sunxi-mmc.c
+++ b/drivers/mmc/host/sunxi-mmc.c
@@ -888,17 +888,15 @@ static void sunxi_mmc_set_clk(struct sunxi_mmc_host *host, struct mmc_ios *ios)
/* Android code had a usleep_range(50000, 55000); here */
}
-static void sunxi_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
+static void sunxi_mmc_card_power(struct sunxi_mmc_host *host,
+ struct mmc_ios *ios)
{
- struct sunxi_mmc_host *host = mmc_priv(mmc);
- u32 rval;
+ struct mmc_host *mmc = host->mmc;
- /* Set the power state */
switch (ios->power_mode) {
- case MMC_POWER_ON:
- break;
-
case MMC_POWER_UP:
+ dev_dbg(mmc_dev(mmc), "Powering card up\n");
+
if (!IS_ERR(mmc->supply.vmmc)) {
host->ferror = mmc_regulator_set_ocr(mmc,
mmc->supply.vmmc,
@@ -916,25 +914,37 @@ static void sunxi_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
}
host->vqmmc_enabled = true;
}
-
- host->ferror = sunxi_mmc_init_host(host);
- if (host->ferror)
- return;
-
- dev_dbg(mmc_dev(mmc), "power on!\n");
break;
case MMC_POWER_OFF:
- dev_dbg(mmc_dev(mmc), "power off!\n");
- sunxi_mmc_reset_host(host);
+ dev_dbg(mmc_dev(mmc), "Powering card off\n");
+
if (!IS_ERR(mmc->supply.vmmc))
mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
if (!IS_ERR(mmc->supply.vqmmc) && host->vqmmc_enabled)
regulator_disable(mmc->supply.vqmmc);
+
host->vqmmc_enabled = false;
break;
+
+ default:
+ dev_dbg(mmc_dev(mmc), "Ignoring unknown card power state\n");
+ break;
}
+}
+
+static void sunxi_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
+{
+ struct sunxi_mmc_host *host = mmc_priv(mmc);
+
+ if (ios->power_mode == MMC_POWER_OFF)
+ sunxi_mmc_reset_host(host);
+
+ sunxi_mmc_card_power(host, ios);
+
+ if (ios->power_mode == MMC_POWER_UP)
+ sunxi_mmc_init_host(host);
sunxi_mmc_set_bus_width(host, ios->bus_width);
sunxi_mmc_set_clk(host, ios);
OpenPOWER on IntegriCloud