[PATCH v2 4/8] mmc: sunxi: Move the power up action in a separate function

Maxime Ripard maxime.ripard at bootlin.com
Thu Mar 8 06:52:50 PST 2018


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 at bootlin.com>
---
 drivers/mmc/host/sunxi-mmc.c | 60 ++++++++++++++++++++-----------------
 1 file changed, 33 insertions(+), 27 deletions(-)

diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c
index 4e81fe171532..e4b44c4adb8f 100644
--- a/drivers/mmc/host/sunxi-mmc.c
+++ b/drivers/mmc/host/sunxi-mmc.c
@@ -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)
-- 
git-series 0.9.1



More information about the linux-arm-kernel mailing list