diff options
author | Geert Uytterhoeven <geert+renesas@linux-m68k.org> | 2014-01-24 03:44:00 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-01-27 15:07:38 -0500 |
commit | 06a7a3cff042a36fb7e6af71039a17c6d1a6d90f (patch) | |
tree | 0d6e503c01cad01f65576e15c2b9ba7782776277 | |
parent | 862d357f84f009fdcba22be8d6a2f82ff80ab740 (diff) |
spi: rspi: Add support for loopback mode
Add support for specifying loopback mode.
Signed-off-by: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r-- | drivers/spi/spi-rspi.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 0c7556978d2e..28db8770aaf3 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
@@ -183,8 +183,9 @@ struct rspi_data { | |||
183 | struct spi_master *master; | 183 | struct spi_master *master; |
184 | wait_queue_head_t wait; | 184 | wait_queue_head_t wait; |
185 | struct clk *clk; | 185 | struct clk *clk; |
186 | u8 spsr; | ||
187 | u16 spcmd; | 186 | u16 spcmd; |
187 | u8 spsr; | ||
188 | u8 sppcr; | ||
188 | int rx_irq, tx_irq; | 189 | int rx_irq, tx_irq; |
189 | const struct spi_ops *ops; | 190 | const struct spi_ops *ops; |
190 | 191 | ||
@@ -252,8 +253,8 @@ static int rspi_set_config_register(struct rspi_data *rspi, int access_size) | |||
252 | { | 253 | { |
253 | int spbr; | 254 | int spbr; |
254 | 255 | ||
255 | /* Sets output mode(CMOS) and MOSI signal(from previous transfer) */ | 256 | /* Sets output mode, MOSI signal, and (optionally) loopback */ |
256 | rspi_write8(rspi, 0x00, RSPI_SPPCR); | 257 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); |
257 | 258 | ||
258 | /* Sets transfer bit rate */ | 259 | /* Sets transfer bit rate */ |
259 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1; | 260 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1; |
@@ -288,8 +289,8 @@ static int rspi_rz_set_config_register(struct rspi_data *rspi, int access_size) | |||
288 | { | 289 | { |
289 | int spbr; | 290 | int spbr; |
290 | 291 | ||
291 | /* Sets output mode */ | 292 | /* Sets output mode, MOSI signal, and (optionally) loopback */ |
292 | rspi_write8(rspi, 0x00, RSPI_SPPCR); | 293 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); |
293 | 294 | ||
294 | /* Sets transfer bit rate */ | 295 | /* Sets transfer bit rate */ |
295 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1; | 296 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1; |
@@ -322,8 +323,8 @@ static int qspi_set_config_register(struct rspi_data *rspi, int access_size) | |||
322 | u16 spcmd; | 323 | u16 spcmd; |
323 | int spbr; | 324 | int spbr; |
324 | 325 | ||
325 | /* Sets output mode(CMOS) and MOSI signal(from previous transfer) */ | 326 | /* Sets output mode, MOSI signal, and (optionally) loopback */ |
326 | rspi_write8(rspi, 0x00, RSPI_SPPCR); | 327 | rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); |
327 | 328 | ||
328 | /* Sets transfer bit rate */ | 329 | /* Sets transfer bit rate */ |
329 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz); | 330 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz); |
@@ -829,6 +830,11 @@ static int rspi_setup(struct spi_device *spi) | |||
829 | if (spi->mode & SPI_CPHA) | 830 | if (spi->mode & SPI_CPHA) |
830 | rspi->spcmd |= SPCMD_CPHA; | 831 | rspi->spcmd |= SPCMD_CPHA; |
831 | 832 | ||
833 | /* CMOS output mode and MOSI signal from previous transfer */ | ||
834 | rspi->sppcr = 0; | ||
835 | if (spi->mode & SPI_LOOP) | ||
836 | rspi->sppcr |= SPPCR_SPLP; | ||
837 | |||
832 | set_config_register(rspi, 8); | 838 | set_config_register(rspi, 8); |
833 | 839 | ||
834 | return 0; | 840 | return 0; |
@@ -1050,7 +1056,7 @@ static int rspi_probe(struct platform_device *pdev) | |||
1050 | master->cleanup = rspi_cleanup; | 1056 | master->cleanup = rspi_cleanup; |
1051 | master->prepare_message = rspi_prepare_message; | 1057 | master->prepare_message = rspi_prepare_message; |
1052 | master->unprepare_message = rspi_unprepare_message; | 1058 | master->unprepare_message = rspi_unprepare_message; |
1053 | master->mode_bits = SPI_CPHA | SPI_CPOL; | 1059 | master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LOOP; |
1054 | 1060 | ||
1055 | ret = platform_get_irq_byname(pdev, "rx"); | 1061 | ret = platform_get_irq_byname(pdev, "rx"); |
1056 | if (ret < 0) { | 1062 | if (ret < 0) { |