[U-Boot,3/3] fsl_esdhc: Fix the voltage validation process

Submitted by Kumar Gala on Dec. 15, 2010, 8:20 a.m.

Details

Message ID 1292401217-21154-4-git-send-email-galak@kernel.crashing.org
State Accepted
Commit d42f60ffca51c02d7545c465ef488f0d796027e1
Headers show

Commit Message

Kumar Gala Dec. 15, 2010, 8:20 a.m.
From: Li Yang <leoli@freescale.com>

The current code use all the voltage range support by the host
controller to do the validation.  This will cause problem when
the host supports Low Voltage Range.  Change the validation
voltage to be based on board setup.

Signed-off-by: Li Yang <leoli@freescale.com>
---
 drivers/mmc/fsl_esdhc.c |   20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)

Comments

Stefano Babic Dec. 16, 2010, 5:41 p.m.
On 12/15/2010 09:20 AM, Kumar Gala wrote:
> From: Li Yang <leoli@freescale.com>
> 
> The current code use all the voltage range support by the host
> controller to do the validation.  This will cause problem when
> the host supports Low Voltage Range.  Change the validation
> voltage to be based on board setup.
> 
> Signed-off-by: Li Yang <leoli@freescale.com>
> ---

Tested-by: Stefano Babic <sbabic@denx.de>

Regards,
Stefano Babic

Patch hide | download patch | download mbox

diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c
index 7bab2f6..40b136c 100644
--- a/drivers/mmc/fsl_esdhc.c
+++ b/drivers/mmc/fsl_esdhc.c
@@ -444,7 +444,7 @@  int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
 {
 	struct fsl_esdhc *regs;
 	struct mmc *mmc;
-	u32 caps;
+	u32 caps, voltage_caps;
 
 	if (!cfg)
 		return -1;
@@ -462,14 +462,24 @@  int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
 	mmc->set_ios = esdhc_set_ios;
 	mmc->init = esdhc_init;
 
+	voltage_caps = 0;
 	caps = regs->hostcapblt;
-
 	if (caps & ESDHC_HOSTCAPBLT_VS18)
-		mmc->voltages |= MMC_VDD_165_195;
+		voltage_caps |= MMC_VDD_165_195;
 	if (caps & ESDHC_HOSTCAPBLT_VS30)
-		mmc->voltages |= MMC_VDD_29_30 | MMC_VDD_30_31;
+		voltage_caps |= MMC_VDD_29_30 | MMC_VDD_30_31;
 	if (caps & ESDHC_HOSTCAPBLT_VS33)
-		mmc->voltages |= MMC_VDD_32_33 | MMC_VDD_33_34;
+		voltage_caps |= MMC_VDD_32_33 | MMC_VDD_33_34;
+
+#ifdef CONFIG_SYS_SD_VOLTAGE
+	mmc->voltages = CONFIG_SYS_SD_VOLTAGE;
+#else
+	mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
+#endif
+	if ((mmc->voltages & voltage_caps) == 0) {
+		printf("voltage not supported by controller\n");
+		return -1;
+	}
 
 	mmc->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;