]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mmc: sdhci: Add quirk for always getting TC with stop cmd
authorAdrian Hunter <adrian.hunter@intel.com>
Wed, 24 Sep 2014 07:27:27 +0000 (10:27 +0300)
committerUlf Hansson <ulf.hansson@linaro.org>
Fri, 3 Oct 2014 12:18:17 +0000 (14:18 +0200)
Add a quirk for a host controller that always sets
a Transfer Complete interrupt status for the stop
command even when a busy response is not indicated.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci.c
include/linux/mmc/sdhci.h

index cbd433712756b1704e7cba3d68228e96a231bad1..a932f70bcc515d15d1d61fbf78d3f5abc47ee04d 100644 (file)
@@ -2225,7 +2225,7 @@ static void sdhci_tuning_timer(unsigned long data)
  *                                                                           *
 \*****************************************************************************/
 
-static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask)
+static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask, u32 *mask)
 {
        BUG_ON(intmask == 0);
 
@@ -2272,6 +2272,9 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask)
 
                /* The controller does not support the end-of-busy IRQ,
                 * fall through and take the SDHCI_INT_RESPONSE */
+       } else if ((host->quirks2 & SDHCI_QUIRK2_STOP_WITH_TC) &&
+                  host->cmd->opcode == MMC_STOP_TRANSMISSION && !host->data) {
+               *mask &= ~SDHCI_INT_DATA_END;
        }
 
        if (intmask & SDHCI_INT_RESPONSE)
@@ -2481,7 +2484,8 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
                }
 
                if (intmask & SDHCI_INT_CMD_MASK)
-                       sdhci_cmd_irq(host, intmask & SDHCI_INT_CMD_MASK);
+                       sdhci_cmd_irq(host, intmask & SDHCI_INT_CMD_MASK,
+                                     &intmask);
 
                if (intmask & SDHCI_INT_DATA_MASK)
                        sdhci_data_irq(host, intmask & SDHCI_INT_DATA_MASK);
index 0aa85ca0c788f3dfa9d3464f766b9183dbce6462..dba793e3a331f1d3039b7c5e96eb2a5ccba188b3 100644 (file)
@@ -98,6 +98,8 @@ struct sdhci_host {
 #define SDHCI_QUIRK2_BROKEN_HS200                      (1<<6)
 /* Controller does not support DDR50 */
 #define SDHCI_QUIRK2_BROKEN_DDR50                      (1<<7)
+/* Stop command (CMD12) can set Transfer Complete when not using MMC_RSP_BUSY */
+#define SDHCI_QUIRK2_STOP_WITH_TC                      (1<<8)
 
        int irq;                /* Device IRQ */
        void __iomem *ioaddr;   /* Mapped address */