Skip to content

Commit

Permalink
sdhci: add regulator support
Browse files Browse the repository at this point in the history
This patch adds support for regulator API to sdhci core driver.
Regulators can be used to disable power in suspended state to reduce
dissipated energy.

Signed-off-by: Marek Szyprowski <[email protected]>
Signed-off-by: Kyungmin Park <[email protected]>
Acked-by: Mark Brown <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
mszyprow authored and torvalds committed Aug 11, 2010
1 parent 17866e1 commit 9bea3c8
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
26 changes: 25 additions & 1 deletion drivers/mmc/host/sdhci.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/dma-mapping.h>
#include <linux/slab.h>
#include <linux/scatterlist.h>
#include <linux/regulator/consumer.h>

#include <linux/leds.h>

Expand Down Expand Up @@ -1608,7 +1609,10 @@ int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state)

free_irq(host->irq, host);

return 0;
if (host->vmmc)
ret = regulator_disable(host->vmmc);

return ret;
}

EXPORT_SYMBOL_GPL(sdhci_suspend_host);
Expand All @@ -1617,6 +1621,13 @@ int sdhci_resume_host(struct sdhci_host *host)
{
int ret;

if (host->vmmc) {
int ret = regulator_enable(host->vmmc);
if (ret)
return ret;
}


if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
if (host->ops->enable_dma)
host->ops->enable_dma(host);
Expand Down Expand Up @@ -1889,6 +1900,14 @@ int sdhci_add_host(struct sdhci_host *host)
if (ret)
goto untasklet;

host->vmmc = regulator_get(mmc_dev(mmc), "vmmc");
if (IS_ERR(host->vmmc)) {
printk(KERN_INFO "%s: no vmmc regulator found\n", mmc_hostname(mmc));
host->vmmc = NULL;
} else {
regulator_enable(host->vmmc);
}

sdhci_init(host, 0);

#ifdef CONFIG_MMC_DEBUG
Expand Down Expand Up @@ -1973,6 +1992,11 @@ void sdhci_remove_host(struct sdhci_host *host, int dead)
tasklet_kill(&host->card_tasklet);
tasklet_kill(&host->finish_tasklet);

if (host->vmmc) {
regulator_disable(host->vmmc);
regulator_put(host->vmmc);
}

kfree(host->adma_desc);
kfree(host->align_buffer);

Expand Down
2 changes: 2 additions & 0 deletions drivers/mmc/host/sdhci.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,8 @@ struct sdhci_host {

const struct sdhci_ops *ops; /* Low level hw interface */

struct regulator *vmmc; /* Power regulator */

/* Internal data */
struct mmc_host *mmc; /* MMC structure */
u64 dma_mask; /* custom DMA mask */
Expand Down

0 comments on commit 9bea3c8

Please sign in to comment.