spi: spi-fsl-dspi: Bug fix incorrect CS de-assert
authorHaikun Wang <haikun.wang@freescale.com>
Wed, 13 May 2015 10:12:15 +0000 (18:12 +0800)
committerMark Brown <broonie@kernel.org>
Thu, 21 May 2015 20:54:24 +0000 (21:54 +0100)
SPI chip select signal need to keep asserted between several
spi_transfer in the same spi_message usually.
But the driver will de-assert CS signal and the assert it between
serval spi_transfer in the same spi_message under some condiations.
This patch fix the bug.

Here is an example:
Assume you have two variables like the following,
struct spi_transfer a;
struct spi_transfer b;
if you send a spi_message only includes 'a' first,
and then you send a spi_message includes 'a' and 'b'
but without resetting 'a'.
Driver will de-assert CS and then assert CS between 'a' and 'b'.

Signed-off-by: Haikun Wang <haikun.wang@freescale.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-fsl-dspi.c

index 5fe54cd..8af20aa 100644 (file)
@@ -341,10 +341,10 @@ static int dspi_transfer_one_message(struct spi_master *master,
                dspi->cur_msg = message;
                dspi->cur_chip = spi_get_ctldata(spi);
                dspi->cs = spi->chip_select;
+               dspi->cs_change = 0;
                if (dspi->cur_transfer->transfer_list.next
                                == &dspi->cur_msg->transfers)
-                       transfer->cs_change = 1;
-               dspi->cs_change = transfer->cs_change;
+                       dspi->cs_change = 1;
                dspi->void_write_data = dspi->cur_chip->void_write_data;
 
                dspi->dataflags = 0;