mxcmmc : Reset the SDHC hardware if software timeout occurs.
authorMartin Fuzzey <mfuzzey@gmail.com>
Thu, 16 Apr 2009 20:00:36 +0000 (22:00 +0200)
committerPierre Ossman <pierre@ossman.eu>
Wed, 3 Jun 2009 19:48:17 +0000 (21:48 +0200)
When a software timeout occurs in polling mode hardware was left in
an indeterminate state causing subsequent operations to block.

Signed-off-by: Martin Fuzzey <mfuzzey@gmail.com>
drivers/mmc/host/mxcmmc.c

index 5950102113f4afe91c4994fedc22576d0c058c34..dcc9cdb2a4df05572b801004ecaef8ac932ba92e 100644 (file)
@@ -140,6 +140,8 @@ struct mxcmci_host {
        struct work_struct      datawork;
 };
 
+static void mxcmci_set_clk_rate(struct mxcmci_host *host, unsigned int clk_ios);
+
 static inline int mxcmci_use_dma(struct mxcmci_host *host)
 {
        return host->do_dma;
@@ -345,8 +347,11 @@ static int mxcmci_poll_status(struct mxcmci_host *host, u32 mask)
                stat = readl(host->base + MMC_REG_STATUS);
                if (stat & STATUS_ERR_MASK)
                        return stat;
-               if (time_after(jiffies, timeout))
+               if (time_after(jiffies, timeout)) {
+                       mxcmci_softreset(host);
+                       mxcmci_set_clk_rate(host, host->clock);
                        return STATUS_TIME_OUT_READ;
+               }
                if (stat & mask)
                        return 0;
                cpu_relax();