From: Alain Volmat Date: Tue, 6 Jan 2026 11:34:32 +0000 (+0100) Subject: media: stm32: dcmi: stop the dma transfer on overrun X-Git-Tag: v7.1-rc1~169^2~223 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=4847286b87ccda7bdec8245f35c07203ce9eb0ed;p=thirdparty%2Fkernel%2Flinux.git media: stm32: dcmi: stop the dma transfer on overrun Ensure to stop the dma transfer whenever receiving a overrun to avoid having a buffer partially filled with a frame and partially with the next frame. Signed-off-by: Alain Volmat Signed-off-by: Sakari Ailus Signed-off-by: Mauro Carvalho Chehab --- diff --git a/drivers/media/platform/st/stm32/stm32-dcmi.c b/drivers/media/platform/st/stm32/stm32-dcmi.c index 0874974bbad4c..20f5b9ab6a1c6 100644 --- a/drivers/media/platform/st/stm32/stm32-dcmi.c +++ b/drivers/media/platform/st/stm32/stm32-dcmi.c @@ -402,9 +402,21 @@ static irqreturn_t dcmi_irq_thread(int irq, void *arg) spin_lock_irq(&dcmi->irqlock); if (dcmi->misr & IT_OVR) { + /* Disable capture */ + reg_clear(dcmi->regs, DCMI_CR, CR_CAPTURE); + dcmi->overrun_count++; + if (dcmi->overrun_count > OVERRUN_ERROR_THRESHOLD) dcmi->errors_count++; + + spin_unlock_irq(&dcmi->irqlock); + dmaengine_terminate_sync(dcmi->dma_chan); + + if (dcmi_restart_capture(dcmi)) + dev_err(dcmi->dev, "%s: Cannot restart capture\n", __func__); + + return IRQ_HANDLED; } if (dcmi->misr & IT_ERR) dcmi->errors_count++;