[PATCH 04/23] mmc: sdhci: re-factor sdhci_start_signal_voltage()
Adrian Hunter
adrian.hunter at intel.com
Fri Apr 22 04:43:26 PDT 2016
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 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:
>
More information about the linux-arm-kernel
mailing list