1 From 7b7e71683b4ccbe0dbd7d434707623327e852f20 Mon Sep 17 00:00:00 2001
2 From: Ben Chuang <ben.chuang@genesyslogic.com.tw>
3 Date: Thu, 11 Sep 2025 10:40:20 +0800
4 Subject: mmc: sdhci: Move the code related to setting the clock from sdhci_set_ios_common() into sdhci_set_ios()
6 From: Ben Chuang <ben.chuang@genesyslogic.com.tw>
8 commit 7b7e71683b4ccbe0dbd7d434707623327e852f20 upstream.
10 The sdhci_set_clock() is called in sdhci_set_ios_common() and
11 __sdhci_uhs2_set_ios(). According to Section 3.13.2 "Card Interface
12 Detection Sequence" of the SD Host Controller Standard Specification
13 Version 7.00, the SD clock is supplied after power is supplied, so we only
14 need one in __sdhci_uhs2_set_ios(). Let's move the code related to setting
15 the clock from sdhci_set_ios_common() into sdhci_set_ios() and modify
16 the parameters passed to sdhci_set_clock() in __sdhci_uhs2_set_ios().
18 Fixes: 10c8298a052b ("mmc: sdhci-uhs2: add set_ios()")
19 Cc: stable@vger.kernel.org # v6.13+
20 Signed-off-by: Ben Chuang <ben.chuang@genesyslogic.com.tw>
21 Acked-by: Adrian Hunter <adrian.hunter@intel.com>
22 Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
23 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
25 drivers/mmc/host/sdhci-uhs2.c | 3 ++-
26 drivers/mmc/host/sdhci.c | 34 +++++++++++++++++-----------------
27 2 files changed, 19 insertions(+), 18 deletions(-)
29 --- a/drivers/mmc/host/sdhci-uhs2.c
30 +++ b/drivers/mmc/host/sdhci-uhs2.c
31 @@ -295,7 +295,8 @@ static void __sdhci_uhs2_set_ios(struct
33 sdhci_uhs2_set_power(host, ios->power_mode, ios->vdd);
35 - sdhci_set_clock(host, host->clock);
36 + sdhci_set_clock(host, ios->clock);
37 + host->clock = ios->clock;
40 static int sdhci_uhs2_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
41 --- a/drivers/mmc/host/sdhci.c
42 +++ b/drivers/mmc/host/sdhci.c
43 @@ -2367,23 +2367,6 @@ void sdhci_set_ios_common(struct mmc_hos
44 (ios->power_mode == MMC_POWER_UP) &&
45 !(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN))
46 sdhci_enable_preset_value(host, false);
48 - if (!ios->clock || ios->clock != host->clock) {
49 - host->ops->set_clock(host, ios->clock);
50 - host->clock = ios->clock;
52 - if (host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK &&
54 - host->timeout_clk = mmc->actual_clock ?
55 - mmc->actual_clock / 1000 :
57 - mmc->max_busy_timeout =
58 - host->ops->get_max_timeout_count ?
59 - host->ops->get_max_timeout_count(host) :
61 - mmc->max_busy_timeout /= host->timeout_clk;
65 EXPORT_SYMBOL_GPL(sdhci_set_ios_common);
67 @@ -2410,6 +2393,23 @@ void sdhci_set_ios(struct mmc_host *mmc,
69 sdhci_set_ios_common(mmc, ios);
71 + if (!ios->clock || ios->clock != host->clock) {
72 + host->ops->set_clock(host, ios->clock);
73 + host->clock = ios->clock;
75 + if (host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK &&
77 + host->timeout_clk = mmc->actual_clock ?
78 + mmc->actual_clock / 1000 :
80 + mmc->max_busy_timeout =
81 + host->ops->get_max_timeout_count ?
82 + host->ops->get_max_timeout_count(host) :
84 + mmc->max_busy_timeout /= host->timeout_clk;
88 if (host->ops->set_power)
89 host->ops->set_power(host, ios->power_mode, ios->vdd);