]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
mmc: sdhci: Use SDHCI Quirks to fix t30 h/w issue.
authorNaveen Kumar Arepalli <naveenk@nvidia.com>
Tue, 2 Apr 2013 10:13:30 +0000 (15:43 +0530)
committerDan Willemsen <dwillemsen@nvidia.com>
Sat, 14 Sep 2013 20:07:10 +0000 (13:07 -0700)
Use SDHCI_QUIRK_DISABLE_CARD_CLOCK quirk to disable
card clock before internal clock
Use SDHCI_QUIRK_DO_DUMMY_WRITE quirk to do a dummy write

Bug 1239457

Change-Id: I35f66f59303f9b58b17b66c5f83cdd8d14facdc3
Signed-off-by: Naveen Kumar Arepalli <naveenk@nvidia.com>
Reviewed-on: http://git-master/r/215477
Reviewed-by: Venu Byravarasu <vbyravarasu@nvidia.com>
drivers/mmc/host/sdhci.c
include/linux/mmc/sdhci.h

index d2a08bce6adc822a49ddce4047d5d8d10dd5ec03..fed37d84464dabe7003411237ee3c15683bb25cd 100644 (file)
@@ -1124,6 +1124,7 @@ 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;
+       u8 ctrl;
        unsigned long timeout;
 
        if (clock && clock == host->clock)
@@ -1133,7 +1134,11 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int 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)
@@ -1215,6 +1220,13 @@ clock_set:
        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))
index 6858253fdb969d4c3e14f6610f3b0ee5f6e00132..815cedb2f7b4daf3d5a37d38169ab61aa72d669b 100644 (file)
@@ -93,6 +93,10 @@ struct sdhci_host {
 #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. */