summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorSam Protsenko <[email protected]>2024-08-07 22:14:14 -0500
committerMinkyu Kang <[email protected]>2024-08-19 16:09:06 +0900
commit6e17517b5cd8d260733c78046aab7916ff6d1402 (patch)
tree5237ef801e3d07eec58d1e7a78700257c4172e50 /drivers
parent95e42a5465b4d445e46ea025f259f88af474e5c8 (diff)
mmc: dw_mmc: Extract setting the DMA descriptor into a separate routine
Make dwmci_prepare_data() function easier to read by extracting the preparation of IDMAC descriptor into a dedicated function. No functional change. Signed-off-by: Sam Protsenko <[email protected]> Reviewed-by: Quentin Schulz <[email protected]> Signed-off-by: Minkyu Kang <[email protected]>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/dw_mmc.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
index 8fc26399034..d73d58bcf7d 100644
--- a/drivers/mmc/dw_mmc.c
+++ b/drivers/mmc/dw_mmc.c
@@ -53,46 +53,57 @@ static void dwmci_set_idma_desc(struct dwmci_idmac *idmac,
desc->next_addr = (ulong)desc + sizeof(struct dwmci_idmac);
}
-static void dwmci_prepare_data(struct dwmci_host *host,
- struct mmc_data *data,
+static void dwmci_prepare_desc(struct mmc_data *data,
struct dwmci_idmac *cur_idmac,
void *bounce_buffer)
{
- unsigned long ctrl;
- unsigned int i = 0, flags, cnt, blk_cnt;
+ struct dwmci_idmac *desc = cur_idmac;
ulong data_start, data_end;
+ unsigned int blk_cnt, i;
+ data_start = (ulong)cur_idmac;
blk_cnt = data->blocks;
- dwmci_wait_reset(host, DWMCI_CTRL_FIFO_RESET);
-
- /* Clear IDMAC interrupt */
- dwmci_writel(host, DWMCI_IDSTS, 0xFFFFFFFF);
+ for (i = 0;; i++) {
+ unsigned int flags, cnt;
- data_start = (ulong)cur_idmac;
- dwmci_writel(host, DWMCI_DBADDR, (ulong)cur_idmac);
-
- do {
- flags = DWMCI_IDMAC_OWN | DWMCI_IDMAC_CH ;
- flags |= (i == 0) ? DWMCI_IDMAC_FS : 0;
+ flags = DWMCI_IDMAC_OWN | DWMCI_IDMAC_CH;
+ if (i == 0)
+ flags |= DWMCI_IDMAC_FS;
if (blk_cnt <= 8) {
flags |= DWMCI_IDMAC_LD;
cnt = data->blocksize * blk_cnt;
} else
cnt = data->blocksize * 8;
- dwmci_set_idma_desc(cur_idmac, flags, cnt,
- (ulong)bounce_buffer + (i * PAGE_SIZE));
+ dwmci_set_idma_desc(desc, flags, cnt,
+ (ulong)bounce_buffer + i * PAGE_SIZE);
+ desc++;
- cur_idmac++;
if (blk_cnt <= 8)
break;
blk_cnt -= 8;
- i++;
- } while(1);
+ }
- data_end = (ulong)cur_idmac;
+ data_end = (ulong)desc;
flush_dcache_range(data_start, roundup(data_end, ARCH_DMA_MINALIGN));
+}
+
+static void dwmci_prepare_data(struct dwmci_host *host,
+ struct mmc_data *data,
+ struct dwmci_idmac *cur_idmac,
+ void *bounce_buffer)
+{
+ unsigned long ctrl;
+
+ dwmci_wait_reset(host, DWMCI_CTRL_FIFO_RESET);
+
+ /* Clear IDMAC interrupt */
+ dwmci_writel(host, DWMCI_IDSTS, 0xFFFFFFFF);
+
+ dwmci_writel(host, DWMCI_DBADDR, (ulong)cur_idmac);
+
+ dwmci_prepare_desc(data, cur_idmac, bounce_buffer);
ctrl = dwmci_readl(host, DWMCI_CTRL);
ctrl |= DWMCI_IDMAC_EN | DWMCI_DMA_EN;