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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:23:23 +0000 (14:23 +0200)
[ Upstream commit 22a2bc88c139dc9757bdb1d0a3665ac27edc79a5 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/media/platform/imx-jpeg/mxc-jpeg-hw.c
drivers/media/platform/imx-jpeg/mxc-jpeg-hw.h
drivers/media/platform/imx-jpeg/mxc-jpeg.c

index 29c604b1b1790515eea3a1e8dbc781b12ec9e2a4..718b7b08f93e0148ef7848297ac68d6a78fef5f2 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 12f132a83a232e5b2e9819ca22b812912fc42f6f..bf4e1973a06618b3417931e50078eb860dba3de7 100644 (file)
@@ -125,6 +125,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 da80167cb57ded8ae95098d2f657073bcf12ac1f..aeb3704cfff0c680bb41d553ade500bec1fa9c4a 100644 (file)
@@ -579,15 +579,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 */
@@ -659,6 +652,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);