mmc: omap_hsmmc: consolidate error report handling of HSMMC IRQ
authorVenkatraman S <svenkatr@ti.com>
Thu, 9 Aug 2012 15:06:07 +0000 (20:36 +0530)
committerChris Ball <cjb@laptop.org>
Tue, 4 Sep 2012 17:58:24 +0000 (13:58 -0400)
Consolidate the duplicated code around the handling of CMD_TIMEOUT,
CMD_CRC, DATA_TIMEOUT, DATA_CRC and CARD_ERR handling into a single
function.

This generally shrinks code bloat, but is also required for implementing
software based guard timers.

Signed-off-by: Venkatraman S <svenkatr@ti.com>
Acked-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/omap_hsmmc.c

index 20453c82d0f2a351b90fdd3364147989d8acdcca..9afdd202b8735bf5e36509c1952f9f0e8a86d7be 100644 (file)
@@ -964,6 +964,18 @@ static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host,
                        __func__);
 }
 
+static void hsmmc_command_incomplete(struct omap_hsmmc_host *host, int err)
+{
+       omap_hsmmc_reset_controller_fsm(host, SRC);
+       host->cmd->error = err;
+
+       if (host->data) {
+               omap_hsmmc_reset_controller_fsm(host, SRD);
+               omap_hsmmc_dma_cleanup(host, err);
+       }
+
+}
+
 static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
 {
        struct mmc_data *data;
@@ -974,48 +986,15 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
 
        if (status & ERR) {
                omap_hsmmc_dbg_report_irq(host, status);
-               if ((status & CMD_TIMEOUT) ||
-                       (status & CMD_CRC)) {
-                       if (host->cmd) {
-                               if (status & CMD_TIMEOUT) {
-                                       omap_hsmmc_reset_controller_fsm(host,
-                                                                       SRC);
-                                       host->cmd->error = -ETIMEDOUT;
-                               } else {
-                                       host->cmd->error = -EILSEQ;
-                               }
-                               end_cmd = 1;
-                       }
-                       if (host->data || host->response_busy) {
-                               if (host->data)
-                                       omap_hsmmc_dma_cleanup(host,
-                                                               -ETIMEDOUT);
-                               host->response_busy = 0;
-                               omap_hsmmc_reset_controller_fsm(host, SRD);
-                       }
-               }
-               if ((status & DATA_TIMEOUT) ||
-                       (status & DATA_CRC)) {
-                       if (host->data || host->response_busy) {
-                               int err = (status & DATA_TIMEOUT) ?
-                                               -ETIMEDOUT : -EILSEQ;
-
-                               if (host->data)
-                                       omap_hsmmc_dma_cleanup(host, err);
-                               else
-                                       host->mrq->cmd->error = err;
-                               host->response_busy = 0;
-                               omap_hsmmc_reset_controller_fsm(host, SRD);
-                               end_trans = 1;
-                       }
-               }
-               if (status & CARD_ERR) {
-                       dev_dbg(mmc_dev(host->mmc),
-                               "Ignoring card err CMD%d\n", host->cmd->opcode);
-                       if (host->cmd)
-                               end_cmd = 1;
-                       if (host->data)
-                               end_trans = 1;
+               if (status & (CMD_TIMEOUT | DATA_TIMEOUT))
+                       hsmmc_command_incomplete(host, -ETIMEDOUT);
+               else if (status & (CMD_CRC | DATA_CRC))
+                       hsmmc_command_incomplete(host, -EILSEQ);
+
+               end_cmd = 1;
+               if (host->data || host->response_busy) {
+                       end_trans = 1;
+                       host->response_busy = 0;
                }
        }
 
This page took 0.028636 seconds and 5 git commands to generate.