mmc: dw_mmc: Extract DMA transfer handling code into a separate routine

Make dwmci_send_cmd() easier to read by moving the DMA transfer handling
code into a dedicated function.

No functional change.

Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
Reviewed-by: Quentin Schulz <quentin.schulz@cherry.de>
Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
This commit is contained in:
Sam Protsenko
2024-08-07 22:14:13 -05:00
committed by Minkyu Kang
parent 0252924ac6
commit 95e42a5465

View File

@@ -232,6 +232,33 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data)
return ret; return ret;
} }
static int dwmci_dma_transfer(struct dwmci_host *host, uint flags,
struct bounce_buffer *bbstate)
{
int ret;
u32 mask, ctrl;
if (flags == MMC_DATA_READ)
mask = DWMCI_IDINTEN_RI;
else
mask = DWMCI_IDINTEN_TI;
ret = wait_for_bit_le32(host->ioaddr + DWMCI_IDSTS,
mask, true, 1000, false);
if (ret)
debug("%s: DWMCI_IDINTEN mask 0x%x timeout\n", __func__, mask);
/* Clear interrupts */
dwmci_writel(host, DWMCI_IDSTS, DWMCI_IDINTEN_MASK);
ctrl = dwmci_readl(host, DWMCI_CTRL);
ctrl &= ~DWMCI_DMA_EN;
dwmci_writel(host, DWMCI_CTRL, ctrl);
bounce_buffer_stop(bbstate);
return ret;
}
static int dwmci_set_transfer_mode(struct dwmci_host *host, static int dwmci_set_transfer_mode(struct dwmci_host *host,
struct mmc_data *data) struct mmc_data *data)
{ {
@@ -274,7 +301,7 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
data ? DIV_ROUND_UP(data->blocks, 8) : 0); data ? DIV_ROUND_UP(data->blocks, 8) : 0);
int ret = 0, flags = 0, i; int ret = 0, flags = 0, i;
u32 retry = 100000; u32 retry = 100000;
u32 mask, ctrl; u32 mask;
struct bounce_buffer bbstate; struct bounce_buffer bbstate;
dwmci_wait_while_busy(host, cmd); dwmci_wait_while_busy(host, cmd);
@@ -382,26 +409,8 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
if (data) { if (data) {
ret = dwmci_data_transfer(host, data); ret = dwmci_data_transfer(host, data);
if (!host->fifo_mode)
/* only dma mode need it */ ret = dwmci_dma_transfer(host, data->flags, &bbstate);
if (!host->fifo_mode) {
if (data->flags == MMC_DATA_READ)
mask = DWMCI_IDINTEN_RI;
else
mask = DWMCI_IDINTEN_TI;
ret = wait_for_bit_le32(host->ioaddr + DWMCI_IDSTS,
mask, true, 1000, false);
if (ret)
debug("%s: DWMCI_IDINTEN mask 0x%x timeout.\n",
__func__, mask);
/* clear interrupts */
dwmci_writel(host, DWMCI_IDSTS, DWMCI_IDINTEN_MASK);
ctrl = dwmci_readl(host, DWMCI_CTRL);
ctrl &= ~(DWMCI_DMA_EN);
dwmci_writel(host, DWMCI_CTRL, ctrl);
bounce_buffer_stop(&bbstate);
}
} }
udelay(100); udelay(100);