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

Commit 66459c5a authored by Jiada Wang's avatar Jiada Wang Committed by Mark Brown
Browse files

spi: imx: adjust watermark level according to transfer length



Previously DMA watermark level is configured to fifosize/2,
DMA mode can be used only when transfer length can be divided
by 'watermark level * bpw', which makes DMA mode not pratical.

This patch adjusts watermark level to largest number (no bigger
than fifosize/2) which can divide 'tranfer length / bpw' for
each transfer.

Signed-off-by: default avatarJiada Wang <jiada_wang@mentor.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent fafd6794
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -211,7 +211,7 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
			 struct spi_transfer *transfer)
{
	struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
	unsigned int bpw;
	unsigned int bpw, i;

	if (!master->dma_rx)
		return false;
@@ -228,12 +228,16 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
	if (bpw != 1 && bpw != 2 && bpw != 4)
		return false;

	if (transfer->len < spi_imx->wml * bpw)
		return false;
	for (i = spi_imx_get_fifosize(spi_imx) / 2; i > 0; i--) {
		if (!(transfer->len % (i * bpw)))
			break;
	}

	if (transfer->len % (spi_imx->wml * bpw))
	if (i == 0)
		return false;

	spi_imx->wml = i;

	return true;
}

@@ -837,10 +841,6 @@ static int spi_imx_dma_configure(struct spi_master *master,
	struct dma_slave_config rx = {}, tx = {};
	struct spi_imx_data *spi_imx = spi_master_get_devdata(master);

	if (bytes_per_word == spi_imx->bytes_per_word)
		/* Same as last time */
		return 0;

	switch (bytes_per_word) {
	case 4:
		buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES;