From: Pontus Fuchs <pontus.fuchs@gmail.com>
To: ohad@wizery.com, ido@wizery.com, coelho@ti.com
Cc: linux-wireless@vger.kernel.org
Subject: [PATCH] wl12xx: Fix power control for CONFIG_RUNTIME_PM off configurations
Date: Wed, 21 Dec 2011 12:41:02 +0100 [thread overview]
Message-ID: <1324467662-10065-1-git-send-email-pontus.fuchs@gmail.com> (raw)
On rmmod wl12xx will leave the sdio host powered off, regardless
off runtime PM being enabled or not. This leads to probe failure on
a second insmod, if runtime pm is disabled, because the sdio core
expects the host to be powered on.
Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
---
drivers/net/wireless/wl12xx/sdio.c | 49 ++++++++++++++++++++---------------
1 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/drivers/net/wireless/wl12xx/sdio.c b/drivers/net/wireless/wl12xx/sdio.c
index 468a505..45115a3 100644
--- a/drivers/net/wireless/wl12xx/sdio.c
+++ b/drivers/net/wireless/wl12xx/sdio.c
@@ -117,14 +117,17 @@ static void wl12xx_sdio_raw_write(struct device *child, int addr, void *buf,
dev_err(child->parent, "sdio write failed (%d)\n", ret);
}
-static int wl12xx_sdio_power_on(struct wl12xx_sdio_glue *glue)
+static int wl12xx_sdio_power_on(struct sdio_func *func, bool noresume)
{
- int ret;
- struct sdio_func *func = dev_to_sdio_func(glue->dev);
+ int ret = 0;
/* If enabled, tell runtime PM not to power off the card */
if (pm_runtime_enabled(&func->dev)) {
- ret = pm_runtime_get_sync(&func->dev);
+ if (noresume)
+ pm_runtime_get_noresume(&func->dev);
+ else
+ ret = pm_runtime_get_sync(&func->dev);
+
if (ret < 0)
goto out;
} else {
@@ -134,20 +137,13 @@ static int wl12xx_sdio_power_on(struct wl12xx_sdio_glue *glue)
goto out;
}
- sdio_claim_host(func);
- sdio_enable_func(func);
-
out:
return ret;
}
-static int wl12xx_sdio_power_off(struct wl12xx_sdio_glue *glue)
+static int wl12xx_sdio_power_off(struct sdio_func *func)
{
int ret;
- struct sdio_func *func = dev_to_sdio_func(glue->dev);
-
- sdio_disable_func(func);
- sdio_release_host(func);
/* Power off the card manually, even if runtime PM is enabled. */
ret = mmc_power_save_host(func->card->host);
@@ -164,11 +160,21 @@ static int wl12xx_sdio_power_off(struct wl12xx_sdio_glue *glue)
static int wl12xx_sdio_set_power(struct device *child, bool enable)
{
struct wl12xx_sdio_glue *glue = dev_get_drvdata(child->parent);
+ struct sdio_func *func = dev_to_sdio_func(glue->dev);
+ int ret;
- if (enable)
- return wl12xx_sdio_power_on(glue);
- else
- return wl12xx_sdio_power_off(glue);
+ if (enable) {
+ ret = wl12xx_sdio_power_on(func, false);
+ if (ret)
+ return ret;
+ sdio_claim_host(func);
+ sdio_enable_func(func);
+ return ret;
+ } else {
+ sdio_disable_func(func);
+ sdio_release_host(func);
+ return wl12xx_sdio_power_off(func);
+ }
}
static struct wl1271_if_operations sdio_ops = {
@@ -223,8 +229,8 @@ static int __devinit wl1271_probe(struct sdio_func *func,
sdio_set_drvdata(func, glue);
- /* Tell PM core that we don't need the card to be powered now */
- pm_runtime_put_noidle(&func->dev);
+ /* Power off as we don't need the card to be powered now */
+ wl12xx_sdio_power_off(func);
glue->core = platform_device_alloc("wl12xx", -1);
if (!glue->core) {
@@ -275,11 +281,12 @@ static void __devexit wl1271_remove(struct sdio_func *func)
{
struct wl12xx_sdio_glue *glue = sdio_get_drvdata(func);
- /* Undo decrement done above in wl1271_probe */
- pm_runtime_get_noresume(&func->dev);
-
platform_device_del(glue->core);
platform_device_put(glue->core);
+
+ /* Leave the sdio host in the state it was in before probing */
+ wl12xx_sdio_power_on(func, true);
+
kfree(glue);
}
--
1.7.5.4
next reply other threads:[~2011-12-21 11:41 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-21 11:41 Pontus Fuchs [this message]
2011-12-22 6:39 ` [PATCH] wl12xx: Fix power control for CONFIG_RUNTIME_PM off configurations Ohad Ben-Cohen
2011-12-22 7:44 ` Pontus Fuchs
2011-12-22 7:51 ` Ohad Ben-Cohen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1324467662-10065-1-git-send-email-pontus.fuchs@gmail.com \
--to=pontus.fuchs@gmail.com \
--cc=coelho@ti.com \
--cc=ido@wizery.com \
--cc=linux-wireless@vger.kernel.org \
--cc=ohad@wizery.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.