[PATCH 04/23] mmc: sdhci: re-factor sdhci_start_signal_voltage()
Dong Aisheng
aisheng.dong at nxp.com
Fri Apr 15 10:29:28 PDT 2016
Handle host and regulator signal voltage switch separately.
Move host signal voltage switch code into a separated function
sdhci_do_signal_voltage_switch() first, the following patches will
remove the regulator voltage switch code and use the common
mmc_regulator_set_vqmmc() instead.
Signed-off-by: Dong Aisheng <aisheng.dong at nxp.com>
---
drivers/mmc/host/sdhci.c | 97 ++++++++++++++++++++++++++++--------------------
1 file changed, 57 insertions(+), 40 deletions(-)
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 839aa4c..7f63f5d 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1657,19 +1657,10 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
spin_unlock_irqrestore(&host->lock, flags);
}
-static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc,
- struct mmc_ios *ios)
+static int sdhci_do_signal_voltage_switch(struct sdhci_host *host,
+ struct mmc_ios *ios)
{
- struct sdhci_host *host = mmc_priv(mmc);
u16 ctrl;
- int ret;
-
- /*
- * Signal Voltage Switching is only applicable for Host Controllers
- * v3.00 and above.
- */
- if (host->version < SDHCI_SPEC_300)
- return 0;
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
@@ -1679,15 +1670,6 @@ static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc,
ctrl &= ~SDHCI_CTRL_VDD_180;
sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
- if (!IS_ERR(mmc->supply.vqmmc)) {
- ret = regulator_set_voltage(mmc->supply.vqmmc, 2700000,
- 3600000);
- if (ret) {
- pr_warn("%s: Switching to 3.3V signalling voltage failed\n",
- mmc_hostname(mmc));
- return -EIO;
- }
- }
/* Wait for 5ms */
usleep_range(5000, 5500);
@@ -1697,20 +1679,10 @@ static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc,
return 0;
pr_warn("%s: 3.3V regulator output did not became stable\n",
- mmc_hostname(mmc));
+ mmc_hostname(host->mmc));
return -EAGAIN;
case MMC_SIGNAL_VOLTAGE_180:
- if (!IS_ERR(mmc->supply.vqmmc)) {
- ret = regulator_set_voltage(mmc->supply.vqmmc,
- 1700000, 1950000);
- if (ret) {
- pr_warn("%s: Switching to 1.8V signalling voltage failed\n",
- mmc_hostname(mmc));
- return -EIO;
- }
- }
-
/*
* Enable 1.8V Signal Enable in the Host Control2
* register
@@ -1728,18 +1700,63 @@ static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc,
return 0;
pr_warn("%s: 1.8V regulator output did not became stable\n",
- mmc_hostname(mmc));
+ mmc_hostname(host->mmc));
return -EAGAIN;
+ default:
+ /* No signal voltage switch required */
+ return 0;
+ }
+}
+
+static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc,
+ struct mmc_ios *ios)
+{
+ struct sdhci_host *host = mmc_priv(mmc);
+ int ret;
+
+ /*
+ * Signal Voltage Switching is only applicable for Host Controllers
+ * v3.00 and above.
+ */
+ if (host->version < SDHCI_SPEC_300)
+ return 0;
+
+ ret = sdhci_do_signal_voltage_switch(host, ios);
+ if (ret)
+ return ret;
+
+ if (IS_ERR(mmc->supply.vqmmc))
+ return 0;
+
+ switch (ios->signal_voltage) {
+ case MMC_SIGNAL_VOLTAGE_330:
+ ret = regulator_set_voltage(mmc->supply.vqmmc, 2700000,
+ 3600000);
+ if (ret) {
+ pr_warn("%s: Switching to 3.3V signalling voltage failed\n",
+ mmc_hostname(mmc));
+ return -EIO;
+ }
+
+ return 0;
+ case MMC_SIGNAL_VOLTAGE_180:
+ ret = regulator_set_voltage(mmc->supply.vqmmc,
+ 1700000, 1950000);
+ if (ret) {
+ pr_warn("%s: Switching to 1.8V signalling voltage failed\n",
+ mmc_hostname(mmc));
+ return -EIO;
+ }
+
+ return 0;
case MMC_SIGNAL_VOLTAGE_120:
- if (!IS_ERR(mmc->supply.vqmmc)) {
- ret = regulator_set_voltage(mmc->supply.vqmmc, 1100000,
- 1300000);
- if (ret) {
- pr_warn("%s: Switching to 1.2V signalling voltage failed\n",
- mmc_hostname(mmc));
- return -EIO;
- }
+ ret = regulator_set_voltage(mmc->supply.vqmmc, 1100000,
+ 1300000);
+ if (ret) {
+ pr_warn("%s: Switching to 1.2V signalling voltage failed\n",
+ mmc_hostname(mmc));
+ return -EIO;
}
return 0;
default:
--
1.9.1
More information about the linux-arm-kernel
mailing list