diff options
author | Bryan Wu <pengw@nvidia.com> | 2015-10-15 13:10:29 -0700 |
---|---|---|
committer | Matthew Pedro <mapedro@nvidia.com> | 2015-10-29 10:52:36 -0700 |
commit | ff5bccb61c1f8da1f63451fda88bd1f65dbee5b2 (patch) | |
tree | 4f3494c090cc004caec0c96a7028c19b40c05264 /drivers/media/platform/soc_camera/tegra_camera/common.h | |
parent | b15d976c0a2e6a3c512001a3be3feaf057655b8b (diff) |
media: tegra_camera: introduce 2 kthreads for capture
Use one kthread to start capture a frame and wait for next frame start.
Before waiting, it will move the current buffer to another queue which
will be handled another kthread.
The second kthread (capture_done) will wait for memory output done sync
point event and handle the buffer to videobuffer2 framework as capture
done.
Bug 1686911
Change-Id: Ia092c708ecca3b2e7cbc657a96fd247ea4a00d2f
Signed-off-by: Bryan Wu <pengw@nvidia.com>
Reviewed-on: http://git-master/r/819177
GVS: Gerrit_Virtual_Submit
Reviewed-by: Matthew Pedro <mapedro@nvidia.com>
Diffstat (limited to 'drivers/media/platform/soc_camera/tegra_camera/common.h')
-rw-r--r-- | drivers/media/platform/soc_camera/tegra_camera/common.h | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/media/platform/soc_camera/tegra_camera/common.h b/drivers/media/platform/soc_camera/tegra_camera/common.h index c27c83cd4558..1d71c2ba39f5 100644 --- a/drivers/media/platform/soc_camera/tegra_camera/common.h +++ b/drivers/media/platform/soc_camera/tegra_camera/common.h @@ -62,9 +62,13 @@ struct tegra_camera_ops { void (*clks_disable)(struct tegra_camera_dev *cam); void (*capture_clean)(struct tegra_camera_dev *vi2_cam); - int (*capture_setup)(struct tegra_camera_dev *vi2_cam); + int (*capture_setup)(struct tegra_camera_dev *vi2_cam, + struct tegra_camera_buffer *buf); int (*capture_start)(struct tegra_camera_dev *vi2_cam, struct tegra_camera_buffer *buf); + int (*capture_wait)(struct tegra_camera_dev *vi2_cam, + struct tegra_camera_buffer *buf); + int (*capture_done)(struct tegra_camera_dev *vi2_cam, int port); int (*capture_stop)(struct tegra_camera_dev *vi2_cam, int port); void (*init_syncpts)(struct tegra_camera_dev *vi2_cam); @@ -76,7 +80,8 @@ struct tegra_camera_ops { void (*deactivate)(struct tegra_camera_dev *vi2_cam); int (*port_is_valid)(int port); - int (*mipi_calibration)(struct tegra_camera_dev *vi2_cam); + int (*mipi_calibration)(struct tegra_camera_dev *vi2_cam, + struct tegra_camera_buffer *buf); }; struct tegra_camera_dev { @@ -93,16 +98,20 @@ struct tegra_camera_dev { struct tegra_camera_ops *ops; void __iomem *reg_base; - spinlock_t videobuf_queue_lock; struct list_head capture; + spinlock_t capture_lock; + struct list_head done; + spinlock_t done_lock; struct vb2_buffer *active; struct vb2_alloc_ctx *alloc_ctx; enum v4l2_field field; int sequence_a; int sequence_b; - struct task_struct *kthread_capture; - wait_queue_head_t wait; + struct task_struct *kthread_capture_start; + struct task_struct *kthread_capture_done; + wait_queue_head_t capture_start_wait; + wait_queue_head_t capture_done_wait; /* syncpt ids */ u32 syncpt_id_csi_a; |