spi: spi-fsl-dspi: Fix SPI transfer issue when using multiple SPI_IOC_MESSAGE
authorSanchayan Maity <maitysanchayan@gmail.com>
Thu, 17 Nov 2016 12:16:48 +0000 (17:46 +0530)
committerMark Brown <broonie@kernel.org>
Fri, 18 Nov 2016 12:03:32 +0000 (12:03 +0000)
Current DMA implementation had a bug where the DMA transfer would
exit the loop in dspi_transfer_one_message after the completion of
a single transfer. This results in a multi message transfer submitted
with SPI_IOC_MESSAGE to terminate incorrectly without an error.

Signed-off-by: Sanchayan Maity <maitysanchayan@gmail.com>
Reviewed-by: Stefan Agner <stefan@agner.ch>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-fsl-dspi.c

index bc64700..b1ee1f5 100644 (file)
@@ -714,7 +714,7 @@ static int dspi_transfer_one_message(struct spi_master *master,
                                SPI_RSER_TFFFE | SPI_RSER_TFFFD |
                                SPI_RSER_RFDFE | SPI_RSER_RFDFD);
                        status = dspi_dma_xfer(dspi);
-                       goto out;
+                       break;
                default:
                        dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n",
                                trans_mode);
@@ -722,9 +722,13 @@ static int dspi_transfer_one_message(struct spi_master *master,
                        goto out;
                }
 
-               if (wait_event_interruptible(dspi->waitq, dspi->waitflags))
-                       dev_err(&dspi->pdev->dev, "wait transfer complete fail!\n");
-               dspi->waitflags = 0;
+               if (trans_mode != DSPI_DMA_MODE) {
+                       if (wait_event_interruptible(dspi->waitq,
+                                               dspi->waitflags))
+                               dev_err(&dspi->pdev->dev,
+                                       "wait transfer complete fail!\n");
+                       dspi->waitflags = 0;
+               }
 
                if (transfer->delay_usecs)
                        udelay(transfer->delay_usecs);