public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Adrian Hunter <adrian.hunter@intel.com>
To: Ulf Hansson <ulf.hansson@linaro.org>
Cc: Liming Sun <limings@nvidia.com>,
	David Thompson <davthompson@nvidia.com>,
	Shawn Lin <shawn.lin@rock-chips.com>,
	linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v7] mmc: sdhci-of-dwcmshc: Add runtime PM operations
Date: Thu, 10 Aug 2023 15:44:39 +0300	[thread overview]
Message-ID: <a2f6cd0e-8429-3468-9dcf-a5022717e2ae@intel.com> (raw)
In-Reply-To: <CAPDyKFp28mmbRAGf14u8KTO3v7H=SFAYbwcz7xeb1m4tD_G2vQ@mail.gmail.com>

On 10/08/23 13:21, Ulf Hansson wrote:
> On Thu, 10 Aug 2023 at 10:13, Adrian Hunter <adrian.hunter@intel.com> wrote:
>>
>> On 8/08/23 23:23, Liming Sun wrote:
>>> This commit implements the runtime PM operations to disable eMMC
>>> card clock when idle.
>>>
>>> Reviewed-by: David Thompson <davthompson@nvidia.com>
>>> Signed-off-by: Liming Sun <limings@nvidia.com>
>>> ---
>>> v6->v7:
>>>     - Address Ulf's comment;
>>> v5->v6:
>>>     - Address Adrian's more comments and add coordination between
>>>       runtime PM and system PM;
>>> v4->v5:
>>>     - Address Adrian's comment to move the pm_enable to the end to
>>>       avoid race;
>>> v3->v4:
>>>     - Fix compiling reported by 'kernel test robot';
>>> v2->v3:
>>>     - Revise the commit message;
>>> v1->v2:
>>>     Updates for comments from Ulf:
>>>     - Make the runtime PM logic generic for sdhci-of-dwcmshc;
>>> v1: Initial version.
>>> ---
>>>  drivers/mmc/host/sdhci-of-dwcmshc.c | 72 ++++++++++++++++++++++++++++-
>>>  1 file changed, 70 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c
>>> index e68cd87998c8..c8e145031429 100644
>>> --- a/drivers/mmc/host/sdhci-of-dwcmshc.c
>>> +++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
>>> @@ -15,6 +15,7 @@
>>>  #include <linux/module.h>
>>>  #include <linux/of.h>
>>>  #include <linux/of_device.h>
>>> +#include <linux/pm_runtime.h>
>>>  #include <linux/reset.h>
>>>  #include <linux/sizes.h>
>>>
>>> @@ -548,9 +549,13 @@ static int dwcmshc_probe(struct platform_device *pdev)
>>>
>>>       host->mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY;
>>>
>>> +     pm_runtime_get_noresume(dev);
>>> +     pm_runtime_set_active(dev);
>>> +     pm_runtime_enable(dev);
>>> +
>>>       err = sdhci_setup_host(host);
>>>       if (err)
>>> -             goto err_clk;
>>> +             goto err_rpm;
>>>
>>>       if (rk_priv)
>>>               dwcmshc_rk35xx_postinit(host, priv);
>>> @@ -559,10 +564,15 @@ static int dwcmshc_probe(struct platform_device *pdev)
>>>       if (err)
>>>               goto err_setup_host;
>>>
>>> +     pm_runtime_put(dev);
>>> +
>>>       return 0;
>>>
>>>  err_setup_host:
>>>       sdhci_cleanup_host(host);
>>> +err_rpm:
>>> +     pm_runtime_disable(dev);
>>> +     pm_runtime_put_noidle(dev);
>>>  err_clk:
>>>       clk_disable_unprepare(pltfm_host->clk);
>>>       clk_disable_unprepare(priv->bus_clk);
>>> @@ -606,6 +616,12 @@ static int dwcmshc_suspend(struct device *dev)
>>>       if (ret)
>>>               return ret;
>>>
>>> +     ret = pm_runtime_force_suspend(dev);
>>> +     if (ret) {
>>> +             sdhci_resume_host(host);
>>> +             return ret;
>>> +     }
>>
>> Since you are only using the runtime PM callbacks to turn off the card
>> clock via SDHCI_CLOCK_CONTROL, pm_runtime_force_suspend() and
>> pm_runtime_force_resume() are not needed at all.
> 
> Right, it can be done without these too.
> 
>>
>> sdhci_suspend_host() does not care if SDHCI_CLOCK_CARD_EN is on or off.
>> (And you are disabling pltfm_host->clk and priv->bus_clk, so presumably
>> the result is no clock either way)
>>
>> sdhci_resume_host() does not restore state unless
>> SDHCI_QUIRK2_HOST_OFF_CARD_ON is used, it just resets, so the internal clock
>> SDHCI_CLOCK_INT_EN is off which is consistent with either runtime suspended
>> or runtime resumed.
> 
> Even if this may work, to me, it doesn't look like good practice for
> how to use runtime PM in combination with system wide suspend/resume.
> 
> The point is, sdhci_suspend|resume_host() may end up reading/writing
> to sdhci registers - and we should *not* allow that (because it may
> not always work), unless the sdhci controller has been runtime resumed
> first, right?

I am OK with drivers that just want to use runtime PM to turn off a
functional clock.  sdhci-tegra.c is also doing that although using the
clock framework.

Certainly that approach assumes that the host controller's power state
is not changed due to runtime PM.

To ensure that the host controller is runtime resumed before calling
sdhci_suspend_host(), we can just call pm_runtime_resume() I think.


  reply	other threads:[~2023-08-10 12:44 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-11 19:03 [PATCH v1 1/1] mmc: sdhci-of-dwcmshc: Add runtime PM operations for BlueField-3 Liming Sun
2023-05-12  7:35 ` Ulf Hansson
2023-05-12 12:09   ` Liming Sun
2023-05-12 12:20 ` [PATCH v2] " Liming Sun
2023-05-12 12:26 ` [PATCH v3] mmc: sdhci-of-dwcmshc: Add runtime PM operations Liming Sun
2023-05-12 17:43   ` kernel test robot
2023-05-12 18:15 ` [PATCH v4] " Liming Sun
2023-05-19 13:19   ` Adrian Hunter
2023-07-28 12:20     ` Liming Sun
2023-07-28 12:20 ` [PATCH v5] " Liming Sun
2023-08-01 15:36   ` Adrian Hunter
2023-08-04 23:29     ` Liming Sun
2023-08-04 23:30 ` [PATCH v6] " Liming Sun
2023-08-08  9:39   ` Ulf Hansson
2023-08-08 13:21     ` Liming Sun
2023-08-08 13:56       ` Ulf Hansson
2023-08-08 20:24         ` Liming Sun
2023-08-09 10:58   ` Ulf Hansson
2023-08-08 20:23 ` [PATCH v7] " Liming Sun
2023-08-10  8:12   ` Adrian Hunter
2023-08-10 10:21     ` Ulf Hansson
2023-08-10 12:44       ` Adrian Hunter [this message]
2023-08-10 16:34         ` Ulf Hansson
2023-08-11  5:56           ` Adrian Hunter
2023-08-11  8:36             ` Ulf Hansson
2023-08-16 16:28               ` Liming Sun
2023-08-16 21:40                 ` Ulf Hansson
2023-08-17  1:06 ` [PATCH v8] " Liming Sun
2023-08-17  7:35   ` Adrian Hunter
2023-08-17 16:22     ` Liming Sun
2023-08-18  7:27       ` Adrian Hunter
2023-08-17 16:21 ` [PATCH v9] " Liming Sun
2023-08-18  9:00   ` Ulf Hansson
2023-08-18  9:35     ` Adrian Hunter
2023-08-18 10:19       ` Ulf Hansson
2023-08-22 19:46         ` Liming Sun
2023-08-22 19:59 ` [PATCH v10 1/2] mmc : sdhci-of-dwcmshc : add error handling in dwcmshc_resume Liming Sun
2023-08-24  7:25   ` Adrian Hunter
2023-08-24 11:00   ` Ulf Hansson
2023-08-22 19:59 ` [PATCH v10 2/2] This commit implements the runtime PM operations to disable eMMC card clock when idle Liming Sun
2023-08-24  7:28   ` Adrian Hunter
2023-08-24 11:00   ` Ulf Hansson

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=a2f6cd0e-8429-3468-9dcf-a5022717e2ae@intel.com \
    --to=adrian.hunter@intel.com \
    --cc=davthompson@nvidia.com \
    --cc=limings@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=shawn.lin@rock-chips.com \
    --cc=ulf.hansson@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox