Skip to content

Commit

Permalink
omap_hsmmc: Allow for a shared VccQ
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Adrian Hunter authored and Tony Lindgren committed Feb 15, 2010
1 parent 6da20c8 commit e0eb242
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 1 deletion.
3 changes: 3 additions & 0 deletions arch/arm/mach-omap2/hsmmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,9 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
if (c->no_off)
mmc->slots[0].no_off = 1;

if (c->vcc_aux_disable_is_sleep)
mmc->slots[0].vcc_aux_disable_is_sleep = 1;

/* NOTE: MMC slots should have a Vcc regulator set up.
* This may be from a TWL4030-family chip, another
* controllable regulator, or a fixed supply.
Expand Down
1 change: 1 addition & 0 deletions arch/arm/mach-omap2/hsmmc.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ struct omap2_hsmmc_info {
bool nonremovable; /* Nonremovable e.g. eMMC */
bool power_saving; /* Try to sleep or power off when possible */
bool no_off; /* power_saving and power is not to go off */
bool vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */
int gpio_cd; /* or -EINVAL */
int gpio_wp; /* or -EINVAL */
char *name; /* or NULL for default */
Expand Down
3 changes: 3 additions & 0 deletions arch/arm/plat-omap/include/plat/mmc.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ struct omap_mmc_platform_data {
/* If using power_saving and the MMC power is not to go off */
unsigned no_off:1;

/* Regulator off remapped to sleep */
unsigned vcc_aux_disable_is_sleep:1;

int switch_pin; /* gpio (card detect) */
int gpio_wp; /* gpio (write protect) */

Expand Down
16 changes: 15 additions & 1 deletion drivers/mmc/host/omap_hsmmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit e0eb242

Please sign in to comment.