mmc: dw_mmc: move data transfer as a separate function
authorhuang lin <hl@rock-chips.com>
Tue, 17 Nov 2015 06:20:21 +0000 (14:20 +0800)
committerSimon Glass <sjg@chromium.org>
Tue, 1 Dec 2015 15:07:22 +0000 (08:07 -0700)
the data transfer seem to long in the dwmci_send_cmd function,
so move this block as a separate funciton.

Signed-off-by: Lin Huang <hl@rock-chips.com>
Acked-by: Simon Glass <sjg@chromium.org>
drivers/mmc/dw_mmc.c

index 4375abc9406a904fcd85ce579347dc93e6758327..bee8fab332d6ae2605c7e083826d08e9602dcd4a 100644 (file)
@@ -94,6 +94,42 @@ static void dwmci_prepare_data(struct dwmci_host *host,
        dwmci_writel(host, DWMCI_BYTCNT, data->blocksize * data->blocks);
 }
 
+static int dwmci_data_transfer(struct dwmci_host *host)
+{
+       int ret = 0;
+       unsigned int timeout = 240000;
+       u32 mask;
+       ulong start = get_timer(0);
+
+       for (;;) {
+               mask = dwmci_readl(host, DWMCI_RINTSTS);
+               /* Error during data transfer. */
+               if (mask & (DWMCI_DATA_ERR | DWMCI_DATA_TOUT)) {
+                       debug("%s: DATA ERROR!\n", __func__);
+                       ret = -EINVAL;
+                       break;
+               }
+
+               /* Data arrived correctly. */
+               if (mask & DWMCI_INTMSK_DTO) {
+                       ret = 0;
+                       break;
+               }
+
+               /* Check for timeout. */
+               if (get_timer(start) > timeout) {
+                       debug("%s: Timeout waiting for data!\n",
+                             __func__);
+                       ret = TIMEOUT;
+                       break;
+               }
+       }
+
+       dwmci_writel(host, DWMCI_RINTSTS, mask);
+
+       return ret;
+}
+
 static int dwmci_set_transfer_mode(struct dwmci_host *host,
                struct mmc_data *data)
 {
@@ -213,38 +249,11 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
        }
 
        if (data) {
-               start = get_timer(0);
-               timeout = 240000;
-               for (;;) {
-                       mask = dwmci_readl(host, DWMCI_RINTSTS);
-                       /* Error during data transfer. */
-                       if (mask & (DWMCI_DATA_ERR | DWMCI_DATA_TOUT)) {
-                               debug("%s: DATA ERROR!\n", __func__);
-                               ret = -EINVAL;
-                               break;
-                       }
-
-                       /* Data arrived correctly. */
-                       if (mask & DWMCI_INTMSK_DTO) {
-                               ret = 0;
-                               break;
-                       }
-
-                       /* Check for timeout. */
-                       if (get_timer(start) > timeout) {
-                               debug("%s: Timeout waiting for data!\n",
-                                      __func__);
-                               ret = TIMEOUT;
-                               break;
-                       }
-               }
-
-               dwmci_writel(host, DWMCI_RINTSTS, mask);
+               ret = dwmci_data_transfer(host);
 
                ctrl = dwmci_readl(host, DWMCI_CTRL);
                ctrl &= ~(DWMCI_DMA_EN);
                dwmci_writel(host, DWMCI_CTRL, ctrl);
-
                bounce_buffer_stop(&bbstate);
        }