From: Arnd Hannemann <arnd@arndnet.de>
To: Ohad Ben-Cohen <ohad@wizery.com>
Cc: Daniel Drake <dsd@laptop.org>,
linux-mmc@vger.kernel.org, Chris Ball <cjb@laptop.org>
Subject: Re: MMC runtime PM patches break libertas probe
Date: Tue, 16 Nov 2010 22:16:18 +0100 [thread overview]
Message-ID: <4CE2F4A2.1000006@arndnet.de> (raw)
In-Reply-To: <AANLkTi=zt+22P-sE8quU_J78Hpi3zg6xnz5VE+Dy-iLJ@mail.gmail.com>
Am 16.11.2010 21:58, schrieb Ohad Ben-Cohen:
> On Tue, Nov 16, 2010 at 7:17 PM, Arnd Hannemann
> <hannemann@nets.rwth-aachen.de> >> > Its an AP4 (SH7372) evaluation
> board from renesas. It has an SD-Slot,
>
>> where you plug the SDIO card into it. No special wiring or something
>> like this. So I doubt some external GPIOs are involved.
>> I have no idea how the wifi card gets its power, but I hope its over
>> some well defined pins within the SD slot...
>>
> Can you please specify what was the wlan card you used ? is it a
> commercial card or an evaluation board of some sort ?
>
It says: c-guys sd link11b driver is b43.
It's an commercial card.
> You said it, but just to be sure - I assume there is no external power
> supply involved with that card, right ? it's just plugged into the SD
> slot with no extra wire whatsoever ?
>
Yes, just plugged it in. No extra wire whatsover.
Regards,
Arnd
> Thanks!
> Ohad.
>
>
>> I was able to work with 2.6.35 and .36 plus some out-of-tree patches
>> for the sh_mobile_sdhi mfd, which are now in mainline:
>> mmc: Allow 2 byte requests in 4-bit mode for tmio_mmc
>> tmio_mmc: don't clear unhandled pending interrupts
>> tmio_mmc: don't clear unhandled pending interrupts
>>
>>
>>>> From 6b5691bdd8184cc0876d209c69d38844ea10f678 Mon Sep 17 00:00:00 2001
>>>> From: Ohad Ben-Cohen <ohad@wizery.com>
>>>> Date: Mon, 1 Nov 2010 09:41:44 +0200
>>>> Subject: [PATCH] mmc: add MMC_CAP_RUNTIME_PM
>>>>
>>>> Some board/card/host configurations are not capable of powering off/on
>>>> on the card during runtime.
>>>>
>>>> To support such configurations, and to allow smoother transition to
>>>> runtime PM behavior, MMC_CAP_RUNTIME_PM is added, so hosts need to
>>>> explicitly indicate that it's OK to power off their cards after boot.
>>>>
>>>> This will prevent sdio_bus_probe() from failing to power on the card
>>>> when the driver is loaded on such setups.
>>>>
>>>> Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
>>>> ---
>>>> drivers/mmc/core/sdio.c | 37 +++++++++++++++++++++++--------------
>>>> drivers/mmc/core/sdio_bus.c | 33 ++++++++++++++++++++++-----------
>>>> include/linux/mmc/host.h | 1 +
>>>> 3 files changed, 46 insertions(+), 25 deletions(-)
>>>>
>>>> diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c
>>>> index 6a9ad40..373d56d 100644
>>>> --- a/drivers/mmc/core/sdio.c
>>>> +++ b/drivers/mmc/core/sdio.c
>>>> @@ -547,9 +547,11 @@ static void mmc_sdio_detect(struct mmc_host *host)
>>>> BUG_ON(!host->card);
>>>>
>>>> /* Make sure card is powered before detecting it */
>>>> - err = pm_runtime_get_sync(&host->card->dev);
>>>> - if (err < 0)
>>>> - goto out;
>>>> + if (host->caps & MMC_CAP_RUNTIME_PM) {
>>>> + err = pm_runtime_get_sync(&host->card->dev);
>>>> + if (err < 0)
>>>> + goto out;
>>>> + }
>>>>
>>>> mmc_claim_host(host);
>>>>
>>>> @@ -570,7 +572,8 @@ out:
>>>> }
>>>>
>>>> /* Tell PM core that we're done */
>>>> - pm_runtime_put(&host->card->dev);
>>>> + if (host->caps & MMC_CAP_RUNTIME_PM)
>>>> + pm_runtime_put(&host->card->dev);
>>>> }
>>>>
>>>> /*
>>>> @@ -720,16 +723,21 @@ int mmc_attach_sdio(struct mmc_host *host, u32 ocr)
>>>> card = host->card;
>>>>
>>>> /*
>>>> - * Let runtime PM core know our card is active
>>>> + * Enable runtime PM only if supported by host+card+board
>>>> */
>>>> - err = pm_runtime_set_active(&card->dev);
>>>> - if (err)
>>>> - goto remove;
>>>> + if (host->caps & MMC_CAP_RUNTIME_PM) {
>>>> + /*
>>>> + * Let runtime PM core know our card is active
>>>> + */
>>>> + err = pm_runtime_set_active(&card->dev);
>>>> + if (err)
>>>> + goto remove;
>>>>
>>>> - /*
>>>> - * Enable runtime PM for this card
>>>> - */
>>>> - pm_runtime_enable(&card->dev);
>>>> + /*
>>>> + * Enable runtime PM for this card
>>>> + */
>>>> + pm_runtime_enable(&card->dev);
>>>> + }
>>>>
>>>> /*
>>>> * The number of functions on the card is encoded inside
>>>> @@ -747,9 +755,10 @@ int mmc_attach_sdio(struct mmc_host *host, u32 ocr)
>>>> goto remove;
>>>>
>>>> /*
>>>> - * Enable Runtime PM for this func
>>>> + * Enable Runtime PM for this func (if supported)
>>>> */
>>>> - pm_runtime_enable(&card->sdio_func[i]->dev);
>>>> + if (host->caps & MMC_CAP_RUNTIME_PM)
>>>> + 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 2716c7a..f3ce21b 100644
>>>> --- a/drivers/mmc/core/sdio_bus.c
>>>> +++ b/drivers/mmc/core/sdio_bus.c
>>>> @@ -17,6 +17,7 @@
>>>> #include <linux/pm_runtime.h>
>>>>
>>>> #include <linux/mmc/card.h>
>>>> +#include <linux/mmc/host.h>
>>>> #include <linux/mmc/sdio_func.h>
>>>>
>>>> #include "sdio_cis.h"
>>>> @@ -132,9 +133,11 @@ static int sdio_bus_probe(struct device *dev)
>>>> * 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;
>>>> + if (func->card->host->caps & MMC_CAP_RUNTIME_PM) {
>>>> + 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. */
>>>> @@ -151,7 +154,8 @@ static int sdio_bus_probe(struct device *dev)
>>>> return 0;
>>>>
>>>> disable_runtimepm:
>>>> - pm_runtime_put_noidle(dev);
>>>> + if (func->card->host->caps & MMC_CAP_RUNTIME_PM)
>>>> + pm_runtime_put_noidle(dev);
>>>> out:
>>>> return ret;
>>>> }
>>>> @@ -160,12 +164,14 @@ 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;
>>>> + int ret = 0;
>>>>
>>>> /* Make sure card is powered before invoking ->remove() */
>>>> - ret = pm_runtime_get_sync(dev);
>>>> - if (ret < 0)
>>>> - goto out;
>>>> + if (func->card->host->caps & MMC_CAP_RUNTIME_PM) {
>>>> + ret = pm_runtime_get_sync(dev);
>>>> + if (ret < 0)
>>>> + goto out;
>>>> + }
>>>>
>>>> drv->remove(func);
>>>>
>>>> @@ -178,10 +184,12 @@ static int sdio_bus_remove(struct device *dev)
>>>> }
>>>>
>>>> /* First, undo the increment made directly above */
>>>> - pm_runtime_put_noidle(dev);
>>>> + if (func->card->host->caps & MMC_CAP_RUNTIME_PM)
>>>> + pm_runtime_put_noidle(dev);
>>>>
>>>> /* Then undo the runtime PM settings in sdio_bus_probe() */
>>>> - pm_runtime_put_noidle(dev);
>>>> + if (func->card->host->caps & MMC_CAP_RUNTIME_PM)
>>>> + pm_runtime_put_noidle(dev);
>>>>
>>>> out:
>>>> return ret;
>>>> @@ -191,6 +199,8 @@ out:
>>>>
>>>> static int sdio_bus_pm_prepare(struct device *dev)
>>>> {
>>>> + struct sdio_func *func = dev_to_sdio_func(dev);
>>>> +
>>>> /*
>>>> * Resume an SDIO device which was suspended at run time at this
>>>> * point, in order to allow standard SDIO suspend/resume paths
>>>> @@ -212,7 +222,8 @@ static int sdio_bus_pm_prepare(struct device *dev)
>>>> * since there is little point in failing system suspend if a
>>>> * device can't be resumed.
>>>> */
>>>> - pm_runtime_resume(dev);
>>>> + if (func->card->host->caps & MMC_CAP_RUNTIME_PM)
>>>> + pm_runtime_resume(dev);
>>>>
>>>> return 0;
>>>> }
>>>> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
>>>> index c3ffad8..e5eee0e 100644
>>>> --- a/include/linux/mmc/host.h
>>>> +++ b/include/linux/mmc/host.h
>>>> @@ -167,6 +167,7 @@ struct mmc_host {
>>>> /* DDR mode at 1.8V */
>>>> #define MMC_CAP_1_2V_DDR (1 << 12) /* can support */
>>>> /* DDR mode at 1.2V */
>>>> +#define MMC_CAP_RUNTIME_PM (1 << 13) /* Can power off/on in runtime */
>>>>
>>>> mmc_pm_flag_t pm_caps; /* supported pm features */
>>>>
>>>> --
>>>> 1.7.0.4
>>>>
>>>>
>>>>
>>
>>
>
next prev parent reply other threads:[~2010-11-16 21:16 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-31 14:29 MMC runtime PM patches break libertas probe Daniel Drake
2010-10-31 14:42 ` Ohad Ben-Cohen
2010-10-31 14:55 ` Daniel Drake
2010-10-31 15:08 ` Ohad Ben-Cohen
2010-10-31 15:10 ` Daniel Drake
2010-10-31 15:16 ` Ohad Ben-Cohen
2010-10-31 15:21 ` Daniel Drake
2010-10-31 15:21 ` Daniel Drake
2010-10-31 15:27 ` Ohad Ben-Cohen
2010-10-31 15:57 ` Daniel Drake
2010-10-31 16:16 ` Ohad Ben-Cohen
2010-10-31 16:24 ` Daniel Drake
2010-10-31 19:06 ` Ohad Ben-Cohen
2010-11-01 8:27 ` Ohad Ben-Cohen
2010-11-06 21:19 ` Daniel Drake
2010-11-07 1:48 ` Nicolas Pitre
2010-11-07 10:19 ` Daniel Drake
2010-11-07 15:12 ` Nicolas Pitre
2010-11-07 10:42 ` Ohad Ben-Cohen
2010-11-07 10:51 ` Daniel Drake
2010-11-07 13:17 ` Ohad Ben-Cohen
2010-11-16 13:22 ` Ohad Ben-Cohen
2010-11-16 14:29 ` Daniel Drake
2010-11-16 14:49 ` Ohad Ben-Cohen
2010-11-17 6:46 ` Mike Rapoport
2010-11-17 7:29 ` Ohad Ben-Cohen
2010-11-17 14:54 ` Nicolas Pitre
2010-11-16 17:17 ` Arnd Hannemann
2010-11-16 20:58 ` Ohad Ben-Cohen
2010-11-16 21:16 ` Arnd Hannemann [this message]
2010-11-16 22:26 ` Ohad Ben-Cohen
2011-05-29 16:21 ` Daniel Drake
2011-05-30 6:52 ` Ohad Ben-Cohen
2011-05-30 7:01 ` Daniel Drake
2011-05-30 7:32 ` Ohad Ben-Cohen
2011-05-30 11:04 ` zhangfei gao
2011-05-30 11:16 ` Ohad Ben-Cohen
2011-06-02 8:39 ` Bing Zhao
2011-06-02 18:25 ` Ohad Ben-Cohen
2011-06-03 22:28 ` Bing Zhao
2011-06-03 22:52 ` Ohad Ben-Cohen
2011-06-07 14:34 ` Arnd Hannemann
2011-06-07 14:45 ` Ohad Ben-Cohen
2011-06-08 14:34 ` Ohad Ben-Cohen
2011-06-10 2:02 ` zhangfei gao
2011-06-10 4:28 ` Ohad Ben-Cohen
2011-06-11 2:33 ` zhangfei gao
2011-06-11 9:03 ` 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=4CE2F4A2.1000006@arndnet.de \
--to=arnd@arndnet.de \
--cc=cjb@laptop.org \
--cc=dsd@laptop.org \
--cc=linux-mmc@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).