aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/spi/spi-stm32.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c
index 392c9453c2e6..8a6bff379b21 100644
--- a/drivers/spi/spi-stm32.c
+++ b/drivers/spi/spi-stm32.c
@@ -514,6 +514,12 @@ static irqreturn_t stm32_spi_irq(int irq, void *dev_id)
514 dev_warn(spi->dev, "Communication suspended\n"); 514 dev_warn(spi->dev, "Communication suspended\n");
515 if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0))) 515 if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0)))
516 stm32_spi_read_rxfifo(spi, false); 516 stm32_spi_read_rxfifo(spi, false);
517 /*
518 * If communication is suspended while using DMA, it means
519 * that something went wrong, so stop the current transfer
520 */
521 if (spi->cur_usedma)
522 end = true;
517 } 523 }
518 524
519 if (sr & SPI_SR_MODF) { 525 if (sr & SPI_SR_MODF) {
@@ -525,6 +531,12 @@ static irqreturn_t stm32_spi_irq(int irq, void *dev_id)
525 dev_warn(spi->dev, "Overrun: received value discarded\n"); 531 dev_warn(spi->dev, "Overrun: received value discarded\n");
526 if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0))) 532 if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0)))
527 stm32_spi_read_rxfifo(spi, false); 533 stm32_spi_read_rxfifo(spi, false);
534 /*
535 * If overrun is detected while using DMA, it means that
536 * something went wrong, so stop the current transfer
537 */
538 if (spi->cur_usedma)
539 end = true;
528 } 540 }
529 541
530 if (sr & SPI_SR_EOT) { 542 if (sr & SPI_SR_EOT) {
@@ -645,12 +657,10 @@ static void stm32_spi_dma_cb(void *data)
645 657
646 spin_unlock_irqrestore(&spi->lock, flags); 658 spin_unlock_irqrestore(&spi->lock, flags);
647 659
648 if (!(sr & SPI_SR_EOT)) { 660 if (!(sr & SPI_SR_EOT))
649 dev_warn(spi->dev, "DMA callback (sr=0x%08x)\n", sr); 661 dev_warn(spi->dev, "DMA error (sr=0x%08x)\n", sr);
650 662
651 spi_finalize_current_transfer(spi->master); 663 /* Now wait for EOT, or SUSP or OVR in case of error */
652 stm32_spi_disable(spi);
653 }
654} 664}
655 665
656/** 666/**
@@ -986,7 +996,8 @@ static int stm32_spi_transfer_one(struct spi_master *master,
986 spi->tx_len = spi->tx_buf ? transfer->len : 0; 996 spi->tx_len = spi->tx_buf ? transfer->len : 0;
987 spi->rx_len = spi->rx_buf ? transfer->len : 0; 997 spi->rx_len = spi->rx_buf ? transfer->len : 0;
988 998
989 spi->cur_usedma = stm32_spi_can_dma(master, spi_dev, transfer); 999 spi->cur_usedma = (master->can_dma &&
1000 stm32_spi_can_dma(master, spi_dev, transfer));
990 1001
991 ret = stm32_spi_transfer_one_setup(spi, spi_dev, transfer); 1002 ret = stm32_spi_transfer_one_setup(spi, spi_dev, transfer);
992 if (ret) { 1003 if (ret) {