>From 847be99aaad7c84b8665b3007444538e30ce27ce Mon Sep 17 00:00:00 2001
From: Ohad Ben-Cohen <[email protected]>
Date: Thu, 30 Sep 2010 14:55:30 +0200
Subject: [PATCH 23/26] sdio: support suspend/resume while runtime suspended

Bring SDIO devices back to full power before their suspend
handler is invoked.

Doing so ensures that SDIO suspend/resume semantics are
maintained (drivers still get to decide whether their
card should be removed or kept during system suspend,
and at what power state), and that SDIO suspend/resume
execution paths are unchanged.

This is achieved by resuming a runtime-suspended SDIO device
in its ->prepare() PM callback (similary to the PCI subsystem).

Since the PM core always increments the run-time usage
counter before calling the ->prepare() callback and decrements
it after calling the ->complete() callback, it is guaranteed
that when the system will come out of suspend, our device's
power state will reflect its runtime PM usage counter.

Signed-off-by: Ohad Ben-Cohen <[email protected]>
Signed-off-by: Claude Brouat <[email protected]>
---
 drivers/mmc/core/sdio_bus.c |   29 +++++++++++++++++++++++++++++
 1 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
index 3637483..2716c7a 100644
--- a/drivers/mmc/core/sdio_bus.c
+++ b/drivers/mmc/core/sdio_bus.c
@@ -189,12 +189,41 @@ out:

 #ifdef CONFIG_PM_RUNTIME

+static int sdio_bus_pm_prepare(struct device *dev)
+{
+    /*
+    * Resume an SDIO device which was suspended at run time at this
+    * point, in order to allow standard SDIO suspend/resume paths
+    * to keep working as usual.
+    *
+    * Ultimately, the SDIO driver itself will decide (in its
+    * suspend handler, or lack thereof) whether the card should be
+    * removed or kept, and if kept, at what power state.
+    *
+    * At this point, PM core have increased our use count, so it's
+    * safe to directly resume the device. After system is resumed
+    * again, PM core will drop back its runtime PM use count, and if
+    * needed device will be suspended again.
+    *
+    * The end result is guaranteed to be a power state that is
+    * coherent with the device's runtime PM use count.
+    *
+    * The return value of pm_runtime_resume is deliberately unchecked
+    * since there is little point in failing system suspend if a
+    * device can't be resumed.
+    */
+    pm_runtime_resume(dev);
+
+    return 0;
+}
+
 static const struct dev_pm_ops sdio_bus_pm_ops = {
     SET_RUNTIME_PM_OPS(
           pm_generic_runtime_suspend,
           pm_generic_runtime_resume,
           pm_generic_runtime_idle
     )
+    .prepare = sdio_bus_pm_prepare,
 };

 #define SDIO_PM_OPS_PTR   (&sdio_bus_pm_ops)
--
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: 0023-sdio-support-suspend-resume-while-runtime-suspended.patch
Description: 0023-sdio-support-suspend-resume-while-runtime-suspended.patch

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

Reply via email to