[media] s5p-jpeg: Fix lack of spin_lock protection
authorJacek Anaszewski <j.anaszewski@samsung.com>
Mon, 25 Nov 2013 09:58:14 +0000 (06:58 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Wed, 18 Dec 2013 08:13:44 +0000 (06:13 -0200)
s5p_jpeg_device_run and s5p_jpeg_runtime_resume callbacks should
have spin_lock protection as they alter device registers.

Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/platform/s5p-jpeg/jpeg-core.c

index 84e7429cf19596541be02125d771ab7a1912c9f0..57ee2655f7594b1ba29cc5a3f0f39f34dfef80c1 100644 (file)
@@ -930,7 +930,9 @@ static void s5p_jpeg_device_run(void *priv)
        struct s5p_jpeg_ctx *ctx = priv;
        struct s5p_jpeg *jpeg = ctx->jpeg;
        struct vb2_buffer *src_buf, *dst_buf;
-       unsigned long src_addr, dst_addr;
+       unsigned long src_addr, dst_addr, flags;
+
+       spin_lock_irqsave(&ctx->jpeg->slock, flags);
 
        src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
        dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
@@ -998,6 +1000,8 @@ static void s5p_jpeg_device_run(void *priv)
        }
 
        jpeg_start(jpeg->regs);
+
+       spin_unlock_irqrestore(&ctx->jpeg->slock, flags);
 }
 
 static int s5p_jpeg_job_ready(void *priv)
@@ -1418,12 +1422,15 @@ static int s5p_jpeg_runtime_suspend(struct device *dev)
 static int s5p_jpeg_runtime_resume(struct device *dev)
 {
        struct s5p_jpeg *jpeg = dev_get_drvdata(dev);
+       unsigned long flags;
        int ret;
 
        ret = clk_prepare_enable(jpeg->clk);
        if (ret < 0)
                return ret;
 
+       spin_lock_irqsave(&jpeg->slock, flags);
+
        /*
         * JPEG IP allows storing two Huffman tables for each component
         * We fill table 0 for each component
@@ -1433,6 +1440,8 @@ static int s5p_jpeg_runtime_resume(struct device *dev)
        s5p_jpeg_set_hactbl(jpeg->regs);
        s5p_jpeg_set_hactblg(jpeg->regs);
 
+       spin_unlock_irqrestore(&jpeg->slock, flags);
+
        return 0;
 }