git: bd15d31cef50 - main - mmc(4): Don't call bridge driver for timings not requiring tuning
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 18 Apr 2023 17:17:42 UTC
The branch main has been updated by marius:
URL: https://cgit.FreeBSD.org/src/commit/?id=bd15d31cef50060d90356384ba7b878d398fc9f3
commit bd15d31cef50060d90356384ba7b878d398fc9f3
Author: Marius Strobl <marius@FreeBSD.org>
AuthorDate: 2023-04-12 21:46:02 +0000
Commit: Marius Strobl <marius@FreeBSD.org>
CommitDate: 2023-04-18 17:17:24 +0000
mmc(4): Don't call bridge driver for timings not requiring tuning
The original idea behind calling into the bridge driver was to have the
logic deciding whether tuning is actually required for a particular bus
timing in a given slot as well as doing the sanity checking only on the
controller layer which also generally is better suited for these due to
say SDHCI_SDR50_NEEDS_TUNING. On another thought, not every such driver
should need to check whether tuning is required at all, though, and not
everything is SDHCI in the first place.
Adjust sdhci{,_fsl_fdt}(4) accordingly, but keep sdhci_generic_tune() a
bit cautious still.
---
sys/dev/mmc/mmc.c | 9 +++++++++
sys/dev/sdhci/sdhci.c | 6 ++++--
sys/dev/sdhci/sdhci_fsl_fdt.c | 17 +++--------------
3 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/sys/dev/mmc/mmc.c b/sys/dev/mmc/mmc.c
index 5fce6cbf47a1..54caadb2b3c7 100644
--- a/sys/dev/mmc/mmc.c
+++ b/sys/dev/mmc/mmc.c
@@ -2237,6 +2237,15 @@ clock:
mmcbr_set_clock(dev, max_dtr);
mmcbr_update_ios(dev);
+ /*
+ * Don't call into the bridge driver for timings definitely
+ * not requiring tuning. Note that it's up to the upper
+ * layer to actually execute tuning otherwise.
+ */
+ if (timing <= bus_timing_uhs_sdr25 ||
+ timing == bus_timing_mmc_ddr52)
+ goto power_class;
+
if (mmcbr_tune(dev, hs400) != 0) {
device_printf(dev, "Card at relative address %d "
"failed to execute initial tuning\n", rca);
diff --git a/sys/dev/sdhci/sdhci.c b/sys/dev/sdhci/sdhci.c
index a7283e66df31..69dbd3d7ffd7 100644
--- a/sys/dev/sdhci/sdhci.c
+++ b/sys/dev/sdhci/sdhci.c
@@ -1492,10 +1492,12 @@ sdhci_generic_tune(device_t brdev __unused, device_t reqdev, bool hs400)
case bus_timing_uhs_sdr50:
if (slot->opt & SDHCI_SDR50_NEEDS_TUNING)
break;
- /* FALLTHROUGH */
- default:
SDHCI_UNLOCK(slot);
return (0);
+ default:
+ slot_printf(slot, "Tuning requested but not required.\n");
+ SDHCI_UNLOCK(slot);
+ return (EINVAL);
}
tune_cmd = slot->tune_cmd;
diff --git a/sys/dev/sdhci/sdhci_fsl_fdt.c b/sys/dev/sdhci/sdhci_fsl_fdt.c
index 470cbd169303..2c600e1291fe 100644
--- a/sys/dev/sdhci/sdhci_fsl_fdt.c
+++ b/sys/dev/sdhci/sdhci_fsl_fdt.c
@@ -1199,22 +1199,10 @@ sdhci_fsl_fdt_tune(device_t bus, device_t child, bool hs400)
sc = device_get_softc(bus);
slot = device_get_ivars(child);
- error = 0;
- clk_divider = sc->baseclk_hz / slot->clock;
- switch (sc->slot.host.ios.timing) {
- case bus_timing_mmc_hs400:
- return (EINVAL);
- case bus_timing_mmc_hs200:
- case bus_timing_uhs_ddr50:
- case bus_timing_uhs_sdr104:
- break;
- case bus_timing_uhs_sdr50:
- if (slot->opt & SDHCI_SDR50_NEEDS_TUNING)
- break;
- default:
+ if (sc->slot.host.ios.timing == bus_timing_uhs_sdr50 &&
+ !(slot->opt & SDHCI_SDR50_NEEDS_TUNING))
return (0);
- }
/*
* For tuning mode SD clock divider must be within 3 to 16.
@@ -1222,6 +1210,7 @@ sdhci_fsl_fdt_tune(device_t bus, device_t child, bool hs400)
* For that reason we're just bailing if the dividers don't match
* that requirement.
*/
+ clk_divider = sc->baseclk_hz / slot->clock;
if (clk_divider < 3 || clk_divider > 16)
return (ENXIO);