forked from mirrors/linux
		
	spi: stm32: make spurious and overrun interrupts visible
We do not expect to receive spurious interrupts so rise a warning if it happens. RX overrun is an error condition that signals a corrupted RX stream both in dma and in irq modes. Report the error and abort the transfer in either cases. Signed-off-by: Alain Volmat <alain.volmat@foss.st.com> Link: https://lore.kernel.org/r/1612551572-495-9-git-send-email-alain.volmat@foss.st.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
		
							parent
							
								
									e1e2093b16
								
							
						
					
					
						commit
						c64e7efe46
					
				
					 1 changed files with 4 additions and 11 deletions
				
			
		| 
						 | 
					@ -895,8 +895,8 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id)
 | 
				
			||||||
		mask |= STM32H7_SPI_SR_RXP;
 | 
							mask |= STM32H7_SPI_SR_RXP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(sr & mask)) {
 | 
						if (!(sr & mask)) {
 | 
				
			||||||
		dev_dbg(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n",
 | 
							dev_warn(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n",
 | 
				
			||||||
			sr, ier);
 | 
								 sr, ier);
 | 
				
			||||||
		spin_unlock_irqrestore(&spi->lock, flags);
 | 
							spin_unlock_irqrestore(&spi->lock, flags);
 | 
				
			||||||
		return IRQ_NONE;
 | 
							return IRQ_NONE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -923,15 +923,8 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (sr & STM32H7_SPI_SR_OVR) {
 | 
						if (sr & STM32H7_SPI_SR_OVR) {
 | 
				
			||||||
		dev_warn(spi->dev, "Overrun: received value discarded\n");
 | 
							dev_err(spi->dev, "Overrun: RX data lost\n");
 | 
				
			||||||
		if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0)))
 | 
							end = true;
 | 
				
			||||||
			stm32h7_spi_read_rxfifo(spi, false);
 | 
					 | 
				
			||||||
		/*
 | 
					 | 
				
			||||||
		 * If overrun is detected while using DMA, it means that
 | 
					 | 
				
			||||||
		 * something went wrong, so stop the current transfer
 | 
					 | 
				
			||||||
		 */
 | 
					 | 
				
			||||||
		if (spi->cur_usedma)
 | 
					 | 
				
			||||||
			end = true;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (sr & STM32H7_SPI_SR_EOT) {
 | 
						if (sr & STM32H7_SPI_SR_EOT) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue