]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/blobdiff - drivers/media/platform/soc_camera/tegra_camera/common.c
media: tegra_camera: add start streaming call
[sojka/nv-tegra/linux-3.10.git] / drivers / media / platform / soc_camera / tegra_camera / common.c
index d8b4ff1d4d583ad3954a9a0475571dd4d963702d..2fa4d78a7add9f23faa0c645bdd38eaa8c3f413f 100644 (file)
@@ -483,8 +483,10 @@ static void tegra_camera_videobuf_queue(struct vb2_buffer *vb)
 
        spin_lock_irq(&cam->videobuf_queue_lock);
        list_add_tail(&buf->queue, &cam->capture);
-       schedule_work(&cam->work);
        spin_unlock_irq(&cam->videobuf_queue_lock);
+
+       if (vb2_is_streaming(vb->vb2_queue))
+               schedule_work(&cam->work);
 }
 
 static void tegra_camera_videobuf_release(struct vb2_buffer *vb)
@@ -523,6 +525,19 @@ static int tegra_camera_videobuf_init(struct vb2_buffer *vb)
        return 0;
 }
 
+static int tegra_camera_start_streaming(struct vb2_queue *q, unsigned int count)
+{
+       struct soc_camera_device *icd = container_of(q,
+                                                    struct soc_camera_device,
+                                                    vb2_vidq);
+       struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
+       struct tegra_camera_dev *cam = ici->priv;
+
+       schedule_work(&cam->work);
+
+       return 0;
+}
+
 static int tegra_camera_stop_streaming(struct vb2_queue *q)
 {
        struct soc_camera_device *icd = container_of(q,
@@ -549,6 +564,7 @@ static struct vb2_ops tegra_camera_videobuf_ops = {
        .buf_init       = tegra_camera_videobuf_init,
        .wait_prepare   = soc_camera_unlock,
        .wait_finish    = soc_camera_lock,
+       .start_streaming = tegra_camera_start_streaming,
        .stop_streaming = tegra_camera_stop_streaming,
 };