提交 0718b764 编写于 作者: F Frode Isaksen 提交者: Mark Brown

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: NFrode Isaksen <fisaksen@baylibre.com>
Signed-off-by: NMark Brown <broonie@kernel.org>
上级 6b3a631e
...@@ -109,6 +109,8 @@ ...@@ -109,6 +109,8 @@
#define SPIDEF 0x4c #define SPIDEF 0x4c
#define SPIFMT0 0x50 #define SPIFMT0 0x50
#define DMA_MIN_BYTES 16
/* SPI Controller driver's private data. */ /* SPI Controller driver's private data. */
struct davinci_spi { struct davinci_spi {
struct spi_bitbang bitbang; struct spi_bitbang bitbang;
...@@ -479,7 +481,8 @@ static bool davinci_spi_can_dma(struct spi_master *master, ...@@ -479,7 +481,8 @@ static bool davinci_spi_can_dma(struct spi_master *master,
bool can_dma = false; bool can_dma = false;
if (spicfg) 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; return can_dma;
} }
...@@ -620,10 +623,9 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t) ...@@ -620,10 +623,9 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
reinit_completion(&dspi->done); reinit_completion(&dspi->done);
if (spicfg->io_type == SPI_IO_TYPE_INTR) if (!davinci_spi_can_dma(spi->master, spi, t)) {
set_io_bits(dspi->base + SPIINT, SPIINT_MASKINT); if (spicfg->io_type != SPI_IO_TYPE_POLL)
set_io_bits(dspi->base + SPIINT, SPIINT_MASKINT);
if (spicfg->io_type != SPI_IO_TYPE_DMA) {
/* start the transfer */ /* start the transfer */
dspi->wcount--; dspi->wcount--;
tx_data = dspi->get_tx(dspi); tx_data = dspi->get_tx(dspi);
...@@ -698,7 +700,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t) ...@@ -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); 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 + SPIINT, SPIINT_DMA_REQ_EN);
clear_io_bits(dspi->base + SPIGCR1, SPIGCR1_SPIENA_MASK); clear_io_bits(dspi->base + SPIGCR1, SPIGCR1_SPIENA_MASK);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册