diff options
-rw-r--r-- | drivers/spi/spi-stm32.c | 23 |
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) { |