diff options
author | Geert Uytterhoeven <geert+renesas@glider.be> | 2014-06-02 09:38:19 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-06-02 10:49:36 -0400 |
commit | 8b983e90ea1a3dd82070f96c062ad521a06b7cc0 (patch) | |
tree | 8ba34cfc7cca40450160e683f9fedb0a49ed00b2 /drivers/spi | |
parent | e7fb921d9f62df05240ad1a74b5a0f623e503c9c (diff) |
spi: rspi: Extract rspi_common_transfer()
Extract the common parts of rspi_transfer_one(), rspi_rz_transfer_one(),
and qspi_transfer_out_in() into the new function rspi_common_transfer().
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 | 61 |
1 files changed, 24 insertions, 37 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 4bc4138e002b..10112745bb17 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
@@ -586,12 +586,32 @@ static bool rspi_can_dma(struct spi_master *master, struct spi_device *spi, | |||
586 | return __rspi_can_dma(rspi, xfer); | 586 | return __rspi_can_dma(rspi, xfer); |
587 | } | 587 | } |
588 | 588 | ||
589 | static int rspi_common_transfer(struct rspi_data *rspi, | ||
590 | struct spi_transfer *xfer) | ||
591 | { | ||
592 | int ret; | ||
593 | |||
594 | if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) { | ||
595 | /* rx_buf can be NULL on RSPI on SH in TX-only Mode */ | ||
596 | return rspi_dma_transfer(rspi, &xfer->tx_sg, | ||
597 | xfer->rx_buf ? &xfer->rx_sg : NULL); | ||
598 | } | ||
599 | |||
600 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); | ||
601 | if (ret < 0) | ||
602 | return ret; | ||
603 | |||
604 | /* Wait for the last transmission */ | ||
605 | rspi_wait_for_tx_empty(rspi); | ||
606 | |||
607 | return 0; | ||
608 | } | ||
609 | |||
589 | static int rspi_transfer_one(struct spi_master *master, struct spi_device *spi, | 610 | static int rspi_transfer_one(struct spi_master *master, struct spi_device *spi, |
590 | struct spi_transfer *xfer) | 611 | struct spi_transfer *xfer) |
591 | { | 612 | { |
592 | struct rspi_data *rspi = spi_master_get_devdata(master); | 613 | struct rspi_data *rspi = spi_master_get_devdata(master); |
593 | u8 spcr; | 614 | u8 spcr; |
594 | int ret; | ||
595 | 615 | ||
596 | spcr = rspi_read8(rspi, RSPI_SPCR); | 616 | spcr = rspi_read8(rspi, RSPI_SPCR); |
597 | if (xfer->rx_buf) { | 617 | if (xfer->rx_buf) { |
@@ -602,18 +622,7 @@ static int rspi_transfer_one(struct spi_master *master, struct spi_device *spi, | |||
602 | } | 622 | } |
603 | rspi_write8(rspi, spcr, RSPI_SPCR); | 623 | rspi_write8(rspi, spcr, RSPI_SPCR); |
604 | 624 | ||
605 | if (master->can_dma && __rspi_can_dma(rspi, xfer)) | 625 | return rspi_common_transfer(rspi, xfer); |
606 | return rspi_dma_transfer(rspi, &xfer->tx_sg, | ||
607 | xfer->rx_buf ? &xfer->rx_sg : NULL); | ||
608 | |||
609 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); | ||
610 | if (ret < 0) | ||
611 | return ret; | ||
612 | |||
613 | /* Wait for the last transmission */ | ||
614 | rspi_wait_for_tx_empty(rspi); | ||
615 | |||
616 | return 0; | ||
617 | } | 626 | } |
618 | 627 | ||
619 | static int rspi_rz_transfer_one(struct spi_master *master, | 628 | static int rspi_rz_transfer_one(struct spi_master *master, |
@@ -625,37 +634,15 @@ static int rspi_rz_transfer_one(struct spi_master *master, | |||
625 | 634 | ||
626 | rspi_rz_receive_init(rspi); | 635 | rspi_rz_receive_init(rspi); |
627 | 636 | ||
628 | if (master->can_dma && __rspi_can_dma(rspi, xfer)) | 637 | return rspi_common_transfer(rspi, xfer); |
629 | return rspi_dma_transfer(rspi, &xfer->tx_sg, &xfer->rx_sg); | ||
630 | |||
631 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); | ||
632 | if (ret < 0) | ||
633 | return ret; | ||
634 | |||
635 | /* Wait for the last transmission */ | ||
636 | rspi_wait_for_tx_empty(rspi); | ||
637 | |||
638 | return 0; | ||
639 | } | 638 | } |
640 | 639 | ||
641 | static int qspi_transfer_out_in(struct rspi_data *rspi, | 640 | static int qspi_transfer_out_in(struct rspi_data *rspi, |
642 | struct spi_transfer *xfer) | 641 | struct spi_transfer *xfer) |
643 | { | 642 | { |
644 | int ret; | ||
645 | |||
646 | qspi_receive_init(rspi); | 643 | qspi_receive_init(rspi); |
647 | 644 | ||
648 | if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) | 645 | return rspi_common_transfer(rspi, xfer); |
649 | return rspi_dma_transfer(rspi, &xfer->tx_sg, &xfer->rx_sg); | ||
650 | |||
651 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); | ||
652 | if (ret < 0) | ||
653 | return ret; | ||
654 | |||
655 | /* Wait for the last transmission */ | ||
656 | rspi_wait_for_tx_empty(rspi); | ||
657 | |||
658 | return 0; | ||
659 | } | 646 | } |
660 | 647 | ||
661 | static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer) | 648 | static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer) |