Skip to content

Commit

Permalink
spi: imx: adjust watermark level according to transfer length
Browse files Browse the repository at this point in the history
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: Jiada Wang <jiada_wang@mentor.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Jiada Wang authored and Mark Brown committed Jan 6, 2017
1 parent fafd679 commit 66459c5
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions drivers/spi/spi-imx.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 66459c5

Please sign in to comment.