]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
sdhci: Add quirk for controllers with no end-of-busy IRQ
authorBen Dooks <ben-linux@fluff.org>
Fri, 20 Feb 2009 17:33:08 +0000 (20:33 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 17 Mar 2009 00:32:28 +0000 (17:32 -0700)
commit f945405cdecd9e0ae3e58ff84cabd19b4522965e upstream.

The Samsung SDHCI (and FSL eSDHC) controller block seems to fail
to generate an INT_DATA_END after the transfer has completed and
the bus busy state finished.

Changes in e809517f6fa5803a5a1cd56026f0e2190fc13d5c to use the
new busy method are the cause of the behaviour change.

Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/mmc/host/sdhci.c
drivers/mmc/host/sdhci.h

index 59166588275ffd84b16a782bb5fc66700d1a7118..b4f6b3ce0c0381def1ec485fdb4ff90fcafa54ce 100644 (file)
@@ -1286,8 +1286,11 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask)
                if (host->cmd->data)
                        DBG("Cannot wait for busy signal when also "
                                "doing a data transfer");
-               else
+               else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ))
                        return;
+
+               /* The controller does not support the end-of-busy IRQ,
+                * fall through and take the SDHCI_INT_RESPONSE */
        }
 
        if (intmask & SDHCI_INT_RESPONSE)
index 6a11adfc7604ff1bd8ee4f3eacae57edaa78311b..04c02ac4d74753486e5aa9078970ef816286f4f7 100644 (file)
@@ -210,6 +210,8 @@ struct sdhci_host {
 #define SDHCI_QUIRK_BROKEN_SMALL_PIO                   (1<<13)
 /* Controller supports high speed but doesn't have the caps bit set */
 #define SDHCI_QUIRK_FORCE_HIGHSPEED                    (1<<14)
+/* Controller does not provide transfer-complete interrupt when not busy */
+#define SDHCI_QUIRK_NO_BUSY_IRQ                                (1<<15)
 
        int                     irq;            /* Device IRQ */
        void __iomem *          ioaddr;         /* Mapped address */