PM: add runtime PM support to MMCI
authorRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 14 Aug 2011 08:17:05 +0000 (09:17 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 22 Sep 2011 15:21:42 +0000 (16:21 +0100)
Add runtime PM support to the MMCI primecell driver, making use of
the core primecell bus runtime PM support.

Tested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/mmc/host/mmci.c

index 56e9a41682649349608f8e1ad7e31e026dacb869..5e142b7f5ecfba9e223ba4371316c803c334ab6b 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/dmaengine.h>
 #include <linux/dma-mapping.h>
 #include <linux/amba/mmci.h>
+#include <linux/pm_runtime.h>
 
 #include <asm/div64.h>
 #include <asm/io.h>
@@ -170,6 +171,7 @@ mmci_request_end(struct mmci_host *host, struct mmc_request *mrq)
         * back into the driver...
         */
        spin_unlock(&host->lock);
+       pm_runtime_put(mmc_dev(host->mmc));
        mmc_request_done(host->mmc, mrq);
        spin_lock(&host->lock);
 }
@@ -984,6 +986,8 @@ static void mmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
                return;
        }
 
+       pm_runtime_get_sync(mmc_dev(mmc));
+
        spin_lock_irqsave(&host->lock, flags);
 
        host->mrq = mrq;
@@ -1327,6 +1331,8 @@ static int __devinit mmci_probe(struct amba_device *dev,
 
        mmci_dma_setup(host);
 
+       pm_runtime_put(&dev->dev);
+
        mmc_add_host(mmc);
 
        return 0;
@@ -1364,6 +1370,12 @@ static int __devexit mmci_remove(struct amba_device *dev)
        if (mmc) {
                struct mmci_host *host = mmc_priv(mmc);
 
+               /*
+                * Undo pm_runtime_put() in probe.  We use the _sync
+                * version here so that we can access the primecell.
+                */
+               pm_runtime_get_sync(&dev->dev);
+
                mmc_remove_host(mmc);
 
                writel(0, host->base + MMCIMASK0);