aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@nokia.com>2010-02-15 13:03:34 -0500
committerTony Lindgren <tony@atomide.com>2010-02-15 13:03:34 -0500
commite0eb2424469ec2333885672d3db8bd07d322455d (patch)
tree987a225999bbed33b1f456ccdf56fd10ed574019 /drivers/mmc
parent6da20c89af64b75302399369a90b9d50c1a87665 (diff)
omap_hsmmc: Allow for a shared VccQ
EMMC can have two voltage supplies, Vcc and VccQ which are implemented in the code as consumer supplies vmmc and vmmc_aux. If the regulator that supplies vmmc_aux is shared with other consumers, then sending it to sleep will disrupt those consumers. However, the TWL4030-family regulators may have OFF remapped to SLEEP, in which case 'regulator_disable()' will put the regulator to sleep only when all consumers are disabled - which is the desired behaviour. This patch adds a platform data field to allow that option. Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/omap_hsmmc.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index d2fad587f371..af374771bed0 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -347,7 +347,14 @@ static int omap_hsmmc_23_set_sleep(struct device *dev, int slot, int sleep,
347 err = regulator_set_mode(host->vcc, mode); 347 err = regulator_set_mode(host->vcc, mode);
348 if (err) 348 if (err)
349 return err; 349 return err;
350 return regulator_set_mode(host->vcc_aux, mode); 350
351 if (!mmc_slot(host).vcc_aux_disable_is_sleep)
352 return regulator_set_mode(host->vcc_aux, mode);
353
354 if (sleep)
355 return regulator_disable(host->vcc_aux);
356 else
357 return regulator_enable(host->vcc_aux);
351} 358}
352 359
353static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata) 360static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata)
@@ -1982,6 +1989,13 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
1982 else 1989 else
1983 mmc->ops = &omap_hsmmc_ops; 1990 mmc->ops = &omap_hsmmc_ops;
1984 1991
1992 /*
1993 * If regulator_disable can only put vcc_aux to sleep then there is
1994 * no off state.
1995 */
1996 if (mmc_slot(host).vcc_aux_disable_is_sleep)
1997 mmc_slot(host).no_off = 1;
1998
1985 mmc->f_min = 400000; 1999 mmc->f_min = 400000;
1986 mmc->f_max = 52000000; 2000 mmc->f_max = 52000000;
1987 2001