Make SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN respected also in programmable clock mode. Signed-off-by: Michał Mirosław <mirq-linux@xxxxxxxxxxxx> --- drivers/mmc/host/sdhci.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 01fd897f8f3c..df80f39c570b 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1807,9 +1807,6 @@ u16 sdhci_calc_clk(struct sdhci_host *host, unsigned int clock, div = DIV_ROUND_UP(host->max_clk, clock); - if (div == 1 && (host->quirks2 & SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN)) - div = 2; - if (host->version >= SDHCI_SPEC_300) { /* Version 3.00 divisors must be a multiple of 2. */ div = min(div, SDHCI_MAX_DIV_SPEC_300); @@ -1823,6 +1820,12 @@ u16 sdhci_calc_clk(struct sdhci_host *host, unsigned int clock, real_div = div * 2 + !div; clock_set: + if (!div && (host->quirks2 & SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN)) { + /* for div == 1, clock rate is divided by 2 in both modes */ + div = 1; + real_div = 2; + } + *actual_clock = (host->max_clk * clk_mul) / real_div; clk |= (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT; clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN) -- 2.20.1