Skip to content

Commit 0ebd6a7

Browse files
zhao0116JayJiang-ASUS
authored andcommitted
drivers: spi: rockchip: config spi rx dma burst size depend on xfer length
Change-Id: I54c855fc2ed4ccfbed6c011ae10bebc9829dc4d7 Signed-off-by: Yifeng Zhao <zyf@rock-chips.com>
1 parent d1f8124 commit 0ebd6a7

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

drivers/spi/spi-rockchip.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,19 @@ static void rockchip_spi_dma_txcb(void *data)
433433
spin_unlock_irqrestore(&rs->lock, flags);
434434
}
435435

436+
static u32 rockchip_spi_calc_burst_size(u32 data_len)
437+
{
438+
u32 i;
439+
440+
/* burst size: 1, 2, 4, 8 */
441+
for (i = 1; i < 8; i <<= 1) {
442+
if (data_len & i)
443+
break;
444+
}
445+
446+
return i;
447+
}
448+
436449
static int rockchip_spi_prepare_dma(struct rockchip_spi *rs)
437450
{
438451
unsigned long flags;
@@ -452,7 +465,7 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs)
452465
rxconf.direction = rs->dma_rx.direction;
453466
rxconf.src_addr = rs->dma_rx.addr;
454467
rxconf.src_addr_width = rs->n_bytes;
455-
rxconf.src_maxburst = 1;
468+
rxconf.src_maxburst = rockchip_spi_calc_burst_size(rs->len / rs->n_bytes);
456469
dmaengine_slave_config(rs->dma_rx.ch, &rxconf);
457470

458471
rxdesc = dmaengine_prep_slave_sg(
@@ -585,7 +598,8 @@ static void rockchip_spi_config(struct rockchip_spi *rs)
585598
writel_relaxed(rs->fifo_len / 2 - 1, rs->regs + ROCKCHIP_SPI_RXFTLR);
586599

587600
writel_relaxed(rs->fifo_len / 2 - 1, rs->regs + ROCKCHIP_SPI_DMATDLR);
588-
writel_relaxed(0, rs->regs + ROCKCHIP_SPI_DMARDLR);
601+
writel_relaxed(rockchip_spi_calc_burst_size(rs->len / rs->n_bytes) - 1,
602+
rs->regs + ROCKCHIP_SPI_DMARDLR);
589603
writel_relaxed(dmacr, rs->regs + ROCKCHIP_SPI_DMACR);
590604

591605
spi_set_clk(rs, div);

0 commit comments

Comments
 (0)