media: sun6i-csi: Add extra checks to the interrupt routine
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>
Thu, 3 Nov 2022 16:31:11 +0000 (16:31 +0000)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 25 Nov 2022 07:17:57 +0000 (07:17 +0000)
Check against the enabled bits and make sure capture is running before
serving an interrupt, to add extra safety in the process.

Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Acked-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c

index eae0ca5cb8551ee059e4737ae9e42f0e41eb9e17..b9199945d6fe550d18c7a8daf32ba4616b171e69 100644 (file)
@@ -89,13 +89,17 @@ static void sun6i_csi_v4l2_cleanup(struct sun6i_csi_device *csi_dev)
 static irqreturn_t sun6i_csi_interrupt(int irq, void *private)
 {
        struct sun6i_csi_device *csi_dev = private;
+       bool capture_streaming = csi_dev->capture.state.streaming;
        struct regmap *regmap = csi_dev->regmap;
-       u32 status;
+       u32 status = 0, enable = 0;
 
        regmap_read(regmap, SUN6I_CSI_CH_INT_STA_REG, &status);
+       regmap_read(regmap, SUN6I_CSI_CH_INT_EN_REG, &enable);
 
-       if (!(status & 0xFF))
+       if (!status)
                return IRQ_NONE;
+       else if (!(status & enable) || !capture_streaming)
+               goto complete;
 
        if ((status & SUN6I_CSI_CH_INT_STA_FIFO0_OF) ||
            (status & SUN6I_CSI_CH_INT_STA_FIFO1_OF) ||
@@ -116,6 +120,7 @@ static irqreturn_t sun6i_csi_interrupt(int irq, void *private)
        if (status & SUN6I_CSI_CH_INT_STA_VS)
                sun6i_csi_capture_sync(csi_dev);
 
+complete:
        regmap_write(regmap, SUN6I_CSI_CH_INT_STA_REG, status);
 
        return IRQ_HANDLED;