summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrode Isaksen <fisaksen@baylibre.com>2017-02-23 19:01:58 +0100
committerMark Brown <broonie@kernel.org>2017-03-15 19:35:39 +0000
commit6b3a631e7f8eca75a987ed760898d28fb3628143 (patch)
tree25fca4f838523eb829c5313c6c88ffcead168026
parent3e2e1258443ea97e40dfb4a3cf15108d17939066 (diff)
downloadop-kernel-dev-6b3a631e7f8eca75a987ed760898d28fb3628143.zip
op-kernel-dev-6b3a631e7f8eca75a987ed760898d28fb3628143.tar.gz
spi: davinci: use rx buffer as dummy tx buffer
When doing rx-only transfer, the transfer will fail if the number of SG entries exceeds 20. This happens because the eDMA DMA engine is limited to 20 SG entries in one transaction, and when the DMA transcation is resumed (which takes > 150us), rx errors occurs because the slave is still transmitting. Fix this by using the rx buffer as the dummy tx buffer, so that resuming the rx transcation happens at the same time as resuming the tx transcation. Signed-off-by: Frode Isaksen <fisaksen@baylibre.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-davinci.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c
index 1e24395..ca12216 100644
--- a/drivers/spi/spi-davinci.c
+++ b/drivers/spi/spi-davinci.c
@@ -655,6 +655,12 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
if (!rxdesc)
goto err_desc;
+ if (!t->tx_buf) {
+ /* use rx buffer as dummy tx buffer */
+ t->tx_sg.sgl = t->rx_sg.sgl;
+ t->tx_sg.nents = t->rx_sg.nents;
+ }
+
txdesc = dmaengine_prep_slave_sg(dspi->dma_tx,
t->tx_sg.sgl, t->tx_sg.nents, DMA_MEM_TO_DEV,
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
@@ -957,7 +963,7 @@ static int davinci_spi_probe(struct platform_device *pdev)
master->bus_num = pdev->id;
master->num_chipselect = pdata->num_chipselect;
master->bits_per_word_mask = SPI_BPW_RANGE_MASK(2, 16);
- master->flags = (SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX);
+ master->flags = SPI_MASTER_MUST_RX;
master->setup = davinci_spi_setup;
master->cleanup = davinci_spi_cleanup;
master->can_dma = davinci_spi_can_dma;
OpenPOWER on IntegriCloud