media: imx-jpeg: Disable slot interrupt when frame done
authorMing Qian <ming.qian@nxp.com>
Fri, 10 Jun 2022 02:00:57 +0000 (03:00 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Mon, 27 Jun 2022 07:53:14 +0000 (08:53 +0100)
The interrupt STMBUF_HALF may be triggered after frame done.
It may led to system hang if driver try to access the register after
power off.

Disable the slot interrupt when frame done.

Fixes: 2db16c6ed72ce ("media: imx-jpeg: Add V4L2 driver for i.MX8 JPEG Encoder/Decoder")
Signed-off-by: Ming Qian <ming.qian@nxp.com>
Reviewed-by: Mirela Rabulea <mirela.rabulea@nxp.com>
Tested-by: Mirela Rabulea <mirela.rabulea@nxp.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.c
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c

index c482228262a33d289ddacc523556745919e21b09..9418fcf740a82a91a3e09939b65f6cebbb5a3318 100644 (file)
@@ -79,6 +79,11 @@ void mxc_jpeg_enable_irq(void __iomem *reg, int slot)
        writel(0xFFFFFFFF, reg + MXC_SLOT_OFFSET(slot, SLOT_IRQ_EN));
 }
 
+void mxc_jpeg_disable_irq(void __iomem *reg, int slot)
+{
+       writel(0x0, reg + MXC_SLOT_OFFSET(slot, SLOT_IRQ_EN));
+}
+
 void mxc_jpeg_sw_reset(void __iomem *reg)
 {
        /*
index 07655502f4bd06af760107d5cced37154beba009..ecf3b6562ba26628efe164c6478228b235f43efa 100644 (file)
@@ -126,6 +126,7 @@ u32 mxc_jpeg_get_offset(void __iomem *reg, int slot);
 void mxc_jpeg_enable_slot(void __iomem *reg, int slot);
 void mxc_jpeg_set_l_endian(void __iomem *reg, int le);
 void mxc_jpeg_enable_irq(void __iomem *reg, int slot);
+void mxc_jpeg_disable_irq(void __iomem *reg, int slot);
 int mxc_jpeg_set_input(void __iomem *reg, u32 in_buf, u32 bufsize);
 int mxc_jpeg_set_output(void __iomem *reg, u16 out_pitch, u32 out_buf,
                        u16 w, u16 h);
index 965021d3c7ef93a7bed5ee1b448bed8c4cf3b2c7..c65d480c27fffd15b36b6e761b6efbc1e7216955 100644 (file)
@@ -592,15 +592,8 @@ static irqreturn_t mxc_jpeg_dec_irq(int irq, void *priv)
        dev_dbg(dev, "Irq %d on slot %d.\n", irq, slot);
 
        ctx = v4l2_m2m_get_curr_priv(jpeg->m2m_dev);
-       if (!ctx) {
-               dev_err(dev,
-                       "Instance released before the end of transaction.\n");
-               /* soft reset only resets internal state, not registers */
-               mxc_jpeg_sw_reset(reg);
-               /* clear all interrupts */
-               writel(0xFFFFFFFF, reg + MXC_SLOT_OFFSET(slot, SLOT_STATUS));
+       if (WARN_ON(!ctx))
                goto job_unlock;
-       }
 
        if (slot != ctx->slot) {
                /* TODO investigate when adding multi-instance support */
@@ -673,6 +666,7 @@ static irqreturn_t mxc_jpeg_dec_irq(int irq, void *priv)
        buf_state = VB2_BUF_STATE_DONE;
 
 buffers_done:
+       mxc_jpeg_disable_irq(reg, ctx->slot);
        jpeg->slot_data[slot].used = false; /* unused, but don't free */
        mxc_jpeg_check_and_set_last_buffer(ctx, src_buf, dst_buf);
        v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);