All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liming Sun <limings@nvidia.com>
To: Adrian Hunter <adrian.hunter@intel.com>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	David Thompson <davthompson@nvidia.com>,
	Shawn Lin <shawn.lin@rock-chips.com>
Cc: Liming Sun <limings@nvidia.com>, <linux-mmc@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: [PATCH v9] mmc: sdhci-of-dwcmshc: Add runtime PM operations
Date: Thu, 17 Aug 2023 12:21:59 -0400	[thread overview]
Message-ID: <20230817162159.242087-1-limings@nvidia.com> (raw)
In-Reply-To: <79137159a833c164ea8ea3f05d8d6d9537db2f42.1683747334.git.limings@nvidia.com>

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>
---
v8->v9:
    - Address Adrian's comment to do the pm_runtime_put() in
      dwcmshc_resume() instead; Error path changes not included yet.
v7->v8:
    - Address Ulf's comment (option-1);
    - Updates for Adrian's comment to remove the force_suspend/resume
      in dwcmshc_resume()/dwcmshc_suspend(); Add comments for
      dwcmshc_resume()/dwcmshc_suspend();
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 | 76 +++++++++++++++++++++++++++--
 1 file changed, 72 insertions(+), 4 deletions(-)

diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c
index e68cd87998c8..3b40f55ce2a4 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);
@@ -602,9 +612,13 @@ static int dwcmshc_suspend(struct device *dev)
 	struct rk35xx_priv *rk_priv = priv->priv;
 	int ret;
 
+	pm_runtime_get_sync(dev);
+
 	ret = sdhci_suspend_host(host);
-	if (ret)
+	if (ret) {
+		pm_runtime_put(dev);
 		return ret;
+	}
 
 	clk_disable_unprepare(pltfm_host->clk);
 	if (!IS_ERR(priv->bus_clk))
@@ -642,11 +656,65 @@ static int dwcmshc_resume(struct device *dev)
 			return ret;
 	}
 
-	return sdhci_resume_host(host);
+	ret = sdhci_resume_host(host);
+	if (ret)
+		return ret;
+
+	pm_runtime_put(dev);
+
+	return 0;
 }
 #endif
 
-static SIMPLE_DEV_PM_OPS(dwcmshc_pmops, dwcmshc_suspend, dwcmshc_resume);
+#ifdef CONFIG_PM
+
+static void dwcmshc_enable_card_clk(struct sdhci_host *host)
+{
+	u16 ctrl;
+
+	ctrl = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
+	if ((ctrl & SDHCI_CLOCK_INT_EN) && !(ctrl & SDHCI_CLOCK_CARD_EN)) {
+		ctrl |= SDHCI_CLOCK_CARD_EN;
+		sdhci_writew(host, ctrl, SDHCI_CLOCK_CONTROL);
+	}
+}
+
+static void dwcmshc_disable_card_clk(struct sdhci_host *host)
+{
+	u16 ctrl;
+
+	ctrl = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
+	if (ctrl & SDHCI_CLOCK_CARD_EN) {
+		ctrl &= ~SDHCI_CLOCK_CARD_EN;
+		sdhci_writew(host, ctrl, SDHCI_CLOCK_CONTROL);
+	}
+}
+
+static int dwcmshc_runtime_suspend(struct device *dev)
+{
+	struct sdhci_host *host = dev_get_drvdata(dev);
+
+	dwcmshc_disable_card_clk(host);
+
+	return 0;
+}
+
+static int dwcmshc_runtime_resume(struct device *dev)
+{
+	struct sdhci_host *host = dev_get_drvdata(dev);
+
+	dwcmshc_enable_card_clk(host);
+
+	return 0;
+}
+
+#endif
+
+static const struct dev_pm_ops dwcmshc_pmops = {
+	SET_SYSTEM_SLEEP_PM_OPS(dwcmshc_suspend, dwcmshc_resume)
+	SET_RUNTIME_PM_OPS(dwcmshc_runtime_suspend,
+			   dwcmshc_runtime_resume, NULL)
+};
 
 static struct platform_driver sdhci_dwcmshc_driver = {
 	.driver	= {
-- 
2.30.1


  parent reply	other threads:[~2023-08-17 16:22 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
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 ` Liming Sun [this message]
2023-08-18  9:00   ` [PATCH v9] " 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=20230817162159.242087-1-limings@nvidia.com \
    --to=limings@nvidia.com \
    --cc=adrian.hunter@intel.com \
    --cc=davthompson@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 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.