]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mmc: sdhci: Move the code related to setting the clock from sdhci_set_ios_common...
authorBen Chuang <ben.chuang@genesyslogic.com.tw>
Thu, 11 Sep 2025 02:40:20 +0000 (10:40 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Fri, 12 Sep 2025 13:00:52 +0000 (15:00 +0200)
The sdhci_set_clock() is called in sdhci_set_ios_common() and
__sdhci_uhs2_set_ios(). According to Section 3.13.2 "Card Interface
Detection Sequence" of the SD Host Controller Standard Specification
Version 7.00, the SD clock is supplied after power is supplied, so we only
need one in __sdhci_uhs2_set_ios(). Let's move the code related to setting
the clock from sdhci_set_ios_common() into sdhci_set_ios() and modify
the parameters passed to sdhci_set_clock() in __sdhci_uhs2_set_ios().

Fixes: 10c8298a052b ("mmc: sdhci-uhs2: add set_ios()")
Cc: stable@vger.kernel.org # v6.13+
Signed-off-by: Ben Chuang <ben.chuang@genesyslogic.com.tw>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-uhs2.c
drivers/mmc/host/sdhci.c

index 0efeb9d0c3765ab7378d92a7f43a4f771f31f77b..18fb6ee5b96a985c45922674600a96ddb9cea3c0 100644 (file)
@@ -295,7 +295,8 @@ static void __sdhci_uhs2_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
        else
                sdhci_uhs2_set_power(host, ios->power_mode, ios->vdd);
 
-       sdhci_set_clock(host, host->clock);
+       sdhci_set_clock(host, ios->clock);
+       host->clock = ios->clock;
 }
 
 static int sdhci_uhs2_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
index 3a17821efa5ca92c6c29141d8fcb9ebf58355cc7..ac7e11f37af71fa5a70eb579fd812227b9347f83 100644 (file)
@@ -2367,23 +2367,6 @@ void sdhci_set_ios_common(struct mmc_host *mmc, struct mmc_ios *ios)
                (ios->power_mode == MMC_POWER_UP) &&
                !(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN))
                sdhci_enable_preset_value(host, false);
-
-       if (!ios->clock || ios->clock != host->clock) {
-               host->ops->set_clock(host, ios->clock);
-               host->clock = ios->clock;
-
-               if (host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK &&
-                   host->clock) {
-                       host->timeout_clk = mmc->actual_clock ?
-                                               mmc->actual_clock / 1000 :
-                                               host->clock / 1000;
-                       mmc->max_busy_timeout =
-                               host->ops->get_max_timeout_count ?
-                               host->ops->get_max_timeout_count(host) :
-                               1 << 27;
-                       mmc->max_busy_timeout /= host->timeout_clk;
-               }
-       }
 }
 EXPORT_SYMBOL_GPL(sdhci_set_ios_common);
 
@@ -2410,6 +2393,23 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 
        sdhci_set_ios_common(mmc, ios);
 
+       if (!ios->clock || ios->clock != host->clock) {
+               host->ops->set_clock(host, ios->clock);
+               host->clock = ios->clock;
+
+               if (host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK &&
+                   host->clock) {
+                       host->timeout_clk = mmc->actual_clock ?
+                                               mmc->actual_clock / 1000 :
+                                               host->clock / 1000;
+                       mmc->max_busy_timeout =
+                               host->ops->get_max_timeout_count ?
+                               host->ops->get_max_timeout_count(host) :
+                               1 << 27;
+                       mmc->max_busy_timeout /= host->timeout_clk;
+               }
+       }
+
        if (host->ops->set_power)
                host->ops->set_power(host, ios->power_mode, ios->vdd);
        else