All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mmc: sdhci: Improve external VDD regulator support
@ 2014-06-25  7:25 Tim Kryger
  2014-06-25  9:49 ` Ulf Hansson
  0 siblings, 1 reply; 2+ messages in thread
From: Tim Kryger @ 2014-06-25  7:25 UTC (permalink / raw)
  To: Chris Ball, Ulf Hansson, Sachin Kamat; +Cc: Tim Kryger, linux-mmc, linux-kernel

A standard compliant SDHCI can itself supply VDD at 1.8, 3.0, or 3.3v.
Several vendors ignore this and instead rely upon external regulators
to supply VDD.  While the external regulators typically can supply one
of the standard SDHCI voltage levels, there is no real reason for this
to be a hard requirement.

This patch alters the SDHCI driver such that external VDD regulators
that provide voltages other than the three mentioned above may be used
so long as they can supply a voltage that meets the needs of the card.

In the case that an external VDD regulator is provided, it is reasonable
to ignore the voltage capabilities of the host controller and allow the
external regulator to set the OCR mask.  Additionally, there is no need
to convert a VDD voltage request into one of the standard SDHCI voltage
levels or program it in the host controller's power control register.

Signed-off-by: Tim Kryger <tim.kryger@gmail.com>
Tested-by: Sachin Kamat <spk.linux@gmail.com>
---

This change corrects a regression observed on Exynos platforms that was
triggered by "mmc: sdhci: Use mmc core regulator infrastucture"

https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg27101.html

 drivers/mmc/host/sdhci.c |   16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index c23a872..07a2426 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1226,6 +1226,13 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode,
 	struct mmc_host *mmc = host->mmc;
 	u8 pwr = 0;
 
+	if (!IS_ERR(mmc->supply.vmmc)) {
+		spin_unlock_irq(&host->lock);
+		mmc_regulator_set_ocr(host->mmc, mmc->supply.vmmc, vdd);
+		spin_lock_irq(&host->lock);
+		return;
+	}
+
 	if (mode != MMC_POWER_OFF) {
 		switch (1 << vdd) {
 		case MMC_VDD_165_195:
@@ -1284,12 +1291,6 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode,
 		if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER)
 			mdelay(10);
 	}
-
-	if (!IS_ERR(mmc->supply.vmmc)) {
-		spin_unlock_irq(&host->lock);
-		mmc_regulator_set_ocr(host->mmc, mmc->supply.vmmc, vdd);
-		spin_lock_irq(&host->lock);
-	}
 }
 
 /*****************************************************************************\
@@ -3092,8 +3093,9 @@ int sdhci_add_host(struct sdhci_host *host)
 				   SDHCI_MAX_CURRENT_MULTIPLIER;
 	}
 
+	/* If OCR set by external regulators, use it instead */
 	if (mmc->ocr_avail)
-		ocr_avail &= mmc->ocr_avail;
+		ocr_avail = mmc->ocr_avail;
 
 	if (host->ocr_mask)
 		ocr_avail &= host->ocr_mask;
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] mmc: sdhci: Improve external VDD regulator support
  2014-06-25  7:25 [PATCH] mmc: sdhci: Improve external VDD regulator support Tim Kryger
@ 2014-06-25  9:49 ` Ulf Hansson
  0 siblings, 0 replies; 2+ messages in thread
From: Ulf Hansson @ 2014-06-25  9:49 UTC (permalink / raw)
  To: Tim Kryger; +Cc: Chris Ball, Sachin Kamat, linux-mmc, linux-kernel

On 25/06/2014, Tim Kryger <tim.kryger@gmail.com> wrote:
> A standard compliant SDHCI can itself supply VDD at 1.8, 3.0, or 3.3v.
> Several vendors ignore this and instead rely upon external regulators
> to supply VDD.  While the external regulators typically can supply one
> of the standard SDHCI voltage levels, there is no real reason for this
> to be a hard requirement.
>
> This patch alters the SDHCI driver such that external VDD regulators
> that provide voltages other than the three mentioned above may be used
> so long as they can supply a voltage that meets the needs of the card.
>
> In the case that an external VDD regulator is provided, it is reasonable
> to ignore the voltage capabilities of the host controller and allow the
> external regulator to set the OCR mask.  Additionally, there is no need
> to convert a VDD voltage request into one of the standard SDHCI voltage
> levels or program it in the host controller's power control register.
>
> Signed-off-by: Tim Kryger <tim.kryger@gmail.com>
> Tested-by: Sachin Kamat <spk.linux@gmail.com>

Thanks! Applied for next.

Kind regards
Uffe

> ---
>
> This change corrects a regression observed on Exynos platforms that was
> triggered by "mmc: sdhci: Use mmc core regulator infrastucture"
>
> https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg27101.html
>
>  drivers/mmc/host/sdhci.c |   16 +++++++++-------
>  1 file changed, 9 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index c23a872..07a2426 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -1226,6 +1226,13 @@ static void sdhci_set_power(struct sdhci_host *host,
> unsigned char mode,
>  	struct mmc_host *mmc = host->mmc;
>  	u8 pwr = 0;
>
> +	if (!IS_ERR(mmc->supply.vmmc)) {
> +		spin_unlock_irq(&host->lock);
> +		mmc_regulator_set_ocr(host->mmc, mmc->supply.vmmc, vdd);
> +		spin_lock_irq(&host->lock);
> +		return;
> +	}
> +
>  	if (mode != MMC_POWER_OFF) {
>  		switch (1 << vdd) {
>  		case MMC_VDD_165_195:
> @@ -1284,12 +1291,6 @@ static void sdhci_set_power(struct sdhci_host *host,
> unsigned char mode,
>  		if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER)
>  			mdelay(10);
>  	}
> -
> -	if (!IS_ERR(mmc->supply.vmmc)) {
> -		spin_unlock_irq(&host->lock);
> -		mmc_regulator_set_ocr(host->mmc, mmc->supply.vmmc, vdd);
> -		spin_lock_irq(&host->lock);
> -	}
>  }
>
> /*****************************************************************************\
> @@ -3092,8 +3093,9 @@ int sdhci_add_host(struct sdhci_host *host)
>  				   SDHCI_MAX_CURRENT_MULTIPLIER;
>  	}
>
> +	/* If OCR set by external regulators, use it instead */
>  	if (mmc->ocr_avail)
> -		ocr_avail &= mmc->ocr_avail;
> +		ocr_avail = mmc->ocr_avail;
>
>  	if (host->ocr_mask)
>  		ocr_avail &= host->ocr_mask;
> --
> 1.7.9.5
>
>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-06-25  9:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-25  7:25 [PATCH] mmc: sdhci: Improve external VDD regulator support Tim Kryger
2014-06-25  9:49 ` Ulf Hansson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.