spi: a3700: Clear DATA_OUT when performing a read
authorMaxime Chevallier <maxime.chevallier@smile.fr>
Wed, 17 Jan 2018 16:15:25 +0000 (17:15 +0100)
committerMark Brown <broonie@kernel.org>
Thu, 18 Jan 2018 10:59:12 +0000 (10:59 +0000)
When performing a read using FIFO mode, the spi controller shifts out
the last 2 bytes that were written in a previous transfer on MOSI.

This undocumented behaviour can cause devices to misinterpret the
transfer, so we explicitly clear the WFIFO before each read.

This behaviour was noticed on EspressoBin.

Signed-off-by: Maxime Chevallier <maxime.chevallier@smile.fr>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-armada-3700.c

index 77fe55c..4857b01 100644 (file)
@@ -607,6 +607,11 @@ static int a3700_spi_transfer_one(struct spi_master *master,
        a3700_spi_header_set(a3700_spi);
 
        if (xfer->rx_buf) {
+               /* Clear WFIFO, since it's last 2 bytes are shifted out during
+                * a read operation
+                */
+               spireg_write(a3700_spi, A3700_SPI_DATA_OUT_REG, 0);
+
                /* Set read data length */
                spireg_write(a3700_spi, A3700_SPI_IF_DIN_CNT_REG,
                             a3700_spi->buf_len);