All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ohad Ben-Cohen <ohad@wizery.com>
To: Arnd Hannemann <arnd@arndnet.de>
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: Wed, 17 Nov 2010 00:26:31 +0200	[thread overview]
Message-ID: <AANLkTi=15cX_3_Ud6ELJBpSKvoQ+tK8xH0y_7==pgARe@mail.gmail.com> (raw)
In-Reply-To: <4CE2F4A2.1000006@arndnet.de>

On Tue, Nov 16, 2010 at 11:16 PM, Arnd Hannemann <arnd@arndnet.de> wrote:
> Yes, just plugged it in. No extra wire whatsover.

I wonder - when you suspend/resume the host, with that card plugged
in, do you see any errors (particularly in the resume phase) ?

After suspend/resume was completed, can you still work with that card
(wlan is still functional) ?

I'm asking because SDIO suspend/resume is very similar to what the new
2.6.37-rc1 SDIO runtime pm code does.

Thanks,
Ohad.

>
> 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
>>>>>
>>>>>
>>>>>
>>>
>>>
>>
>
>

  reply	other threads:[~2010-11-16 22:26 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
2010-11-16 22:26                                 ` Ohad Ben-Cohen [this message]
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='AANLkTi=15cX_3_Ud6ELJBpSKvoQ+tK8xH0y_7==pgARe@mail.gmail.com' \
    --to=ohad@wizery.com \
    --cc=arnd@arndnet.de \
    --cc=cjb@laptop.org \
    --cc=dsd@laptop.org \
    --cc=linux-mmc@vger.kernel.org \
    /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.