diff options
| -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) |
