mmc: sdhci: add the quirk for broken r1b response
[oweals/u-boot.git] / drivers / mmc / sdhci.c
index fc904b5308eaa855a5a758b56e0f840d9892a608..7790a1e8da6b59c40fdf5233fd43e66112420092 100644 (file)
@@ -128,6 +128,7 @@ int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd,
        int trans_bytes = 0, is_aligned = 1;
        u32 mask, flags, mode;
        unsigned int timeout, start_addr = 0;
+       unsigned int retry = 10000;
 
        /* Wait max 10 ms */
        timeout = 10;
@@ -210,8 +211,19 @@ int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd,
                stat = sdhci_readl(host, SDHCI_INT_STATUS);
                if (stat & SDHCI_INT_ERROR)
                        break;
+               if (--retry == 0)
+                       break;
        } while ((stat & mask) != mask);
 
+       if (retry == 0) {
+               if (host->quirks & SDHCI_QUIRK_BROKEN_R1B)
+                       return 0;
+               else {
+                       printf("Timeout for status update!\n");
+                       return TIMEOUT;
+               }
+       }
+
        if ((stat & (SDHCI_INT_ERROR | mask)) == mask) {
                sdhci_cmd_done(host, cmd);
                sdhci_writel(host, mask, SDHCI_INT_STATUS);