diff options
author | Maxime Chevallier <maxime.chevallier@smile.fr> | 2017-10-10 04:43:18 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-10-10 05:17:06 -0400 |
commit | dd7aa8d4b53b3484ba31ba56f3ff1be7deb38530 (patch) | |
tree | ac3480bb36c82d2319bb4820a5b02c9d226521ba /drivers/spi/spi-armada-3700.c | |
parent | 5a866ec0014b2baa4ecbb1eaa19c835482829d08 (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.c | 17 |
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 | ||
215 | static void a3700_spi_clock_set(struct a3700_spi *a3700_spi, | 215 | static 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 | ||
247 | static void a3700_spi_bytelen_set(struct a3700_spi *a3700_spi, unsigned int len) | 236 | 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, | |||
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 | ||