return true;
 }
 
+static void mid_spi_maxburst_init(struct dw_spi *dws)
+{
+       struct dma_slave_caps caps;
+       u32 max_burst, def_burst;
+       int ret;
+
+       def_burst = dws->fifo_len / 2;
+
+       ret = dma_get_slave_caps(dws->rxchan, &caps);
+       if (!ret && caps.max_burst)
+               max_burst = caps.max_burst;
+       else
+               max_burst = RX_BURST_LEVEL;
+
+       dws->rxburst = min(max_burst, def_burst);
+
+       ret = dma_get_slave_caps(dws->txchan, &caps);
+       if (!ret && caps.max_burst)
+               max_burst = caps.max_burst;
+       else
+               max_burst = TX_BURST_LEVEL;
+
+       dws->txburst = min(max_burst, def_burst);
+}
+
 static int mid_spi_dma_init_mfld(struct device *dev, struct dw_spi *dws)
 {
        struct dw_dma_slave slave = {
 
        init_completion(&dws->dma_completion);
 
+       mid_spi_maxburst_init(dws);
+
        return 0;
 
 free_rxchan:
 
        init_completion(&dws->dma_completion);
 
+       mid_spi_maxburst_init(dws);
+
        return 0;
 }
 
        memset(&txconf, 0, sizeof(txconf));
        txconf.direction = DMA_MEM_TO_DEV;
        txconf.dst_addr = dws->dma_addr;
-       txconf.dst_maxburst = TX_BURST_LEVEL;
+       txconf.dst_maxburst = dws->txburst;
        txconf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
        txconf.dst_addr_width = convert_dma_width(dws->n_bytes);
        txconf.device_fc = false;
        memset(&rxconf, 0, sizeof(rxconf));
        rxconf.direction = DMA_DEV_TO_MEM;
        rxconf.src_addr = dws->dma_addr;
-       rxconf.src_maxburst = RX_BURST_LEVEL;
+       rxconf.src_maxburst = dws->rxburst;
        rxconf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
        rxconf.src_addr_width = convert_dma_width(dws->n_bytes);
        rxconf.device_fc = false;
 {
        u16 imr = 0, dma_ctrl = 0;
 
-       dw_writel(dws, DW_SPI_DMARDLR, RX_BURST_LEVEL - 1);
-       dw_writel(dws, DW_SPI_DMATDLR, TX_BURST_LEVEL);
+       dw_writel(dws, DW_SPI_DMARDLR, dws->rxburst - 1);
+       dw_writel(dws, DW_SPI_DMATDLR, dws->fifo_len - dws->txburst);
 
        if (xfer->tx_buf) {
                dma_ctrl |= SPI_DMA_TDMAE;