media: s5p-jpeg: disable encoder/decoder in exynos4-like hardware after use
authorAndrzej Pietrasiewicz <andrzej.p@samsung.com>
Tue, 8 Aug 2017 11:27:05 +0000 (07:27 -0400)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Sun, 20 Aug 2017 12:01:28 +0000 (08:01 -0400)
Clearing the bits turns off the encoder/decoder. If the hardware
is not turned off after use, at subsequent uses it does not work
in a stable manner, resulting in incorrect interrupt status value
being read and e.g. erroneous read of compressed bitstream size.

Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/platform/s5p-jpeg/jpeg-core.c
drivers/media/platform/s5p-jpeg/jpeg-core.h
drivers/media/platform/s5p-jpeg/jpeg-hw-exynos4.c

index 663b79cb14b0ec3fb6dff1863afe8329c681bc68..917c9629f6b2b16a3cb6d2f2dceebc47ae676914 100644 (file)
@@ -2806,6 +2806,8 @@ static irqreturn_t exynos4_jpeg_irq(int irq, void *priv)
        if (jpeg->variant->version == SJPEG_EXYNOS4)
                curr_ctx->subsampling = exynos4_jpeg_get_frame_fmt(jpeg->regs);
 
+       exynos4_jpeg_set_enc_dec_mode(jpeg->regs, S5P_JPEG_DISABLE);
+
        spin_unlock(&jpeg->slock);
 
        v4l2_m2m_job_finish(jpeg->m2m_dev, curr_ctx->fh.m2m_ctx);
index 9aa26bd1d46db96ed095168eef75ab405d957ef2..a46465e1035157ee82c3e70646fb6bb57f4aa310 100644 (file)
@@ -63,6 +63,7 @@
 
 #define S5P_JPEG_ENCODE                0
 #define S5P_JPEG_DECODE                1
+#define S5P_JPEG_DISABLE       -1
 
 #define FMT_TYPE_OUTPUT                0
 #define FMT_TYPE_CAPTURE       1
index a1d823ab0c63ce28581dbb9c4d8c6b464a1c395f..c78403368e5bf20ce47d1310ea0ad20014fb6d53 100644 (file)
@@ -38,10 +38,13 @@ void exynos4_jpeg_set_enc_dec_mode(void __iomem *base, unsigned int mode)
                writel((reg & EXYNOS4_ENC_DEC_MODE_MASK) |
                                        EXYNOS4_DEC_MODE,
                        base + EXYNOS4_JPEG_CNTL_REG);
-       } else {/* encode */
+       } else if (mode == S5P_JPEG_ENCODE) {/* encode */
                writel((reg & EXYNOS4_ENC_DEC_MODE_MASK) |
                                        EXYNOS4_ENC_MODE,
                        base + EXYNOS4_JPEG_CNTL_REG);
+       } else { /* disable both */
+               writel(reg & EXYNOS4_ENC_DEC_MODE_MASK,
+                       base + EXYNOS4_JPEG_CNTL_REG);
        }
 }