Skip to content

Commit

Permalink
[media] uvcvideo: Implement vb2 queue start and stop stream operations
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Laurent Pinchart authored and Mauro Carvalho Chehab committed Nov 25, 2014
1 parent bc75d5a commit a11a03e
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 25 deletions.
43 changes: 28 additions & 15 deletions drivers/media/usb/uvc/uvc_queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,38 @@ 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,
.buf_queue = uvc_buffer_queue,
.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,
Expand Down Expand Up @@ -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;
}
Expand Down
10 changes: 0 additions & 10 deletions drivers/media/usb/uvc/uvc_v4l2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
Expand All @@ -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);

Expand Down

0 comments on commit a11a03e

Please sign in to comment.