diff options
author | Geert Uytterhoeven <geert+renesas@glider.be> | 2014-06-02 09:38:13 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-06-02 10:49:34 -0400 |
commit | 8393fa787bf63c05cb6f9cf0a58ba1ea213c3f01 (patch) | |
tree | 5833dd9ea1953097d4062b12fc68f1b350701e0d /drivers/spi | |
parent | 2f777ec91aa0623e058c43dd4aaf0b3325d3c3e8 (diff) |
spi: rspi: Move RSPI-specific setup out of DMA routines
Refactor RSPI (on SH) DMA handling to make it reusable for other RSPI
implementations:
- Call the DMA routines after configuring the TX Mode bit and after
calling rspi_receive_init(), so these RSPI-specific operations can be
removed from the DMA routines,
- Absorb rspi_transfer_out_in() into rspi_transfer_one().
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'drivers/spi')
-rw-r--r-- | drivers/spi/spi-rspi.c | 30 |
1 files changed, 10 insertions, 20 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 753ac7bdfd55..3dea8adfdcf3 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
@@ -480,7 +480,6 @@ static int rspi_send_dma(struct rspi_data *rspi, struct spi_transfer *t) | |||
480 | */ | 480 | */ |
481 | disable_irq(rspi->tx_irq); | 481 | disable_irq(rspi->tx_irq); |
482 | 482 | ||
483 | rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) | SPCR_TXMD, RSPI_SPCR); | ||
484 | rspi_enable_irq(rspi, SPCR_SPTIE); | 483 | rspi_enable_irq(rspi, SPCR_SPTIE); |
485 | rspi->dma_callbacked = 0; | 484 | rspi->dma_callbacked = 0; |
486 | 485 | ||
@@ -550,8 +549,6 @@ static int rspi_send_receive_dma(struct rspi_data *rspi, struct spi_transfer *t) | |||
550 | if (!desc_rx) | 549 | if (!desc_rx) |
551 | return -EIO; | 550 | return -EIO; |
552 | 551 | ||
553 | rspi_receive_init(rspi); | ||
554 | |||
555 | /* | 552 | /* |
556 | * DMAC needs SPTIE, but if SPTIE is set, this IRQ routine will be | 553 | * DMAC needs SPTIE, but if SPTIE is set, this IRQ routine will be |
557 | * called. So, this driver disables the IRQ while DMA transfer. | 554 | * called. So, this driver disables the IRQ while DMA transfer. |
@@ -560,7 +557,6 @@ static int rspi_send_receive_dma(struct rspi_data *rspi, struct spi_transfer *t) | |||
560 | if (rspi->rx_irq != rspi->tx_irq) | 557 | if (rspi->rx_irq != rspi->tx_irq) |
561 | disable_irq(rspi->rx_irq); | 558 | disable_irq(rspi->rx_irq); |
562 | 559 | ||
563 | rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) & ~SPCR_TXMD, RSPI_SPCR); | ||
564 | rspi_enable_irq(rspi, SPCR_SPTIE | SPCR_SPRIE); | 560 | rspi_enable_irq(rspi, SPCR_SPTIE | SPCR_SPRIE); |
565 | rspi->dma_callbacked = 0; | 561 | rspi->dma_callbacked = 0; |
566 | 562 | ||
@@ -602,9 +598,10 @@ static bool rspi_can_dma(struct spi_master *master, struct spi_device *spi, | |||
602 | return __rspi_can_dma(rspi, xfer); | 598 | return __rspi_can_dma(rspi, xfer); |
603 | } | 599 | } |
604 | 600 | ||
605 | static int rspi_transfer_out_in(struct rspi_data *rspi, | 601 | static int rspi_transfer_one(struct spi_master *master, struct spi_device *spi, |
606 | struct spi_transfer *xfer) | 602 | struct spi_transfer *xfer) |
607 | { | 603 | { |
604 | struct rspi_data *rspi = spi_master_get_devdata(master); | ||
608 | u8 spcr; | 605 | u8 spcr; |
609 | int ret; | 606 | int ret; |
610 | 607 | ||
@@ -617,6 +614,13 @@ static int rspi_transfer_out_in(struct rspi_data *rspi, | |||
617 | } | 614 | } |
618 | rspi_write8(rspi, spcr, RSPI_SPCR); | 615 | rspi_write8(rspi, spcr, RSPI_SPCR); |
619 | 616 | ||
617 | if (master->can_dma && __rspi_can_dma(rspi, xfer)) { | ||
618 | if (xfer->rx_buf) | ||
619 | return rspi_send_receive_dma(rspi, xfer); | ||
620 | else | ||
621 | return rspi_send_dma(rspi, xfer); | ||
622 | } | ||
623 | |||
620 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); | 624 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); |
621 | if (ret < 0) | 625 | if (ret < 0) |
622 | return ret; | 626 | return ret; |
@@ -627,20 +631,6 @@ static int rspi_transfer_out_in(struct rspi_data *rspi, | |||
627 | return 0; | 631 | return 0; |
628 | } | 632 | } |
629 | 633 | ||
630 | static int rspi_transfer_one(struct spi_master *master, struct spi_device *spi, | ||
631 | struct spi_transfer *xfer) | ||
632 | { | ||
633 | struct rspi_data *rspi = spi_master_get_devdata(master); | ||
634 | |||
635 | if (!master->can_dma || !__rspi_can_dma(rspi, xfer)) | ||
636 | return rspi_transfer_out_in(rspi, xfer); | ||
637 | |||
638 | if (xfer->rx_buf) | ||
639 | return rspi_send_receive_dma(rspi, xfer); | ||
640 | else | ||
641 | return rspi_send_dma(rspi, xfer); | ||
642 | } | ||
643 | |||
644 | static int rspi_rz_transfer_out_in(struct rspi_data *rspi, | 634 | static int rspi_rz_transfer_out_in(struct rspi_data *rspi, |
645 | struct spi_transfer *xfer) | 635 | struct spi_transfer *xfer) |
646 | { | 636 | { |