From 2e92848f58315e483d394e8562bcbcbbf222f24c Mon Sep 17 00:00:00 2001 From: Mirela Rabulea <mirela.rabulea@nxp.com> Date: Thu, 22 Nov 2018 16:22:28 +0200 Subject: [PATCH] MLK-19942: mxc-jpeg: Workaround for "Instance released before end of transaction" The context is released after FRM_DONE interrupt is received, but for some small images, after FRM_DONE, a HALF_BUF interrupt keeps coming, and cannot be cleared. A soft reset helps (resets only the decoder internal state, not registers). Signed-off-by: Mirela Rabulea <mirela.rabulea@nxp.com> --- drivers/media/platform/imx8/mxc-jpeg.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/imx8/mxc-jpeg.c b/drivers/media/platform/imx8/mxc-jpeg.c index 8746f41f0c1397..cece57840aaf2e 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); -- GitLab