Skip to content

Commit

Permalink
wl1271: sdio: enable runtime PM
Browse files Browse the repository at this point in the history
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 <ohad@wizery.com>
Acked-by: Luciano Coelho <luciano.coelho@nokia.com>
Tested-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
  • Loading branch information
Ohad Ben-Cohen authored and Luciano Coelho committed Oct 8, 2010
1 parent 15a6321 commit 00cbb3c
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions drivers/net/wireless/wl12xx/wl1271_sdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand All @@ -176,15 +184,12 @@ 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)
{
/* 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
Expand Down Expand Up @@ -256,6 +261,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;
Expand All @@ -274,6 +282,9 @@ static void __devexit wl1271_remove(struct sdio_func *func)
{
struct wl1271 *wl = sdio_get_drvdata(func);

/* 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);
Expand Down

0 comments on commit 00cbb3c

Please sign in to comment.