Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a24e70c0 authored by Addy Ke's avatar Addy Ke Committed by Mark Brown
Browse files

spi/rockchip: fix bug that cause the failure to read data in DMA mode



In my test on RK3288-pinky board, if spi is enabled, it will begin to
read data from slave regardless of whether the DMA is ready. So we
need prepare DMA before spi is enable.

Signed-off-by: default avatarAddy Ke <addy.ke@rock-chips.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Cc: stable@vger.kernel.org
parent 7d1311b9
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -415,7 +415,7 @@ static void rockchip_spi_dma_txcb(void *data)
	spin_unlock_irqrestore(&rs->lock, flags);
}

static int rockchip_spi_dma_transfer(struct rockchip_spi *rs)
static void rockchip_spi_prepare_dma(struct rockchip_spi *rs)
{
	unsigned long flags;
	struct dma_slave_config rxconf, txconf;
@@ -474,8 +474,6 @@ static int rockchip_spi_dma_transfer(struct rockchip_spi *rs)
		dmaengine_submit(txdesc);
		dma_async_issue_pending(rs->dma_tx.ch);
	}

	return 1;
}

static void rockchip_spi_config(struct rockchip_spi *rs)
@@ -556,16 +554,17 @@ static int rockchip_spi_transfer_one(
	else if (rs->rx)
		rs->tmode = CR0_XFM_RO;

	if (master->can_dma && master->can_dma(master, spi, xfer))
	/* we need prepare dma before spi was enabled */
	if (master->can_dma && master->can_dma(master, spi, xfer)) {
		rs->use_dma = 1;
	else
		rockchip_spi_prepare_dma(rs);
	} else {
		rs->use_dma = 0;
	}

	rockchip_spi_config(rs);

	if (rs->use_dma)
		ret = rockchip_spi_dma_transfer(rs);
	else
	if (!rs->use_dma)
		ret = rockchip_spi_pio_transfer(rs);

	return ret;