aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRajendra Nayak <rnayak@ti.com>2012-03-12 11:02:38 -0400
committerChris Ball <cjb@laptop.org>2012-03-27 12:20:10 -0400
commit1f84b71b3fa834faa87e14c8dc5d5a7c1fa084e8 (patch)
treeb9420efe025dfebdb01907a459fdd6c82c6f87cd /drivers
parent46856a68dcb5f67c779d211fd6bcb5d7a2a7f19b (diff)
mmc: omap_hsmmc: Avoid a regulator voltage change with dt
When booting with Device tree, the omap_hsmmc driver does not program the pbias cell (inside OMAP control module) during a regulator voltage change. In case of non-dt boot, this is handled using callbacks from within platform_data and implemented in machine code. To be able to do this with device tree, without invoking any machine code, a OMAP control module driver is needed which is yet missing. The pbias cell is used to provide a 1.8v or 3.0v reference to the mmc/sd/sdio1 interface supporting both 1.8v and 3.0v voltages. Until a OMAP control module driver is available to handle this, when booting with a device tree blob, never change the regulator voltage which might then require a pbias cell re-program. There are 2 instances where in the mmc regulator voltage can be changed. -1- when the regulator is turned OFF. -2- when attempting a switch to 1.8v from 3.0v for dual volt cards This patch avoids a voltage change in both cases when booting from device tree, and hence compromises on power savings. Once the OMAP control module driver is available and hsmmc driver is modified to then do pbias programming even when booting with device tree, these limitaions can be removed to achieve better power savings. Signed-off-by: Rajendra Nayak <rnayak@ti.com> Tested-by: Balaji T K <balajitk@ti.com> Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/host/omap_hsmmc.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index e0808d4a7681..47adb161d3ad 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -244,6 +244,13 @@ static int omap_hsmmc_set_power(struct device *dev, int slot, int power_on,
244 */ 244 */
245 if (!host->vcc) 245 if (!host->vcc)
246 return 0; 246 return 0;
247 /*
248 * With DT, never turn OFF the regulator. This is because
249 * the pbias cell programming support is still missing when
250 * booting with Device tree
251 */
252 if (of_have_populated_dt() && !vdd)
253 return 0;
247 254
248 if (mmc_slot(host).before_set_reg) 255 if (mmc_slot(host).before_set_reg)
249 mmc_slot(host).before_set_reg(dev, slot, power_on, vdd); 256 mmc_slot(host).before_set_reg(dev, slot, power_on, vdd);
@@ -1536,7 +1543,13 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1536 * of external transceiver; but they all handle 1.8V. 1543 * of external transceiver; but they all handle 1.8V.
1537 */ 1544 */
1538 if ((OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET) && 1545 if ((OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET) &&
1539 (ios->vdd == DUAL_VOLT_OCR_BIT)) { 1546 (ios->vdd == DUAL_VOLT_OCR_BIT) &&
1547 /*
1548 * With pbias cell programming missing, this
1549 * can't be allowed when booting with device
1550 * tree.
1551 */
1552 (!of_have_populated_dt())) {
1540 /* 1553 /*
1541 * The mmc_select_voltage fn of the core does 1554 * The mmc_select_voltage fn of the core does
1542 * not seem to set the power_mode to 1555 * not seem to set the power_mode to