diff options
Diffstat (limited to 'drivers/spi/spi-rspi.c')
-rw-r--r-- | drivers/spi/spi-rspi.c | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 10112745bb17..c850dfdfa9e3 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
@@ -477,7 +477,7 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx, | |||
477 | tx->sgl, tx->nents, DMA_TO_DEVICE, | 477 | tx->sgl, tx->nents, DMA_TO_DEVICE, |
478 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | 478 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
479 | if (!desc_tx) | 479 | if (!desc_tx) |
480 | return -EIO; | 480 | goto no_dma; |
481 | 481 | ||
482 | irq_mask |= SPCR_SPTIE; | 482 | irq_mask |= SPCR_SPTIE; |
483 | } | 483 | } |
@@ -486,7 +486,7 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx, | |||
486 | rx->sgl, rx->nents, DMA_FROM_DEVICE, | 486 | rx->sgl, rx->nents, DMA_FROM_DEVICE, |
487 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | 487 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
488 | if (!desc_rx) | 488 | if (!desc_rx) |
489 | return -EIO; | 489 | goto no_dma; |
490 | 490 | ||
491 | irq_mask |= SPCR_SPRIE; | 491 | irq_mask |= SPCR_SPRIE; |
492 | } | 492 | } |
@@ -540,6 +540,12 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx, | |||
540 | enable_irq(rspi->rx_irq); | 540 | enable_irq(rspi->rx_irq); |
541 | 541 | ||
542 | return ret; | 542 | return ret; |
543 | |||
544 | no_dma: | ||
545 | pr_warn_once("%s %s: DMA not available, falling back to PIO\n", | ||
546 | dev_driver_string(&rspi->master->dev), | ||
547 | dev_name(&rspi->master->dev)); | ||
548 | return -EAGAIN; | ||
543 | } | 549 | } |
544 | 550 | ||
545 | static void rspi_receive_init(const struct rspi_data *rspi) | 551 | static void rspi_receive_init(const struct rspi_data *rspi) |
@@ -593,8 +599,10 @@ static int rspi_common_transfer(struct rspi_data *rspi, | |||
593 | 599 | ||
594 | if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) { | 600 | if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) { |
595 | /* rx_buf can be NULL on RSPI on SH in TX-only Mode */ | 601 | /* rx_buf can be NULL on RSPI on SH in TX-only Mode */ |
596 | return rspi_dma_transfer(rspi, &xfer->tx_sg, | 602 | ret = rspi_dma_transfer(rspi, &xfer->tx_sg, |
597 | xfer->rx_buf ? &xfer->rx_sg : NULL); | 603 | xfer->rx_buf ? &xfer->rx_sg : NULL); |
604 | if (ret != -EAGAIN) | ||
605 | return ret; | ||
598 | } | 606 | } |
599 | 607 | ||
600 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); | 608 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); |
@@ -630,7 +638,6 @@ static int rspi_rz_transfer_one(struct spi_master *master, | |||
630 | struct spi_transfer *xfer) | 638 | struct spi_transfer *xfer) |
631 | { | 639 | { |
632 | struct rspi_data *rspi = spi_master_get_devdata(master); | 640 | struct rspi_data *rspi = spi_master_get_devdata(master); |
633 | int ret; | ||
634 | 641 | ||
635 | rspi_rz_receive_init(rspi); | 642 | rspi_rz_receive_init(rspi); |
636 | 643 | ||
@@ -649,8 +656,11 @@ static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer) | |||
649 | { | 656 | { |
650 | int ret; | 657 | int ret; |
651 | 658 | ||
652 | if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) | 659 | if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) { |
653 | return rspi_dma_transfer(rspi, &xfer->tx_sg, NULL); | 660 | ret = rspi_dma_transfer(rspi, &xfer->tx_sg, NULL); |
661 | if (ret != -EAGAIN) | ||
662 | return ret; | ||
663 | } | ||
654 | 664 | ||
655 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, NULL, xfer->len); | 665 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, NULL, xfer->len); |
656 | if (ret < 0) | 666 | if (ret < 0) |
@@ -664,8 +674,11 @@ static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer) | |||
664 | 674 | ||
665 | static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer) | 675 | static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer) |
666 | { | 676 | { |
667 | if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) | 677 | if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) { |
668 | return rspi_dma_transfer(rspi, NULL, &xfer->rx_sg); | 678 | int ret = rspi_dma_transfer(rspi, NULL, &xfer->rx_sg); |
679 | if (ret != -EAGAIN) | ||
680 | return ret; | ||
681 | } | ||
669 | 682 | ||
670 | return rspi_pio_transfer(rspi, NULL, xfer->rx_buf, xfer->len); | 683 | return rspi_pio_transfer(rspi, NULL, xfer->rx_buf, xfer->len); |
671 | } | 684 | } |
@@ -927,19 +940,19 @@ static int rspi_request_dma(struct device *dev, struct spi_master *master, | |||
927 | return 0; | 940 | return 0; |
928 | } | 941 | } |
929 | 942 | ||
930 | static void rspi_release_dma(struct rspi_data *rspi) | 943 | static void rspi_release_dma(struct spi_master *master) |
931 | { | 944 | { |
932 | if (rspi->master->dma_tx) | 945 | if (master->dma_tx) |
933 | dma_release_channel(rspi->master->dma_tx); | 946 | dma_release_channel(master->dma_tx); |
934 | if (rspi->master->dma_rx) | 947 | if (master->dma_rx) |
935 | dma_release_channel(rspi->master->dma_rx); | 948 | dma_release_channel(master->dma_rx); |
936 | } | 949 | } |
937 | 950 | ||
938 | static int rspi_remove(struct platform_device *pdev) | 951 | static int rspi_remove(struct platform_device *pdev) |
939 | { | 952 | { |
940 | struct rspi_data *rspi = platform_get_drvdata(pdev); | 953 | struct rspi_data *rspi = platform_get_drvdata(pdev); |
941 | 954 | ||
942 | rspi_release_dma(rspi); | 955 | rspi_release_dma(rspi->master); |
943 | pm_runtime_disable(&pdev->dev); | 956 | pm_runtime_disable(&pdev->dev); |
944 | 957 | ||
945 | return 0; | 958 | return 0; |
@@ -1141,7 +1154,7 @@ static int rspi_probe(struct platform_device *pdev) | |||
1141 | return 0; | 1154 | return 0; |
1142 | 1155 | ||
1143 | error3: | 1156 | error3: |
1144 | rspi_release_dma(rspi); | 1157 | rspi_release_dma(master); |
1145 | error2: | 1158 | error2: |
1146 | pm_runtime_disable(&pdev->dev); | 1159 | pm_runtime_disable(&pdev->dev); |
1147 | error1: | 1160 | error1: |