]> git.karo-electronics.de Git - linux-beck.git/commitdiff
mmc: core: Add bus_ops for runtime pm callbacks
authorUlf Hansson <ulf.hansson@linaro.org>
Thu, 2 May 2013 12:02:37 +0000 (14:02 +0200)
committerChris Ball <cjb@laptop.org>
Sun, 26 May 2013 18:23:15 +0000 (14:23 -0400)
SDIO is the only protocol that uses runtime pm for the card device
right now. To provide the option for sd and mmc to use runtime pm as
well the bus_ops callback are extended with two new functions. One for
runtime_suspend and one for runtime_resume.

This patch will also implement the callbacks for SDIO to make sure
existing functionality is maintained. It also prepares to move
away from using the mmc_power_restore_host API, since it is not
needed when using runtime PM.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/core/bus.c
drivers/mmc/core/core.c
drivers/mmc/core/core.h
drivers/mmc/core/sdio.c

index e219c97a02a416e2439f6640093ac29de4e5d371..d9e8c2b7f4c5b3e192eb9cbf2fa6e3936c2fcd41 100644 (file)
@@ -151,15 +151,25 @@ static int mmc_bus_resume(struct device *dev)
 static int mmc_runtime_suspend(struct device *dev)
 {
        struct mmc_card *card = mmc_dev_to_card(dev);
+       struct mmc_host *host = card->host;
+       int ret = 0;
+
+       if (host->bus_ops->runtime_suspend)
+               ret = host->bus_ops->runtime_suspend(host);
 
-       return mmc_power_save_host(card->host);
+       return ret;
 }
 
 static int mmc_runtime_resume(struct device *dev)
 {
        struct mmc_card *card = mmc_dev_to_card(dev);
+       struct mmc_host *host = card->host;
+       int ret = 0;
+
+       if (host->bus_ops->runtime_resume)
+               ret = host->bus_ops->runtime_resume(host);
 
-       return mmc_power_restore_host(card->host);
+       return ret;
 }
 
 static int mmc_runtime_idle(struct device *dev)
index d856871ed6cb0beb07d2d397a908bd2279f6a94d..dc0cb5929c6476f9eee5327686c3a0f1c09568f5 100644 (file)
@@ -1478,7 +1478,7 @@ void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type)
  * If a host does all the power sequencing itself, ignore the
  * initial MMC_POWER_UP stage.
  */
-static void mmc_power_up(struct mmc_host *host)
+void mmc_power_up(struct mmc_host *host)
 {
        int bit;
 
index b9f18a2a8874ab3004b1676f60443f6bfcd43fc1..6242ffb789c45afc8ddd8136444700edba5f6438 100644 (file)
@@ -22,6 +22,8 @@ struct mmc_bus_ops {
        void (*detect)(struct mmc_host *);
        int (*suspend)(struct mmc_host *);
        int (*resume)(struct mmc_host *);
+       int (*runtime_suspend)(struct mmc_host *);
+       int (*runtime_resume)(struct mmc_host *);
        int (*power_save)(struct mmc_host *);
        int (*power_restore)(struct mmc_host *);
        int (*alive)(struct mmc_host *);
@@ -44,6 +46,7 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage);
 int __mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage);
 void mmc_set_timing(struct mmc_host *host, unsigned int timing);
 void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type);
+void mmc_power_up(struct mmc_host *host);
 void mmc_power_off(struct mmc_host *host);
 void mmc_power_cycle(struct mmc_host *host);
 
index 444668c210b288cd1f65651684042a0b64cd37b1..1fbbd1bc55ec047cf5b317384d9a4f6312692342 100644 (file)
@@ -1059,11 +1059,27 @@ out:
        return ret;
 }
 
+static int mmc_sdio_runtime_suspend(struct mmc_host *host)
+{
+       /* No references to the card, cut the power to it. */
+       mmc_power_off(host);
+       return 0;
+}
+
+static int mmc_sdio_runtime_resume(struct mmc_host *host)
+{
+       /* Restore power and re-initialize. */
+       mmc_power_up(host);
+       return mmc_sdio_power_restore(host);
+}
+
 static const struct mmc_bus_ops mmc_sdio_ops = {
        .remove = mmc_sdio_remove,
        .detect = mmc_sdio_detect,
        .suspend = mmc_sdio_suspend,
        .resume = mmc_sdio_resume,
+       .runtime_suspend = mmc_sdio_runtime_suspend,
+       .runtime_resume = mmc_sdio_runtime_resume,
        .power_restore = mmc_sdio_power_restore,
        .alive = mmc_sdio_alive,
 };