On 15/04/16 20:29, Dong Aisheng wrote: > 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. You have changed the order that things are done. There is no way to know what that will break, so let's not do that. What about just changing regulator_set_voltage() to mmc_regulator_set_vqmmc()? > > Signed-off-by: Dong Aisheng <aisheng.dong@xxxxxxx> > --- > 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: > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html