>From 4b1c457546b27c072c47c589bd3cd9ba309a2457 Mon Sep 17 00:00:00 2001
From: Denis Robert <[email protected]>
Date: Wed, 20 Oct 2010 13:53:03 +0200
Subject: [PATCH 24/26] wl1271: sdio: enable runtime PM

Enable runtime PM for the wl1271 SDIO device.

We request power whenever the WLAN interface is brought up,
and release it after the WLAN interface is taken down.

As a result, power is released immediately after probe returns,
since at that point power has not been explicitly requested yet
(i.e. the WLAN interface is still down).

Signed-off-by: Ohad Ben-Cohen <[email protected]>
Acked-by: Luciano Coelho <[email protected]>
Tested-by: Luciano Coelho <[email protected]>
Signed-off-by: Luciano Coelho <[email protected]>
Signed-off-by: Denis Robert <[email protected]>
Signed-off-by: Claude Brouat <[email protected]>
---
 drivers/net/wireless/wl12xx/wl1271_sdio.c |   24 +++++++++++++++++-------
 1 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/wl12xx/wl1271_sdio.c 
b/drivers/net/wireless/wl12xx/wl1271_sdio.c
index 874e25a..f8252af 100644
--- a/drivers/net/wireless/wl12xx/wl1271_sdio.c
+++ b/drivers/net/wireless/wl12xx/wl1271_sdio.c
@@ -30,6 +30,7 @@
 #include <linux/mmc/card.h>
 #include <linux/gpio.h>
 #include <linux/wl12xx.h>
+#include <linux/pm_runtime.h>

 #include "wl1271.h"
 #include "wl12xx_80211.h"
@@ -160,12 +161,19 @@ static void wl1271_sdio_raw_write(struct wl1271 *wl, int 
addr, void *buf,
 static int wl1271_sdio_power_on(struct wl1271 *wl)
 {
     struct sdio_func *func = wl_to_func(wl);
+    int ret;
+
+    /* Power up the card */
+    ret = pm_runtime_get_sync(&func->dev);
+    if (ret < 0)
+          goto out;

     sdio_claim_host(func);
     sdio_enable_func(func);
     sdio_release_host(func);

-    return 0;
+out:
+    return ret;
 }

 static int wl1271_sdio_power_off(struct wl1271 *wl)
@@ -176,17 +184,14 @@ static int wl1271_sdio_power_off(struct wl1271 *wl)
     sdio_disable_func(func);
     sdio_release_host(func);

-    return 0;
+    /* Power down the card */
+    return pm_runtime_put_sync(&func->dev);
 }

 static int wl1271_sdio_set_power(struct wl1271 *wl, bool enable)
 {
     struct sdio_func *func = wl_to_func(wl);

-    /* Let the SDIO stack handle wlan_enable control, so we
-    * keep host claimed while wlan is in use to keep wl1271
-    * alive.
-    */
     if (enable)
           return wl1271_sdio_power_on(wl);
     else
@@ -259,6 +264,9 @@ static int __devinit wl1271_probe(struct sdio_func *func,

     sdio_set_drvdata(func, wl);

+    /* Tell PM core that we don't need the card to be powered now */
+    pm_runtime_put_noidle(&func->dev);
+
     wl1271_notice("initialized");

     return 0;
@@ -277,9 +285,11 @@ static void __devexit wl1271_remove(struct sdio_func *func)
 {
     struct wl1271 *wl = sdio_get_drvdata(func);

-    free_irq(wl->irq, wl);
+    /* Undo decrement done above in wl1271_probe */
+    pm_runtime_get_noresume(&func->dev);

     wl1271_unregister_hw(wl);
+    free_irq(wl->irq, wl);
     wl1271_free_hw(wl);
 }

--
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: 0024-wl1271-sdio-enable-runtime-PM.patch
Description: 0024-wl1271-sdio-enable-runtime-PM.patch

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

Reply via email to