aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-rspi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-rspi.c')
-rw-r--r--drivers/spi/spi-rspi.c45
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
544no_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
545static void rspi_receive_init(const struct rspi_data *rspi) 551static 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
665static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer) 675static 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
930static void rspi_release_dma(struct rspi_data *rspi) 943static 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
938static int rspi_remove(struct platform_device *pdev) 951static 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
1143error3: 1156error3:
1144 rspi_release_dma(rspi); 1157 rspi_release_dma(master);
1145error2: 1158error2:
1146 pm_runtime_disable(&pdev->dev); 1159 pm_runtime_disable(&pdev->dev);
1147error1: 1160error1: