aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert+renesas@linux-m68k.org>2014-01-24 03:44:00 -0500
committerMark Brown <broonie@linaro.org>2014-01-27 15:07:38 -0500
commit06a7a3cff042a36fb7e6af71039a17c6d1a6d90f (patch)
tree0d6e503c01cad01f65576e15c2b9ba7782776277
parent862d357f84f009fdcba22be8d6a2f82ff80ab740 (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.c22
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) {