int div = 0; /* Initialized for compiler warning */
int real_div = div, clk_mul = 1;
u16 clk = 0;
+ u8 ctrl;
unsigned long timeout;
if (clock && clock == host->clock)
if (host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK)
return;
-
+ if (host->quirks & SDHCI_QUIRK_DISABLE_CARD_CLOCK) {
+ clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
+ clk &= ~SDHCI_CLOCK_CARD_EN;
+ sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
+ }
sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
if (clock == 0)
clk |= SDHCI_CLOCK_INT_EN;
sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
+ /* Do a dummy write */
+ if (host->quirks & SDHCI_QUIRK_DO_DUMMY_WRITE) {
+ ctrl = sdhci_readb(host, SDHCI_CAPABILITIES);
+ ctrl |= 1;
+ sdhci_writeb(host, ctrl, SDHCI_CAPABILITIES);
+ }
+
/* Wait max 20 ms */
timeout = 20;
while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))
#define SDHCI_QUIRK_NON_STANDARD_TUNING (1ULL<<33)
/* Controller doesn't calculate max_discard_to */
#define SDHCI_QUIRK_NO_CALC_MAX_DISCARD_TO (1ULL<<34)
+/* Disable the card clock before disabling the internal*/
+#define SDHCI_QUIRK_DISABLE_CARD_CLOCK (1ULL<<35)
+/* Do dummy write */
+#define SDHCI_QUIRK_DO_DUMMY_WRITE (1ULL<<36)
unsigned int quirks2; /* More deviations from spec. */