diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2014-10-21 13:03:08 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-11-25 08:40:08 -0200 |
commit | a11a03e50b73234444f7d439fb8ee6eaec3cffd1 (patch) | |
tree | dc0d201f4b84a90de7faf132ccc61e4271829cc0 | |
parent | bc75d5a0097b4100b4a4e06db62b2afb80d96393 (diff) |
[media] uvcvideo: Implement vb2 queue start and stop stream operations
To work propertly the videobuf2 core code needs to be in charge of
stream start/stop control. Implement the start_streaming and
stop_streaming vb2 operations and move video enable/disable code to
them.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/usb/uvc/uvc_queue.c | 43 | ||||
-rw-r--r-- | drivers/media/usb/uvc/uvc_v4l2.c | 10 |
2 files changed, 28 insertions, 25 deletions
diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_queue.c index 97036559bb9..758247048ee 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -135,6 +135,29 @@ static void uvc_wait_finish(struct vb2_queue *vq) mutex_lock(&queue->mutex); } +static int uvc_start_streaming(struct vb2_queue *vq, unsigned int count) +{ + struct uvc_video_queue *queue = vb2_get_drv_priv(vq); + struct uvc_streaming *stream = uvc_queue_to_stream(queue); + + queue->buf_used = 0; + + return uvc_video_enable(stream, 1); +} + +static void uvc_stop_streaming(struct vb2_queue *vq) +{ + struct uvc_video_queue *queue = vb2_get_drv_priv(vq); + struct uvc_streaming *stream = uvc_queue_to_stream(queue); + unsigned long flags; + + uvc_video_enable(stream, 0); + + spin_lock_irqsave(&queue->irqlock, flags); + INIT_LIST_HEAD(&queue->irqqueue); + spin_unlock_irqrestore(&queue->irqlock, flags); +} + static struct vb2_ops uvc_queue_qops = { .queue_setup = uvc_queue_setup, .buf_prepare = uvc_buffer_prepare, @@ -142,6 +165,8 @@ static struct vb2_ops uvc_queue_qops = { .buf_finish = uvc_buffer_finish, .wait_prepare = uvc_wait_prepare, .wait_finish = uvc_wait_finish, + .start_streaming = uvc_start_streaming, + .stop_streaming = uvc_stop_streaming, }; int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type, @@ -310,27 +335,15 @@ int uvc_queue_allocated(struct uvc_video_queue *queue) */ int uvc_queue_enable(struct uvc_video_queue *queue, int enable) { - unsigned long flags; int ret; mutex_lock(&queue->mutex); - if (enable) { - ret = vb2_streamon(&queue->queue, queue->queue.type); - if (ret < 0) - goto done; - queue->buf_used = 0; - } else { + if (enable) + ret = vb2_streamon(&queue->queue, queue->queue.type); + else ret = vb2_streamoff(&queue->queue, queue->queue.type); - if (ret < 0) - goto done; - - spin_lock_irqsave(&queue->irqlock, flags); - INIT_LIST_HEAD(&queue->irqqueue); - spin_unlock_irqrestore(&queue->irqlock, flags); - } -done: mutex_unlock(&queue->mutex); return ret; } diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index e8bf4f149a2..4619fd6b049 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -531,7 +531,6 @@ static int uvc_v4l2_release(struct file *file) /* Only free resources if this is a privileged handle. */ if (uvc_has_privileges(handle)) { - uvc_video_enable(stream, 0); uvc_queue_enable(&stream->queue, 0); uvc_free_buffers(&stream->queue); } @@ -768,14 +767,6 @@ static int uvc_ioctl_streamon(struct file *file, void *fh, mutex_lock(&stream->mutex); ret = uvc_queue_enable(&stream->queue, 1); - if (ret < 0) - goto done; - - ret = uvc_video_enable(stream, 1); - if (ret < 0) - uvc_queue_enable(&stream->queue, 0); - -done: mutex_unlock(&stream->mutex); return ret; @@ -794,7 +785,6 @@ static int uvc_ioctl_streamoff(struct file *file, void *fh, return -EBUSY; mutex_lock(&stream->mutex); - uvc_video_enable(stream, 0); uvc_queue_enable(&stream->queue, 0); mutex_unlock(&stream->mutex); |