]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
sdhci-of-dwcmshc: disable PM runtime in dwcmshc_remove()
authorLiming Sun <limings@nvidia.com>
Tue, 19 Mar 2024 16:16:16 +0000 (12:16 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Apr 2024 13:32:40 +0000 (15:32 +0200)
commit 03749309909935070253accab314288d332a204d upstream.

This commit disables PM runtime in dwcmshc_remove() to avoid the
error message below when reloading the sdhci-of-dwcmshc.ko

  sdhci-dwcmshc MLNXBF30:00: Unbalanced pm_runtime_enable!

Fixes: 48fe8fadbe5e ("mmc: sdhci-of-dwcmshc: Add runtime PM operations")
Reviewed-by: David Thompson <davthompson@nvidia.com>
Signed-off-by: Liming Sun <limings@nvidia.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/b9155963ffb12d18375002bf9ac9a3f98b727fc8.1710854108.git.limings@nvidia.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/mmc/host/sdhci-of-dwcmshc.c

index a1f57af6acfb0bb927214f61693c1798b2995cb7..fa29460fd290394170218f267532bbdcd3430956 100644 (file)
@@ -933,6 +933,17 @@ free_pltfm:
        return err;
 }
 
+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 void dwcmshc_remove(struct platform_device *pdev)
 {
        struct sdhci_host *host = platform_get_drvdata(pdev);
@@ -940,8 +951,14 @@ static void dwcmshc_remove(struct platform_device *pdev)
        struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
        struct rk35xx_priv *rk_priv = priv->priv;
 
+       pm_runtime_get_sync(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
+       pm_runtime_put_noidle(&pdev->dev);
+
        sdhci_remove_host(host, 0);
 
+       dwcmshc_disable_card_clk(host);
+
        clk_disable_unprepare(pltfm_host->clk);
        clk_disable_unprepare(priv->bus_clk);
        if (rk_priv)
@@ -1033,17 +1050,6 @@ static void dwcmshc_enable_card_clk(struct sdhci_host *host)
        }
 }
 
-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);