]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mmc: sdhci-esdhc-imx: Auto CMD23 support for usdhc
authorShawn Guo <shawn.guo@linaro.org>
Mon, 21 Jan 2013 11:02:26 +0000 (19:02 +0800)
committerChris Ball <cjb@laptop.org>
Mon, 11 Feb 2013 18:29:06 +0000 (13:29 -0500)
SDHCI core will try to use Auto CMD23 for mmc card.  Currently, we will
see the following message with mmc card on usdhc due to the lacking of
Auto CMD23 support in the driver.

$ mmc0: new high speed MMC card at address 0001
mmcblk1: mmc0:0001 MMC02G 1.87 GiB
mmcblk1: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0xb00
mmcblk1: retrying using single block read
 mmcblk1:

Enable Auto CMD23 support for usdhc so that mmc card can work in
multiple block mode.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Tested-by: Dirk Behme <dirk.behme@de.bosch.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/sdhci-esdhc-imx.c

index 968a70f1a42033dc332dae9650a521a7edb325a2..24daaf4e20baf9bab15fa0254774cb510e0d1dde 100644 (file)
@@ -36,6 +36,9 @@
 #define  ESDHC_VENDOR_SPEC_SDIO_QUIRK  (1 << 1)
 #define ESDHC_WTMK_LVL                 0x44
 #define ESDHC_MIX_CTRL                 0x48
+#define  ESDHC_MIX_CTRL_AC23EN         (1 << 7)
+/* Bits 3 and 6 are not SDHCI standard definitions */
+#define  ESDHC_MIX_CTRL_SDHCI_MASK     0xb7
 
 /*
  * There is an INT DMA ERR mis-match between eSDHC and STD SDHC SPEC:
@@ -251,7 +254,12 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
 
                if (is_imx6q_usdhc(imx_data)) {
                        u32 m = readl(host->ioaddr + ESDHC_MIX_CTRL);
-                       m = val | (m & 0xffff0000);
+                       /* Swap AC23 bit */
+                       if (val & SDHCI_TRNS_AUTO_CMD23) {
+                               val &= ~SDHCI_TRNS_AUTO_CMD23;
+                               val |= ESDHC_MIX_CTRL_AC23EN;
+                       }
+                       m = val | (m & ~ESDHC_MIX_CTRL_SDHCI_MASK);
                        writel(m, host->ioaddr + ESDHC_MIX_CTRL);
                } else {
                        /*