omap_hsmmc: Wait for CMDI to be clear
authorTom Rini <trini@ti.com>
Mon, 30 Jan 2012 11:22:25 +0000 (11:22 +0000)
committerAndy Fleming <afleming@freescale.com>
Wed, 15 Feb 2012 23:42:22 +0000 (17:42 -0600)
Before we can send a command we need both the DATI (command inhibit on
mmc_dat line) bit and CMDI (command inhibit on mmc_cmd line) are clear.
The previous behavior of only checking on DATI was insufficient on some
cards and incorrect behavior in any case.  This makes the code check
for both bits being clear and makes the error print more clear as
to what happened.  DATI_CMDDIS is removed as it was unused elsewhere
in the code and stood for 'DATI is set, cmds are disabled still'.

Fix originally spotted by Peter Bigot.

Tested-by: Peter A. Bigot <bigotp@acm.org>
Tested-by: Robert Nelson <robertcnelson@gmail.com>
Signed-off-by: Tom Rini <trini@ti.com>
Tested-by: Andreas Müller <schnitzeltony@googlemail.com>
arch/arm/include/asm/arch-am33xx/mmc_host_def.h
arch/arm/include/asm/arch-omap3/mmc_host_def.h
arch/arm/include/asm/arch-omap4/mmc_host_def.h
arch/arm/include/asm/arch-omap5/mmc_host_def.h
drivers/mmc/omap_hsmmc.c

index 5d7dd4b3888d3652459f8fa2e299080fe37c6492..943526b94a497a33edf207b57ad5fcea87ed6265 100644 (file)
@@ -97,7 +97,7 @@ typedef struct hsmmc {
 #define INDEX_MASK                     (0x3f << 24)
 #define INDEX(i)                       (i << 24)
 #define DATI_MASK                      (0x1 << 1)
-#define DATI_CMDDIS                    (0x1 << 1)
+#define CMDI_MASK                      (0x1 << 0)
 #define DTW_1_BITMODE                  (0x0 << 1)
 #define DTW_4_BITMODE                  (0x1 << 1)
 #define DTW_8_BITMODE                   (0x1 << 5) /* CON[DW8]*/
index 296367948f488584d7673f544d8c723082cc244e..f8c42c0d20621c483d5eb028075f5629b2343456 100644 (file)
@@ -129,7 +129,7 @@ struct hsmmc {
 #define INDEX_MASK                     (0x3f << 24)
 #define INDEX(i)                       (i << 24)
 #define DATI_MASK                      (0x1 << 1)
-#define DATI_CMDDIS                    (0x1 << 1)
+#define CMDI_MASK                      (0x1 << 0)
 #define DTW_1_BITMODE                  (0x0 << 1)
 #define DTW_4_BITMODE                  (0x1 << 1)
 #define DTW_8_BITMODE                   (0x1 << 5) /* CON[DW8]*/
index 74439c9d9b4df2e6aa85a268bc476ead8661f138..ce1bce1fddd64c74302f899499499e898c507bd4 100644 (file)
@@ -107,7 +107,7 @@ struct hsmmc {
 #define INDEX_MASK                     (0x3f << 24)
 #define INDEX(i)                       (i << 24)
 #define DATI_MASK                      (0x1 << 1)
-#define DATI_CMDDIS                    (0x1 << 1)
+#define CMDI_MASK                      (0x1 << 0)
 #define DTW_1_BITMODE                  (0x0 << 1)
 #define DTW_4_BITMODE                  (0x1 << 1)
 #define DTW_8_BITMODE                   (0x1 << 5) /* CON[DW8]*/
index 74439c9d9b4df2e6aa85a268bc476ead8661f138..ce1bce1fddd64c74302f899499499e898c507bd4 100644 (file)
@@ -107,7 +107,7 @@ struct hsmmc {
 #define INDEX_MASK                     (0x3f << 24)
 #define INDEX(i)                       (i << 24)
 #define DATI_MASK                      (0x1 << 1)
-#define DATI_CMDDIS                    (0x1 << 1)
+#define CMDI_MASK                      (0x1 << 0)
 #define DTW_1_BITMODE                  (0x0 << 1)
 #define DTW_4_BITMODE                  (0x1 << 1)
 #define DTW_8_BITMODE                   (0x1 << 5) /* CON[DW8]*/
index ef64e37411f235dfb9b21ac6c719e1a9f5b07c8c..2400db2f35671df76a6b9e8bb927e1438f397b58 100644 (file)
@@ -198,9 +198,10 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
        ulong start;
 
        start = get_timer(0);
-       while ((readl(&mmc_base->pstate) & DATI_MASK) == DATI_CMDDIS) {
+       while ((readl(&mmc_base->pstate) & (DATI_MASK | CMDI_MASK)) != 0) {
                if (get_timer(0) - start > MAX_RETRY_MS) {
-                       printf("%s: timedout waiting for cmddis!\n", __func__);
+                       printf("%s: timedout waiting on cmd inhibit to clear\n",
+                                       __func__);
                        return TIMEOUT;
                }
        }