|
@@ -1151,6 +1151,7 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
|
int real_div = div, clk_mul = 1;
|
|
|
u16 clk = 0;
|
|
|
unsigned long timeout;
|
|
|
+ bool switch_base_clk = false;
|
|
|
|
|
|
host->mmc->actual_clock = 0;
|
|
|
|
|
@@ -1188,15 +1189,25 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
|
<= clock)
|
|
|
break;
|
|
|
}
|
|
|
- /*
|
|
|
- * Set Programmable Clock Mode in the Clock
|
|
|
- * Control register.
|
|
|
- */
|
|
|
- clk = SDHCI_PROG_CLOCK_MODE;
|
|
|
- real_div = div;
|
|
|
- clk_mul = host->clk_mul;
|
|
|
- div--;
|
|
|
- } else {
|
|
|
+ if ((host->max_clk * host->clk_mul / div) <= clock) {
|
|
|
+ /*
|
|
|
+ * Set Programmable Clock Mode in the Clock
|
|
|
+ * Control register.
|
|
|
+ */
|
|
|
+ clk = SDHCI_PROG_CLOCK_MODE;
|
|
|
+ real_div = div;
|
|
|
+ clk_mul = host->clk_mul;
|
|
|
+ div--;
|
|
|
+ } else {
|
|
|
+ /*
|
|
|
+ * Divisor can be too small to reach clock
|
|
|
+ * speed requirement. Then use the base clock.
|
|
|
+ */
|
|
|
+ switch_base_clk = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!host->clk_mul || switch_base_clk) {
|
|
|
/* Version 3.00 divisors must be a multiple of 2. */
|
|
|
if (host->max_clk <= clock)
|
|
|
div = 1;
|