summaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-armada-3700.c
diff options
context:
space:
mode:
authorMaxime Chevallier <maxime.chevallier@smile.fr>2017-10-10 04:43:18 -0400
committerMark Brown <broonie@kernel.org>2017-10-10 05:17:06 -0400
commitdd7aa8d4b53b3484ba31ba56f3ff1be7deb38530 (patch)
treeac3480bb36c82d2319bb4820a5b02c9d226521ba /drivers/spi/spi-armada-3700.c
parent5a866ec0014b2baa4ecbb1eaa19c835482829d08 (diff)
spi: a3700: Change SPI mode before asserting chip-select
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>
Diffstat (limited to 'drivers/spi/spi-armada-3700.c')
-rw-r--r--drivers/spi/spi-armada-3700.c17
1 files changed, 4 insertions, 13 deletions
diff --git a/drivers/spi/spi-armada-3700.c b/drivers/spi/spi-armada-3700.c
index 568e1c65aa82..77fe55ce790c 100644
--- a/drivers/spi/spi-armada-3700.c
+++ b/drivers/spi/spi-armada-3700.c
@@ -213,7 +213,7 @@ static void a3700_spi_mode_set(struct a3700_spi *a3700_spi,
213} 213}
214 214
215static void a3700_spi_clock_set(struct a3700_spi *a3700_spi, 215static void a3700_spi_clock_set(struct a3700_spi *a3700_spi,
216 unsigned int speed_hz, u16 mode) 216 unsigned int speed_hz)
217{ 217{
218 u32 val; 218 u32 val;
219 u32 prescale; 219 u32 prescale;
@@ -231,17 +231,6 @@ static void a3700_spi_clock_set(struct a3700_spi *a3700_spi,
231 val |= A3700_SPI_CLK_CAPT_EDGE; 231 val |= A3700_SPI_CLK_CAPT_EDGE;
232 spireg_write(a3700_spi, A3700_SPI_IF_TIME_REG, val); 232 spireg_write(a3700_spi, A3700_SPI_IF_TIME_REG, val);
233 } 233 }
234
235 val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
236 val &= ~(A3700_SPI_CLK_POL | A3700_SPI_CLK_PHA);
237
238 if (mode & SPI_CPOL)
239 val |= A3700_SPI_CLK_POL;
240
241 if (mode & SPI_CPHA)
242 val |= A3700_SPI_CLK_PHA;
243
244 spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
245} 234}
246 235
247static void a3700_spi_bytelen_set(struct a3700_spi *a3700_spi, unsigned int len) 236static 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,
423 412
424 a3700_spi = spi_master_get_devdata(spi->master); 413 a3700_spi = spi_master_get_devdata(spi->master);
425 414
426 a3700_spi_clock_set(a3700_spi, xfer->speed_hz, spi->mode); 415 a3700_spi_clock_set(a3700_spi, xfer->speed_hz);
427 416
428 byte_len = xfer->bits_per_word >> 3; 417 byte_len = xfer->bits_per_word >> 3;
429 418
@@ -584,6 +573,8 @@ static int a3700_spi_prepare_message(struct spi_master *master,
584 573
585 a3700_spi_bytelen_set(a3700_spi, 4); 574 a3700_spi_bytelen_set(a3700_spi, 4);
586 575
576 a3700_spi_mode_set(a3700_spi, spi->mode);
577
587 return 0; 578 return 0;
588} 579}
589 580