|
@@ -1066,12 +1066,15 @@ static void sdhci_finish_command(struct sdhci_host *host)
|
|
|
static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
|
{
|
|
|
int div = 0; /* Initialized for compiler warning */
|
|
|
+ int real_div = div, clk_mul = 1;
|
|
|
u16 clk = 0;
|
|
|
unsigned long timeout;
|
|
|
|
|
|
if (clock == host->clock)
|
|
|
return;
|
|
|
|
|
|
+ host->mmc->actual_clock = 0;
|
|
|
+
|
|
|
if (host->ops->set_clock) {
|
|
|
host->ops->set_clock(host, clock);
|
|
|
if (host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK)
|
|
@@ -1109,6 +1112,8 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
|
* Control register.
|
|
|
*/
|
|
|
clk = SDHCI_PROG_CLOCK_MODE;
|
|
|
+ real_div = div;
|
|
|
+ clk_mul = host->clk_mul;
|
|
|
div--;
|
|
|
}
|
|
|
} else {
|
|
@@ -1122,6 +1127,7 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ real_div = div;
|
|
|
div >>= 1;
|
|
|
}
|
|
|
} else {
|
|
@@ -1130,9 +1136,13 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
|
if ((host->max_clk / div) <= clock)
|
|
|
break;
|
|
|
}
|
|
|
+ real_div = div;
|
|
|
div >>= 1;
|
|
|
}
|
|
|
|
|
|
+ if (real_div)
|
|
|
+ host->mmc->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)
|
|
|
<< SDHCI_DIVIDER_HI_SHIFT;
|