aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/core/mmc.c
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@nokia.com>2009-09-22 19:44:33 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-09-23 10:39:33 -0400
commiteae1aeeed852aae37621b82a9e7f6c05096a18fd (patch)
tree6a1b108032a5cf08ccfa6fffa29c81cccbe8c82d /drivers/mmc/core/mmc.c
parent9feae246963c648b212abad0f0eb8938de5f5fe5 (diff)
mmc: add ability to save power by powering off cards
Power can be saved by powering off cards that are not in use. This is similar to suspend / resume except it is under the control of the driver, and does not require any power management support. It can only be used when the driver can monitor whether the card is removed, otherwise it is unsafe. This is possible because, unlike suspend, the driver still receives card detect and / or cover switch interrupts. Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com> Acked-by: Matt Fleming <matt@console-pimps.org> Cc: Ian Molton <ian@mnementh.co.uk> Cc: "Roberto A. Foglietta" <roberto.foglietta@gmail.com> Cc: Jarkko Lavinen <jarkko.lavinen@nokia.com> Cc: Denis Karpov <ext-denis.2.karpov@nokia.com> Cc: Pierre Ossman <pierre@ossman.eu> Cc: Philip Langdale <philipl@overt.org> Cc: "Madhusudhan" <madhu.cr@ti.com> Cc: <linux-mmc@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/mmc/core/mmc.c')
-rw-r--r--drivers/mmc/core/mmc.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 995db1853a8..27e842df6a6 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -549,6 +549,14 @@ static void mmc_resume(struct mmc_host *host)
549 549
550} 550}
551 551
552static void mmc_power_restore(struct mmc_host *host)
553{
554 host->card->state &= ~MMC_STATE_HIGHSPEED;
555 mmc_claim_host(host);
556 mmc_init_card(host, host->ocr, host->card);
557 mmc_release_host(host);
558}
559
552#ifdef CONFIG_MMC_UNSAFE_RESUME 560#ifdef CONFIG_MMC_UNSAFE_RESUME
553 561
554static const struct mmc_bus_ops mmc_ops = { 562static const struct mmc_bus_ops mmc_ops = {
@@ -556,6 +564,7 @@ static const struct mmc_bus_ops mmc_ops = {
556 .detect = mmc_detect, 564 .detect = mmc_detect,
557 .suspend = mmc_suspend, 565 .suspend = mmc_suspend,
558 .resume = mmc_resume, 566 .resume = mmc_resume,
567 .power_restore = mmc_power_restore,
559}; 568};
560 569
561static void mmc_attach_bus_ops(struct mmc_host *host) 570static void mmc_attach_bus_ops(struct mmc_host *host)
@@ -570,6 +579,7 @@ static const struct mmc_bus_ops mmc_ops = {
570 .detect = mmc_detect, 579 .detect = mmc_detect,
571 .suspend = NULL, 580 .suspend = NULL,
572 .resume = NULL, 581 .resume = NULL,
582 .power_restore = mmc_power_restore,
573}; 583};
574 584
575static const struct mmc_bus_ops mmc_ops_unsafe = { 585static const struct mmc_bus_ops mmc_ops_unsafe = {
@@ -577,6 +587,7 @@ static const struct mmc_bus_ops mmc_ops_unsafe = {
577 .detect = mmc_detect, 587 .detect = mmc_detect,
578 .suspend = mmc_suspend, 588 .suspend = mmc_suspend,
579 .resume = mmc_resume, 589 .resume = mmc_resume,
590 .power_restore = mmc_power_restore,
580}; 591};
581 592
582static void mmc_attach_bus_ops(struct mmc_host *host) 593static void mmc_attach_bus_ops(struct mmc_host *host)