+++ /dev/null
-From 97904a59855c7ac7c613085bc6bdc550d48524ff Mon Sep 17 00:00:00 2001
-From: Kamal Dasu <kdasu.kdev@gmail.com>
-Date: Fri, 20 May 2022 14:31:08 -0400
-Subject: mmc: sdhci-brcmstb: Add ability to increase max clock rate for 72116b0
-
-From: Kamal Dasu <kdasu.kdev@gmail.com>
-
-commit 97904a59855c7ac7c613085bc6bdc550d48524ff upstream.
-
-The 72116B0 has improved SDIO controllers that allow the max clock
-rate to be increased from a max of 100MHz to a max of 150MHz. The
-driver will need to get the clock and increase it's default rate
-and override the caps register, that still indicates a max of 100MHz.
-The new clock will be named "sdio_freq" in the DT node's "clock-names"
-list. The driver will use a DT property, "clock-frequency", to
-enable this functionality and will get the actual rate in MHz
-from the property to allow various speeds to be requested.
-
-Signed-off-by: Al Cooper <alcooperx@gmail.com>
-Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com>
-Acked-by: Florian Fainelli <f.fainelli@gmail.com>
-Link: https://lore.kernel.org/r/20220520183108.47358-3-kdasu.kdev@gmail.com
-Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-Signed-off-by: Kamal Dasu <kamal.dasu@broadcom.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/mmc/host/sdhci-brcmstb.c | 69 ++++++++++++++++++++++++++++++++++++++-
- 1 file changed, 68 insertions(+), 1 deletion(-)
-
---- a/drivers/mmc/host/sdhci-brcmstb.c
-+++ b/drivers/mmc/host/sdhci-brcmstb.c
-@@ -32,6 +32,8 @@
- struct sdhci_brcmstb_priv {
- void __iomem *cfg_regs;
- unsigned int flags;
-+ struct clk *base_clk;
-+ u32 base_freq_hz;
- };
-
- struct brcmstb_match_priv {
-@@ -251,9 +253,11 @@ static int sdhci_brcmstb_probe(struct pl
- struct sdhci_pltfm_host *pltfm_host;
- const struct of_device_id *match;
- struct sdhci_brcmstb_priv *priv;
-+ u32 actual_clock_mhz;
- struct sdhci_host *host;
- struct resource *iomem;
- struct clk *clk;
-+ struct clk *base_clk;
- int res;
-
- match = of_match_node(sdhci_brcm_of_match, pdev->dev.of_node);
-@@ -331,6 +335,35 @@ static int sdhci_brcmstb_probe(struct pl
- if (match_priv->flags & BRCMSTB_MATCH_FLAGS_BROKEN_TIMEOUT)
- host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
-
-+ /* Change the base clock frequency if the DT property exists */
-+ if (device_property_read_u32(&pdev->dev, "clock-frequency",
-+ &priv->base_freq_hz) != 0)
-+ goto add_host;
-+
-+ base_clk = devm_clk_get_optional(&pdev->dev, "sdio_freq");
-+ if (IS_ERR(base_clk)) {
-+ dev_warn(&pdev->dev, "Clock for \"sdio_freq\" not found\n");
-+ goto add_host;
-+ }
-+
-+ res = clk_prepare_enable(base_clk);
-+ if (res)
-+ goto err;
-+
-+ /* set improved clock rate */
-+ clk_set_rate(base_clk, priv->base_freq_hz);
-+ actual_clock_mhz = clk_get_rate(base_clk) / 1000000;
-+
-+ host->caps &= ~SDHCI_CLOCK_V3_BASE_MASK;
-+ host->caps |= (actual_clock_mhz << SDHCI_CLOCK_BASE_SHIFT);
-+ /* Disable presets because they are now incorrect */
-+ host->quirks2 |= SDHCI_QUIRK2_PRESET_VALUE_BROKEN;
-+
-+ dev_dbg(&pdev->dev, "Base Clock Frequency changed to %dMHz\n",
-+ actual_clock_mhz);
-+ priv->base_clk = base_clk;
-+
-+add_host:
- res = sdhci_brcmstb_add_host(host, priv);
- if (res)
- goto err;
-@@ -341,6 +374,7 @@ static int sdhci_brcmstb_probe(struct pl
- err:
- sdhci_pltfm_free(pdev);
- err_clk:
-+ clk_disable_unprepare(base_clk);
- clk_disable_unprepare(clk);
- return res;
- }
-@@ -352,11 +386,44 @@ static void sdhci_brcmstb_shutdown(struc
-
- MODULE_DEVICE_TABLE(of, sdhci_brcm_of_match);
-
-+#ifdef CONFIG_PM_SLEEP
-+static int sdhci_brcmstb_suspend(struct device *dev)
-+{
-+ struct sdhci_host *host = dev_get_drvdata(dev);
-+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
-+ struct sdhci_brcmstb_priv *priv = sdhci_pltfm_priv(pltfm_host);
-+
-+ clk_disable_unprepare(priv->base_clk);
-+ return sdhci_pltfm_suspend(dev);
-+}
-+
-+static int sdhci_brcmstb_resume(struct device *dev)
-+{
-+ struct sdhci_host *host = dev_get_drvdata(dev);
-+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
-+ struct sdhci_brcmstb_priv *priv = sdhci_pltfm_priv(pltfm_host);
-+ int ret;
-+
-+ ret = sdhci_pltfm_resume(dev);
-+ if (!ret && priv->base_freq_hz) {
-+ ret = clk_prepare_enable(priv->base_clk);
-+ if (!ret)
-+ ret = clk_set_rate(priv->base_clk, priv->base_freq_hz);
-+ }
-+
-+ return ret;
-+}
-+#endif
-+
-+static const struct dev_pm_ops sdhci_brcmstb_pmops = {
-+ SET_SYSTEM_SLEEP_PM_OPS(sdhci_brcmstb_suspend, sdhci_brcmstb_resume)
-+};
-+
- static struct platform_driver sdhci_brcmstb_driver = {
- .driver = {
- .name = "sdhci-brcmstb",
- .probe_type = PROBE_PREFER_ASYNCHRONOUS,
-- .pm = &sdhci_pltfm_pmops,
-+ .pm = &sdhci_brcmstb_pmops,
- .of_match_table = of_match_ptr(sdhci_brcm_of_match),
- },
- .probe = sdhci_brcmstb_probe,
+++ /dev/null
-From c3c0ed75ffbff5c70667030b5139bbb75b0a30f5 Mon Sep 17 00:00:00 2001
-From: Nathan Chancellor <nathan@kernel.org>
-Date: Wed, 8 Jun 2022 08:27:57 -0700
-Subject: mmc: sdhci-brcmstb: Initialize base_clk to NULL in sdhci_brcmstb_probe()
-
-From: Nathan Chancellor <nathan@kernel.org>
-
-commit c3c0ed75ffbff5c70667030b5139bbb75b0a30f5 upstream.
-
-Clang warns a few times along the lines of:
-
- drivers/mmc/host/sdhci-brcmstb.c:302:6: warning: variable 'base_clk' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
- if (res)
- ^~~
- drivers/mmc/host/sdhci-brcmstb.c:376:24: note: uninitialized use occurs here
- clk_disable_unprepare(base_clk);
- ^~~~~~~~
-
-base_clk is used in the error path before it is initialized. Initialize
-it to NULL, as clk_disable_unprepare() calls clk_disable() and
-clk_unprepare(), which both handle NULL pointers gracefully.
-
-Link: https://github.com/ClangBuiltLinux/linux/issues/1650
-Reported-by: kernel test robot <lkp@intel.com>
-Signed-off-by: Nathan Chancellor <nathan@kernel.org>
-Acked-by: Florian Fainelli <f.fainelli@gmail.com>
-Acked-by: Adrian Hunter <adrian.hunter@intel.com>
-Link: https://lore.kernel.org/r/20220608152757.82529-1-nathan@kernel.org
-Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-Signed-off-by: Kamal Dasu <kamal.dasu@broadcom.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/mmc/host/sdhci-brcmstb.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/mmc/host/sdhci-brcmstb.c
-+++ b/drivers/mmc/host/sdhci-brcmstb.c
-@@ -257,7 +257,7 @@ static int sdhci_brcmstb_probe(struct pl
- struct sdhci_host *host;
- struct resource *iomem;
- struct clk *clk;
-- struct clk *base_clk;
-+ struct clk *base_clk = NULL;
- int res;
-
- match = of_match_node(sdhci_brcm_of_match, pdev->dev.of_node);
+++ /dev/null
-From 886201c70a1cab34ef96f867c2b2dd6379ffa7b9 Mon Sep 17 00:00:00 2001
-From: Kamal Dasu <kdasu.kdev@gmail.com>
-Date: Thu, 14 Jul 2022 13:41:32 -0400
-Subject: mmc: sdhci-brcmstb: use clk_get_rate(base_clk) in PM resume
-
-From: Kamal Dasu <kdasu.kdev@gmail.com>
-
-commit 886201c70a1cab34ef96f867c2b2dd6379ffa7b9 upstream.
-
-Use clk_get_rate for base_clk on resume before setting new rate.
-This change ensures that the clock api returns current rate
-and sets the clock to the desired rate and honors CLK_GET_NO_CACHE
-attribute used by clock api.
-
-Fixes: 97904a59855c (mmc: sdhci-brcmstb: Add ability to increase max clock rate for 72116b0)
-Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com>
-Acked-by: Florian Fainelli <f.fainelli@gmail.com>
-Link: https://lore.kernel.org/r/20220714174132.18541-1-kdasu.kdev@gmail.com
-Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-Signed-off-by: Kamal Dasu <kamal.dasu@broadcom.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/mmc/host/sdhci-brcmstb.c | 9 ++++++++-
- 1 file changed, 8 insertions(+), 1 deletion(-)
-
---- a/drivers/mmc/host/sdhci-brcmstb.c
-+++ b/drivers/mmc/host/sdhci-brcmstb.c
-@@ -407,7 +407,14 @@ static int sdhci_brcmstb_resume(struct d
- ret = sdhci_pltfm_resume(dev);
- if (!ret && priv->base_freq_hz) {
- ret = clk_prepare_enable(priv->base_clk);
-- if (!ret)
-+ /*
-+ * Note: using clk_get_rate() below as clk_get_rate()
-+ * honors CLK_GET_RATE_NOCACHE attribute, but clk_set_rate()
-+ * may do implicit get_rate() calls that do not honor
-+ * CLK_GET_RATE_NOCACHE.
-+ */
-+ if (!ret &&
-+ (clk_get_rate(priv->base_clk) != priv->base_freq_hz))
- ret = clk_set_rate(priv->base_clk, priv->base_freq_hz);
- }
-