[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <7hmwhyalpu.fsf@paris.lan>
Date: Mon, 10 Feb 2014 10:03:57 -0800
From: Kevin Hilman <khilman@...aro.org>
To: Ulf Hansson <ulf.hansson@...aro.org>
Cc: Russell King <linux@....linux.org.uk>,
"linux-arm-kernel\@lists.infradead.org"
<linux-arm-kernel@...ts.infradead.org>,
Alessandro Rubini <rubini@...pv.it>,
Linus Walleij <linus.walleij@...aro.org>,
Wolfram Sang <wsa@...-dreams.de>,
Chris Ball <chris@...ntf.net>, Mark Brown <broonie@...nel.org>,
"linux-kernel\@vger.kernel.org" <linux-kernel@...r.kernel.org>,
"linux-i2c\@vger.kernel.org" <linux-i2c@...r.kernel.org>,
"linux-spi\@vger.kernel.org" <linux-spi@...r.kernel.org>,
linux-mmc <linux-mmc@...r.kernel.org>
Subject: Re: [PATCH 05/17] mmc: mmci: Put the device into low power state at system suspend
Ulf Hansson <ulf.hansson@...aro.org> writes:
> On 4 February 2014 20:22, Kevin Hilman <khilman@...aro.org> wrote:
>> Ulf Hansson <ulf.hansson@...aro.org> writes:
>>
>>> Due to the available runtime PM callbacks, we are now able to put our
>>> device into low power state at system suspend.
>>>
>>> Earlier we could not accomplish this without trusting a power domain
>>> for the device to take care of it. Now we are able to cope with
>>> scenarios both with and without a power domain.
>>>
>>> Cc: Russell King <linux@....linux.org.uk>
>>> Signed-off-by: Ulf Hansson <ulf.hansson@...aro.org>
>>> ---
>>> drivers/mmc/host/mmci.c | 45 +++++++++++++++++++++++++--------------------
>>> 1 file changed, 25 insertions(+), 20 deletions(-)
>>>
>>> diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
>>> index c88da1c..074e0cb 100644
>>> --- a/drivers/mmc/host/mmci.c
>>> +++ b/drivers/mmc/host/mmci.c
>>> @@ -1723,33 +1723,38 @@ static int mmci_remove(struct amba_device *dev)
>>> return 0;
>>> }
>>>
>>> -#ifdef CONFIG_SUSPEND
>>> -static int mmci_suspend(struct device *dev)
>>> +#ifdef CONFIG_PM_SLEEP
>>> +static int mmci_suspend_late(struct device *dev)
>>> {
>>> - struct amba_device *adev = to_amba_device(dev);
>>> - struct mmc_host *mmc = amba_get_drvdata(adev);
>>> + int ret = 0;
>>>
>>> - if (mmc) {
>>> - struct mmci_host *host = mmc_priv(mmc);
>>> - pm_runtime_get_sync(dev);
>>> - writel(0, host->base + MMCIMASK0);
>>> - }
>>> + if (pm_runtime_status_suspended(dev))
>>> + return 0;
>>>
>>> - return 0;
>>> + if (dev->pm_domain && dev->pm_domain->ops.runtime_suspend)
>>> + ret = dev->pm_domain->ops.runtime_suspend(dev);
>>> + else
>>> + ret = dev->bus->pm->runtime_suspend(dev);
>>> +
>>> + if (!ret)
>>> + pm_runtime_set_suspended(dev);
>>
>> Isn't this basically open-coding pm_runtime_suspend()...
>
> It is similar, but with once big difference.
>
> Since the PM core prevents pm_runtime_suspend() from invoking our
> ->runtime_suspend callback during system suspend (it does so by
> invoking pm_runtime_get_sync() before starting the suspend sequence),
> we then need to make the driver handle that by itself.
Yeah, I still think we need to allow a bus/pm_domain to override that
behavior.
Kevin
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists