@@ -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+
436449static 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