]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
spi: davinci: use rx buffer as dummy tx buffer
authorFrode Isaksen <fisaksen@baylibre.com>
Thu, 23 Feb 2017 18:01:58 +0000 (19:01 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 15 Mar 2017 19:35:39 +0000 (19:35 +0000)
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>
drivers/spi/spi-davinci.c

index 1e24395a04f210f85ec31e59c6e4f80e24eb6c2c..ca122165a3c6f67e5a36b32d84a3be26bb1e1d80 100644 (file)
@@ -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;