diff options
author | Frode Isaksen <fisaksen@baylibre.com> | 2017-02-23 19:01:59 +0100 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-03-15 19:35:39 +0000 |
commit | 0718b764880434ac7a5b7c0f5cb2c805c589a807 (patch) | |
tree | 8e173273f8ca2d1e856061716c6da501b38c17b5 /drivers/spi/spi-davinci.c | |
parent | 6b3a631e7f8eca75a987ed760898d28fb3628143 (diff) | |
download | op-kernel-dev-0718b764880434ac7a5b7c0f5cb2c805c589a807.zip op-kernel-dev-0718b764880434ac7a5b7c0f5cb2c805c589a807.tar.gz |
spi: davinci: do not use DMA if transfer length is less than 16
Higher bitrate and lower CPU load if using PIO in this case.
Signed-off-by: Frode Isaksen <fisaksen@baylibre.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-davinci.c')
-rw-r--r-- | drivers/spi/spi-davinci.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c index ca12216..75c658e 100644 --- a/drivers/spi/spi-davinci.c +++ b/drivers/spi/spi-davinci.c @@ -109,6 +109,8 @@ #define SPIDEF 0x4c #define SPIFMT0 0x50 +#define DMA_MIN_BYTES 16 + /* SPI Controller driver's private data. */ struct davinci_spi { struct spi_bitbang bitbang; @@ -479,7 +481,8 @@ static bool davinci_spi_can_dma(struct spi_master *master, bool can_dma = false; if (spicfg) - can_dma = spicfg->io_type == SPI_IO_TYPE_DMA; + can_dma = (spicfg->io_type == SPI_IO_TYPE_DMA) && + (xfer->len >= DMA_MIN_BYTES); return can_dma; } @@ -620,10 +623,9 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t) reinit_completion(&dspi->done); - if (spicfg->io_type == SPI_IO_TYPE_INTR) - set_io_bits(dspi->base + SPIINT, SPIINT_MASKINT); - - if (spicfg->io_type != SPI_IO_TYPE_DMA) { + if (!davinci_spi_can_dma(spi->master, spi, t)) { + if (spicfg->io_type != SPI_IO_TYPE_POLL) + set_io_bits(dspi->base + SPIINT, SPIINT_MASKINT); /* start the transfer */ dspi->wcount--; tx_data = dspi->get_tx(dspi); @@ -698,7 +700,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t) } clear_io_bits(dspi->base + SPIINT, SPIINT_MASKALL); - if (spicfg->io_type == SPI_IO_TYPE_DMA) + if (davinci_spi_can_dma(spi->master, spi, t)) clear_io_bits(dspi->base + SPIINT, SPIINT_DMA_REQ_EN); clear_io_bits(dspi->base + SPIGCR1, SPIGCR1_SPIENA_MASK); |