summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Goldschmidt <simon.k.r.goldschmidt@gmail.com>2018-09-04 15:49:44 -0400
committerMark Brown <broonie@kernel.org>2018-09-06 07:09:37 -0400
commitaf060b3f72b801962033f75a2fda25fff992796d (patch)
treed4c37f8b64d86ef924a7422a0cf278b33c8b3f47
parent48c29d0d27fbbb4c78d3c14c50067d7e8919ed95 (diff)
spi: dw: support 4-16 bits per word
The spi-dw driver currently only supports 8 or 16 bits per word. Since the hardware supports 4-16 bits per word, adapt the driver to also support this. Tested on socfpga cyclone5 with a 9-bit SPI display. Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-dw.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c
index 1736612ee86b..3e205ab60cd4 100644
--- a/drivers/spi/spi-dw.c
+++ b/drivers/spi/spi-dw.c
@@ -308,15 +308,10 @@ static int dw_spi_transfer_one(struct spi_controller *master,
308 dws->current_freq = transfer->speed_hz; 308 dws->current_freq = transfer->speed_hz;
309 spi_set_clk(dws, chip->clk_div); 309 spi_set_clk(dws, chip->clk_div);
310 } 310 }
311 if (transfer->bits_per_word == 8) { 311
312 dws->n_bytes = 1; 312 dws->n_bytes = DIV_ROUND_UP(transfer->bits_per_word, BITS_PER_BYTE);
313 dws->dma_width = 1; 313 dws->dma_width = DIV_ROUND_UP(transfer->bits_per_word, BITS_PER_BYTE);
314 } else if (transfer->bits_per_word == 16) { 314
315 dws->n_bytes = 2;
316 dws->dma_width = 2;
317 } else {
318 return -EINVAL;
319 }
320 /* Default SPI mode is SCPOL = 0, SCPH = 0 */ 315 /* Default SPI mode is SCPOL = 0, SCPH = 0 */
321 cr0 = (transfer->bits_per_word - 1) 316 cr0 = (transfer->bits_per_word - 1)
322 | (chip->type << SPI_FRF_OFFSET) 317 | (chip->type << SPI_FRF_OFFSET)
@@ -496,7 +491,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
496 } 491 }
497 492
498 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LOOP; 493 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LOOP;
499 master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16); 494 master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16);
500 master->bus_num = dws->bus_num; 495 master->bus_num = dws->bus_num;
501 master->num_chipselect = dws->num_cs; 496 master->num_chipselect = dws->num_cs;
502 master->setup = dw_spi_setup; 497 master->setup = dw_spi_setup;