>From 50c05193c5919f533c3fed7ef6e23210a420e69b Mon Sep 17 00:00:00 2001
From: Ohad Ben-Cohen <[email protected]>
Date: Sat, 4 Sep 2010 17:22:23 +0300
Subject: [PATCH 21/26] sdio: enable runtime PM for SDIO functions

Enable runtime PM for SDIO functions.

SDIO functions are initialized with a disabled runtime PM state,
and are set active (and their usage count is incremented)
only before potential drivers are probed.

SDIO function drivers that support runtime PM should call
pm_runtime_put_noidle() in their probe routine, and
pm_runtime_get_noresume() in their remove routine (very
similarly to PCI drivers).

In case a matching driver does not support runtime PM, power will
always be kept high (since the usage count is positive).

Signed-off-by: Ohad Ben-Cohen <[email protected]>
Signed-off-by: Claude Brouat <[email protected]>
---
 drivers/mmc/core/sdio.c     |    5 +++++
 drivers/mmc/core/sdio_bus.c |   38 +++++++++++++++++++++++++++++++++++---
 2 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c
index 241d140..c172901 100644
--- a/drivers/mmc/core/sdio.c
+++ b/drivers/mmc/core/sdio.c
@@ -614,6 +614,11 @@ int mmc_attach_sdio(struct mmc_host *host, u32 ocr)
           err = sdio_init_func(host->card, i + 1);
           if (err)
                goto remove;
+
+          /*
+          * Enable Runtime PM for this func
+          */
+          pm_runtime_enable(&card->sdio_func[i]->dev);
     }

     mmc_release_host(host);
diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
index 256a968..3637483 100644
--- a/drivers/mmc/core/sdio_bus.c
+++ b/drivers/mmc/core/sdio_bus.c
@@ -126,21 +126,46 @@ static int sdio_bus_probe(struct device *dev)
     if (!id)
           return -ENODEV;

+    /* Unbound SDIO functions are always suspended.
+    * During probe, the function is set active and the usage count
+    * is incremented.  If the driver supports runtime PM,
+    * it should call pm_runtime_put_noidle() in its probe routine and
+    * pm_runtime_get_noresume() in its remove routine.
+    */
+    ret = pm_runtime_get_sync(dev);
+    if (ret < 0)
+          goto out;
+
     /* Set the default block size so the driver is sure it's something
      * sensible. */
     sdio_claim_host(func);
     ret = sdio_set_block_size(func, 0);
     sdio_release_host(func);
     if (ret)
-          return ret;
+          goto disable_runtimepm;
+
+    ret = drv->probe(func, id);
+    if (ret)
+          goto disable_runtimepm;

-    return drv->probe(func, id);
+    return 0;
+
+disable_runtimepm:
+    pm_runtime_put_noidle(dev);
+out:
+    return ret;
 }

 static int sdio_bus_remove(struct device *dev)
 {
     struct sdio_driver *drv = to_sdio_driver(dev->driver);
     struct sdio_func *func = dev_to_sdio_func(dev);
+    int ret;
+
+    /* Make sure card is powered before invoking ->remove() */
+    ret = pm_runtime_get_sync(dev);
+    if (ret < 0)
+          goto out;

     drv->remove(func);

@@ -152,7 +177,14 @@ static int sdio_bus_remove(struct device *dev)
           sdio_release_host(func);
     }

-    return 0;
+    /* First, undo the increment made directly above */
+    pm_runtime_put_noidle(dev);
+
+    /* Then undo the runtime PM settings in sdio_bus_probe() */
+    pm_runtime_put_noidle(dev);
+
+out:
+    return ret;
 }

 #ifdef CONFIG_PM_RUNTIME
--
1.6.3.3




Claude BROUAT
UMG/MIPE/WSIV  System Integrator
Office:    +33 (0)1 72 21 04 54
mailto: mailto:[email protected]

Intel Corp. SAS
134, av du Général Eisenhower
BP 73586
31100 TOULOUSE
France



---------------------------------------------------------------------
Intel Corporation SAS (French simplified joint stock company)
Registered headquarters: "Les Montalets"- 2, rue de Paris, 
92196 Meudon Cedex, France
Registration Number:  302 456 199 R.C.S. NANTERRE
Capital: 4,572,000 Euros

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.

Attachment: 0021-sdio-enable-runtime-PM-for-SDIO-functions.patch
Description: 0021-sdio-enable-runtime-PM-for-SDIO-functions.patch

_______________________________________________
Meego-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to