summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2014-10-21 13:03:08 -0300
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2014-11-25 08:40:08 -0200
commita11a03e50b73234444f7d439fb8ee6eaec3cffd1 (patch)
treedc0d201f4b84a90de7faf132ccc61e4271829cc0
parentbc75d5a0097b4100b4a4e06db62b2afb80d96393 (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.c43
-rw-r--r--drivers/media/usb/uvc/uvc_v4l2.c10
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);