When changing the sd bus clock divisor, clear just the bus clock enable bit

before changing the divisor bits in the register.  We were writing a zero
to the register, which clears the enable, but also cleared the divisor bits
at the same time.  That's a violation of the sdhci spec, which says the
divisor can only be changed when the clock is disabled.  This has worked
okay on most hardware for years, but the TI OMAP controller would misbehave
after changing the divisor improperly.

Submitted by:	Svatopluk Kraus <onwahe@gmail.com>
This commit is contained in:
Ian Lepore 2014-04-04 01:10:02 +00:00
parent ef3c56a250
commit 4ddc017276

View File

@ -235,7 +235,8 @@ sdhci_set_clock(struct sdhci_slot *slot, uint32_t clock)
slot->clock = clock;
/* Turn off the clock. */
WR2(slot, SDHCI_CLOCK_CONTROL, 0);
clk = RD2(slot, SDHCI_CLOCK_CONTROL);
WR2(slot, SDHCI_CLOCK_CONTROL, clk & ~SDHCI_CLOCK_CARD_EN);
/* If no clock requested - left it so. */
if (clock == 0)
return;