mirror of
https://github.com/torvalds/linux.git
synced 2024-12-02 17:11:33 +00:00
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>
This commit is contained in:
parent
6b3a631e7f
commit
0718b76488
@ -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,
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user