Tegra: mmc: Fixed handling of interrupts in timeouts.
authorTom Warren <twarren.nvidia@gmail.com>
Tue, 7 Feb 2012 06:17:16 +0000 (06:17 +0000)
committerAndy Fleming <afleming@freescale.com>
Wed, 15 Feb 2012 23:42:22 +0000 (17:42 -0600)
We are seeing occasional timeouts in the Tegra mmc code when
we are reading from external MMC cards. These don't seem to be
detrimental if they are handled properly.  This CL properly
clears the "normal interrupt status register" (norintsts) in
error conditions.  If we don't do this, when we come back into
mmc_send_cmd() the register will still contain status from the
last transaction.

Signed-off-by: Doug Anderson <dianders@chromium.org>
Signed-off-by: Tom Warren <twarren@nvidia.com>
drivers/mmc/tegra2_mmc.c

index 3191557c5be62e08304444149ea0983884516abe..33cc8fb804165cb99fa8695d4af43e441334be39 100644 (file)
@@ -227,16 +227,19 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
 
        if (i == retry) {
                printf("%s: waiting for status update\n", __func__);
+               writel(mask, &host->reg->norintsts);
                return TIMEOUT;
        }
 
        if (mask & TEGRA_MMC_NORINTSTS_CMD_TIMEOUT) {
                /* Timeout Error */
                debug("timeout: %08x cmd %d\n", mask, cmd->cmdidx);
+               writel(mask, &host->reg->norintsts);
                return TIMEOUT;
        } else if (mask & TEGRA_MMC_NORINTSTS_ERR_INTERRUPT) {
                /* Error Interrupt */
                debug("error: %08x cmd %d\n", mask, cmd->cmdidx);
+               writel(mask, &host->reg->norintsts);
                return -1;
        }
 
@@ -265,6 +268,7 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
 
                        if (i == retry) {
                                printf("%s: card is still busy\n", __func__);
+                               writel(mask, &host->reg->norintsts);
                                return TIMEOUT;
                        }