[U-Boot] [PATCH v6 13/23] mmc: dw_mmc: move data transfer as a separate function

Lin Huang hl at rock-chips.com
Tue Nov 17 07:20:21 CET 2015


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 at rock-chips.com>
---

 drivers/mmc/dw_mmc.c | 65 ++++++++++++++++++++++++++++++----------------------
 1 file changed, 37 insertions(+), 28 deletions(-)

diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
index 4375abc..bee8fab 100644
--- a/drivers/mmc/dw_mmc.c
+++ b/drivers/mmc/dw_mmc.c
@@ -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);
 	}
 
-- 
1.9.1



More information about the U-Boot mailing list