diff mbox series

[V4] mmc: sdhci-msm: Update system suspend/resume callbacks of sdhci-msm platform driver

Message ID 1582181100-29914-1-git-send-email-sbhanu@codeaurora.org
State New
Headers show
Series [V4] mmc: sdhci-msm: Update system suspend/resume callbacks of sdhci-msm platform driver | expand

Commit Message

Shaik Sajida Bhanu Feb. 20, 2020, 6:45 a.m. UTC
The existing suspend/resume callbacks of sdhci-msm driver are just
gating/un-gating the clocks. During suspend cycle more can be done
like disabling controller, disabling card detection, enabling wake-up events.

So updating the system pm callbacks for performing these extra
actions besides controlling the clocks.

Signed-off-by: Shaik Sajida Bhanu <sbhanu@codeaurora.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---
Changes since V3:
    Invoking sdhci & cqhci resume if sdhci_host_suspend fails.
    Removed condition check before invoking cqhci_resume since its a dummy function.

Changes since V2:
    Removed disabling/enabling pwr-irq from system pm ops.

Changes since V1:
    Invoking pm_runtime_force_suspend/resume instead of
    sdhci_msm_runtime_suepend/resume.
---
 drivers/mmc/host/sdhci-msm.c | 47 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 45 insertions(+), 2 deletions(-)

Comments

Veerabhadrarao Badiganti March 5, 2020, 1:56 p.m. UTC | #1
On 3/4/2020 10:16 PM, Stephen Boyd wrote:
> Quoting Ulf Hansson (2020-03-04 07:34:29)
>> On Thu, 20 Feb 2020 at 07:45, Shaik Sajida Bhanu <sbhanu@codeaurora.org> wrote:
>>> The existing suspend/resume callbacks of sdhci-msm driver are just
>>> gating/un-gating the clocks. During suspend cycle more can be done
>>> like disabling controller, disabling card detection, enabling wake-up events.
>>>
>>> So updating the system pm callbacks for performing these extra
>>> actions besides controlling the clocks.
>>>
>>> Signed-off-by: Shaik Sajida Bhanu <sbhanu@codeaurora.org>
>>> Reviewed-by: Stephen Boyd <swboyd@chromium.org>
>>> ---
>>> Changes since V3:
>>>      Invoking sdhci & cqhci resume if sdhci_host_suspend fails.
>>>      Removed condition check before invoking cqhci_resume since its a dummy function.
>>>
>>> Changes since V2:
>>>      Removed disabling/enabling pwr-irq from system pm ops.
>>>
>>> Changes since V1:
>>>      Invoking pm_runtime_force_suspend/resume instead of
>>>      sdhci_msm_runtime_suepend/resume.
>>> diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
>>> index 3955fa5d..3559b50 100644
>>> --- a/drivers/mmc/host/sdhci-msm.c
>>> +++ b/drivers/mmc/host/sdhci-msm.c
>>> @@ -2159,9 +2159,52 @@ static __maybe_unused int sdhci_msm_runtime_resume(struct device *dev)
> [...]
>>> +
>>> +       ret = sdhci_suspend_host(host);
>>> +       if (ret)
>>> +               goto resume_cqhci;
>> sdhci_suspend_host() can't be called on a device that has been runtime
>> suspended, as that would lead to accessing device registers when
>> clocks/PM domains are gated.
>>
>> Depending on how the corresponding cqhci device is managed from a
>> runtime PM point of view, it could also be problematic to call
>> cqhci_suspend().
> There seems to be another patch floating around here[1] that is an
> attempt at a fix to this patch. They should probably be combined so that
> it's not confusing what's going on.

The other fix is altogether different. It is the fix for the issue seen 
with run-time pm.

whereas this change is for system pm.

>>> +
>>> +       ret = pm_runtime_force_suspend(dev);
>> It looks to me that perhaps you could make use of solely
>> pm_runtime_force_suspend(), then just skip calling
>> sdhci_suspend|resume_host() altogether. Do you think that could work?
> Does that do all the things the commit text mentions is desired for
> system suspend?
>
>>> like disabling controller, disabling card detection, enabling wake-up events.
> [1] https://lore.kernel.org/linux-arm-msm/1583322863-21790-1-git-send-email-vbadigan@codeaurora.org/
diff mbox series

Patch

diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 3955fa5d..3559b50 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -2159,9 +2159,52 @@  static __maybe_unused int sdhci_msm_runtime_resume(struct device *dev)
 	return 0;
 }
 
+static int sdhci_msm_suspend(struct device *dev)
+{
+	struct sdhci_host *host = dev_get_drvdata(dev);
+	int ret;
+
+	if (host->mmc->caps2 & MMC_CAP2_CQE) {
+		ret = cqhci_suspend(host->mmc);
+		if (ret)
+			return ret;
+	}
+
+	ret = sdhci_suspend_host(host);
+	if (ret)
+		goto resume_cqhci;
+
+	ret = pm_runtime_force_suspend(dev);
+	if (!ret)
+		return ret;
+
+	sdhci_resume_host(host);
+
+resume_cqhci:
+	cqhci_resume(host->mmc);
+	return ret;
+}
+
+static int sdhci_msm_resume(struct device *dev)
+{
+	struct sdhci_host *host = dev_get_drvdata(dev);
+	int ret;
+
+	ret = pm_runtime_force_resume(dev);
+	if (ret)
+		return ret;
+
+	ret = sdhci_resume_host(host);
+	if (ret < 0)
+		return ret;
+
+	ret = cqhci_resume(host->mmc);
+	return ret;
+}
+
 static const struct dev_pm_ops sdhci_msm_pm_ops = {
-	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
-				pm_runtime_force_resume)
+	SET_SYSTEM_SLEEP_PM_OPS(sdhci_msm_suspend,
+				sdhci_msm_resume)
 	SET_RUNTIME_PM_OPS(sdhci_msm_runtime_suspend,
 			   sdhci_msm_runtime_resume,
 			   NULL)