2021-07-25 04:29:31

by Michał Mirosław

[permalink] [raw]
Subject: [PATCH v3 2/5] mmc: sdhci: always obey programmable clock config in preset value

When host controller uses programmable clock presets but doesn't
advertise programmable clock support, we can only guess what frequency
it generates. Let's at least return correct SDHCI_PROG_CLOCK_MODE bit
value in this case.

Fixes: 52983382c74f ("mmc: sdhci: enhance preset value function")
Signed-off-by: Michał Mirosław <[email protected]>
---
v3: added a comment for this case
v2: no changes
---
drivers/mmc/host/sdhci.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index c7438dd13e3e..3ab60e7f936b 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1859,11 +1859,14 @@ u16 sdhci_calc_clk(struct sdhci_host *host, unsigned int clock,

pre_val = sdhci_get_preset_value(host);
div = FIELD_GET(SDHCI_PRESET_SDCLK_FREQ_MASK, pre_val);
- if (host->clk_mul &&
- (pre_val & SDHCI_PRESET_CLKGEN_SEL)) {
+ if (pre_val & SDHCI_PRESET_CLKGEN_SEL) {
clk = SDHCI_PROG_CLOCK_MODE;
real_div = div + 1;
clk_mul = host->clk_mul;
+ if (!clk_mul) {
+ /* The clock frequency is unknown. Assume undivided base. */
+ clk_mul = 1;
+ }
} else {
real_div = max_t(int, 1, div << 1);
}
--
2.30.2