diff --git a/drivers/media/platform/imx8/mxc-jpeg.c b/drivers/media/platform/imx8/mxc-jpeg.c index 8746f41f0c1397845745e1742870c591bd02c7df..cece57840aaf2e9f308322b43ef1de59f1128f12 100644 --- a/drivers/media/platform/imx8/mxc-jpeg.c +++ b/drivers/media/platform/imx8/mxc-jpeg.c @@ -418,10 +418,18 @@ static irqreturn_t mxc_jpeg_dec_irq(int irq, void *priv) spin_lock(&jpeg->hw_lock); + dec_ret = readl(reg + MXC_SLOT_OFFSET(slot, SLOT_STATUS)); + writel(dec_ret, reg + MXC_SLOT_OFFSET(slot, SLOT_STATUS)); /* w1c */ + ctx = v4l2_m2m_get_curr_priv(jpeg->m2m_dev); if (!ctx) { dev_err(dev, - "Instance released before the end of transaction.\n"); + "Instance released before the end of transaction 0x%x.", + dec_ret); + /* 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)); goto job_unlock; } @@ -435,9 +443,6 @@ static irqreturn_t mxc_jpeg_dec_irq(int irq, void *priv) goto buffers_done; } - dec_ret = readl(reg + MXC_SLOT_OFFSET(slot, SLOT_STATUS)); - writel(dec_ret, reg + MXC_SLOT_OFFSET(slot, SLOT_STATUS)); /* w1c */ - if (dec_ret & SLOTa_STATUS_ENC_CONFIG_ERR) { u32 ret = readl(reg + CAST_STATUS12);