spi: a3700: Change SPI mode before asserting chip-select
authorMaxime Chevallier <maxime.chevallier@smile.fr>
Tue, 10 Oct 2017 08:43:18 +0000 (10:43 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 10 Oct 2017 09:17:06 +0000 (10:17 +0100)
The spi device mode should be configured in the controller before the
chip-select is asserted, so that a clock polarity configuration change
is not interpreted as a clock tick by the device.

This patch moves the mode setting to the 'prepare_message' function
instead of the 'transfer_one' function.

By doing so, this patch also removes redundant code in
a3700_spi_clock_set.

This was tested on EspressoBin board, with spidev.

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

index 568e1c6..77fe55c 100644 (file)
@@ -213,7 +213,7 @@ static void a3700_spi_mode_set(struct a3700_spi *a3700_spi,
 }
 
 static void a3700_spi_clock_set(struct a3700_spi *a3700_spi,
-                               unsigned int speed_hz, u16 mode)
+                               unsigned int speed_hz)
 {
        u32 val;
        u32 prescale;
@@ -231,17 +231,6 @@ static void a3700_spi_clock_set(struct a3700_spi *a3700_spi,
                val |= A3700_SPI_CLK_CAPT_EDGE;
                spireg_write(a3700_spi, A3700_SPI_IF_TIME_REG, val);
        }
-
-       val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
-       val &= ~(A3700_SPI_CLK_POL | A3700_SPI_CLK_PHA);
-
-       if (mode & SPI_CPOL)
-               val |= A3700_SPI_CLK_POL;
-
-       if (mode & SPI_CPHA)
-               val |= A3700_SPI_CLK_PHA;
-
-       spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 }
 
 static void a3700_spi_bytelen_set(struct a3700_spi *a3700_spi, unsigned int len)
@@ -423,7 +412,7 @@ static void a3700_spi_transfer_setup(struct spi_device *spi,
 
        a3700_spi = spi_master_get_devdata(spi->master);
 
-       a3700_spi_clock_set(a3700_spi, xfer->speed_hz, spi->mode);
+       a3700_spi_clock_set(a3700_spi, xfer->speed_hz);
 
        byte_len = xfer->bits_per_word >> 3;
 
@@ -584,6 +573,8 @@ static int a3700_spi_prepare_message(struct spi_master *master,
 
        a3700_spi_bytelen_set(a3700_spi, 4);
 
+       a3700_spi_mode_set(a3700_spi, spi->mode);
+
        return 0;
 }