]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
media: tegra_camera: fix potential race condition
authorBryan Wu <pengw@nvidia.com>
Mon, 2 Nov 2015 22:15:11 +0000 (14:15 -0800)
committermobile promotions <svcmobile_promotions@nvidia.com>
Thu, 5 Nov 2015 16:11:38 +0000 (08:11 -0800)
Make sure increase sync point max value for arming the single shot.

Bug 1700868

Change-Id: I9a429150dad0851a3da34ee8ad75339728f3ed81
Signed-off-by: Bryan Wu <pengw@nvidia.com>
Reviewed-on: http://git-master/r/826439
(cherry picked from commit d20b72061fa57331fe16d311bfac035227e206ae)
Reviewed-on: http://git-master/r/827967
Reviewed-by: Matthew Pedro <mapedro@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
drivers/media/platform/soc_camera/tegra_camera/vi2.c

index f52ab972966fb865032e7a1401d05d8a24143561..ffafaf094efe4611d2235cab44c9cd1e402317bb 100644 (file)
@@ -1315,35 +1315,39 @@ static void vi2_capture_error_status(struct vi2_channel *chan, int err)
                "TEGRA_VI_CSI_ERROR_STATUS 0x%08x\n", val);
 }
 
-static int vi2_channel_capture_start(struct vi2_channel *chan,
-                            struct tegra_camera_buffer *buf)
+static int vi2_channel_capture_frame(struct vi2_channel *chan,
+                                    struct tegra_camera_buffer *buf)
 {
        struct vi2_camera *vi2_cam = chan->vi2_cam;
+       struct tegra_camera *cam = &vi2_cam->cam;
+       u32 val;
        int err;
 
+       /* Setup capture registers */
+       vi2_channel_capture_setup(chan);
+
+       /* Start capture */
        err = vi2_capture_buffer_setup(chan, buf);
        if (err < 0)
                return err;
 
+       chan->syncpt_thresh = nvhost_syncpt_incr_max_ext(cam->pdev,
+                       chan->syncpt_id, 1);
+
        TC_VI_REG_WT(vi2_cam, TEGRA_VI_CFG_VI_INCR_SYNCPT,
                     vi2_syncpt_cond(VI_FRAME_START,  chan->port) |
                     chan->syncpt_id);
-       csi_regs_write(vi2_cam, chan, TEGRA_VI_CSI_SINGLE_SHOT, 0x1);
 
-       return err;
-}
+       csi_regs_write(vi2_cam, chan, TEGRA_VI_CSI_SINGLE_SHOT, 0x1);
 
+       /* Move buffer to capture done queue */
+       spin_lock(&chan->done_lock);
+       list_add_tail(&buf->queue, &chan->done);
+       spin_unlock(&chan->done_lock);
 
-static int vi2_channel_capture_wait(struct vi2_channel *chan)
-{
-       struct vi2_camera *vi2_cam = chan->vi2_cam;
-       struct tegra_camera *cam = &vi2_cam->cam;
-       int err;
-       u32 val;
+       /* Wait up kthread for capture done */
+       wake_up_interruptible(&chan->done_wait);
 
-       if (!nvhost_syncpt_read_ext_check(cam->pdev, chan->syncpt_id, &val))
-               chan->syncpt_thresh = nvhost_syncpt_incr_max_ext(cam->pdev,
-                                       chan->syncpt_id, 1);
        err = nvhost_syncpt_wait_timeout_ext(cam->pdev,
                        chan->syncpt_id, chan->syncpt_thresh,
                        TEGRA_SYNCPT_CSI_WAIT_TIMEOUT,
@@ -1361,26 +1365,6 @@ static int vi2_channel_capture_wait(struct vi2_channel *chan)
        return err;
 }
 
-static int vi2_channel_capture_frame(struct vi2_channel *chan,
-                                    struct tegra_camera_buffer *buf)
-{
-       /* Setup capture registers */
-       vi2_channel_capture_setup(chan);
-
-       /* Start capture */
-       vi2_channel_capture_start(chan, buf);
-
-       /* Move buffer to capture done queue */
-       spin_lock(&chan->done_lock);
-       list_add_tail(&buf->queue, &chan->done);
-       spin_unlock(&chan->done_lock);
-
-       /* Wait up kthread for capture done */
-       wake_up_interruptible(&chan->done_wait);
-
-       return vi2_channel_capture_wait(chan);
-}
-
 
 static int vi2_channel_capture_done(struct vi2_channel *chan,
                                    struct tegra_camera_buffer *buf)
@@ -1388,12 +1372,10 @@ static int vi2_channel_capture_done(struct vi2_channel *chan,
        struct vi2_camera *vi2_cam = chan->vi2_cam;
        struct tegra_camera *cam = &vi2_cam->cam;
        struct vb2_buffer *vb = &buf->vb;
-       u32 val;
        int err = 0;
 
-       if (!nvhost_syncpt_read_ext_check(cam->pdev, chan->syncpt_id, &val))
-               chan->syncpt_thresh = nvhost_syncpt_incr_max_ext(cam->pdev,
-                                       chan->syncpt_id, 1);
+       chan->syncpt_thresh = nvhost_syncpt_incr_max_ext(cam->pdev,
+                               chan->syncpt_id, 1);
 
        /*
         * Make sure recieve VI_MW_ACK_DONE of the last frame before