diff options
author | Adrian Hunter <adrian.hunter@nokia.com> | 2010-02-15 13:03:34 -0500 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2010-02-15 13:03:34 -0500 |
commit | e0eb2424469ec2333885672d3db8bd07d322455d (patch) | |
tree | 987a225999bbed33b1f456ccdf56fd10ed574019 /drivers/mmc | |
parent | 6da20c89af64b75302399369a90b9d50c1a87665 (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.c | 16 |
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 | ||
353 | static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata) | 360 | static 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 | ||