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 <[email protected]>
Signed-off-by: Tony Lindgren <[email protected]>
This commit is contained in:
Adrian Hunter 2010-02-15 10:03:34 -08:00 • committed by Tony Lindgren
commit e0eb242446
4 changed files with 22 additions and 1 deletions

View file

@ -347,7 +347,14 @@ static int omap_hsmmc_23_set_sleep(struct device *dev, int slot, int sleep,
err = regulator_set_mode(host->vcc, mode);
if (err)
return err;
return regulator_set_mode(host->vcc_aux, mode);
if (!mmc_slot(host).vcc_aux_disable_is_sleep)
return regulator_set_mode(host->vcc_aux, mode);
if (sleep)
return regulator_disable(host->vcc_aux);
else
return regulator_enable(host->vcc_aux);
}
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)
else
mmc->ops = &omap_hsmmc_ops;
/*
* If regulator_disable can only put vcc_aux to sleep then there is
* no off state.
*/
if (mmc_slot(host).vcc_aux_disable_is_sleep)
mmc_slot(host).no_off = 1;
mmc->f_min = 400000;
mmc->f_max = 52000000;