Signed-off-by: Ian Campbell <i...@hellion.org.uk>
---
 drivers/mmc/sunxi_mmc.c | 55 ++++++++++++++++++++++++++-----------------------
 1 file changed, 29 insertions(+), 26 deletions(-)

diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
index 34c4996..a09e021 100644
--- a/drivers/mmc/sunxi_mmc.c
+++ b/drivers/mmc/sunxi_mmc.c
@@ -433,6 +433,25 @@ static void mmc_enable_dma_accesses(struct mmc *mmc, int 
dma)
        writel(gctrl, &mmchost->reg->gctrl);
 }
 
+static int mmc_rint_wait(struct mmc *mmc, signed int timeout,
+                        unsigned int done_bit, const char *what)
+{
+       struct sunxi_mmc_host *mmchost = (struct sunxi_mmc_host *)mmc->priv;
+       unsigned int status;
+
+       do {
+               status = readl(&mmchost->reg->rint);
+               if (!timeout-- ||
+                   (status & SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT)) {
+                       debug("%s timeout %x\n", what,
+                             status & SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT);
+                       return TIMEOUT;
+               }
+       } while (!(status & done_bit));
+
+       return 0;
+}
+
 static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
                        struct mmc_data *data)
 {
@@ -514,36 +533,20 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd 
*cmd,
                }
        }
 
-       timeout = 0xfffff;
-       do {
-               status = readl(&mmchost->reg->rint);
-               if (!timeout-- ||
-                   (status & SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT)) {
-                       error = status & SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT;
-                       debug("cmd timeout %x\n", error);
-                       error = TIMEOUT;
-                       goto out;
-               }
-       } while (!(status & SUNXI_MMC_RINT_COMMAND_DONE));
+       error = mmc_rint_wait(mmc, 0xfffff, SUNXI_MMC_RINT_COMMAND_DONE, "cmd");
+       if (error)
+               goto out;
 
        if (data) {
-               unsigned done = 0;
                timeout = usedma ? 0xffff * bytecnt : 0xffff;
                debug("cacl timeout %x\n", timeout);
-               do {
-                       status = readl(&mmchost->reg->rint);
-                       if (!timeout-- ||
-                           (status & SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT)) {
-                               error = status & 
SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT;
-                               debug("data timeout %x\n", error);
-                               error = TIMEOUT;
-                               goto out;
-                       }
-                       if (data->blocks > 1)
-                               done = status & 
SUNXI_MMC_RINT_AUTO_COMMAND_DONE;
-                       else
-                               done = status & SUNXI_MMC_RINT_DATA_OVER;
-               } while (!done);
+               error = mmc_rint_wait(mmc, timeout,
+                                     data->blocks > 1 ?
+                                     SUNXI_MMC_RINT_AUTO_COMMAND_DONE :
+                                     SUNXI_MMC_RINT_DATA_OVER,
+                                     "data");
+               if (error)
+                       goto out;
        }
 
        if (cmd->resp_type & MMC_RSP_BUSY) {
-- 
1.8.5.3

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to