From: Laurent Pinchart Date: Mon, 21 Jan 2013 09:51:41 +0000 (-0300) Subject: [media] uvcvideo: Implement videobuf2 .wait_prepare and .wait_finish operations X-Git-Tag: next-20130218~80^2~1^2~48 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=05c79d0d1d0d44c2195d63d1e7c62e358eadeadf;p=karo-tx-linux.git [media] uvcvideo: Implement videobuf2 .wait_prepare and .wait_finish operations Those optional operations are used to release and reacquire the queue lock when videobuf2 needs to perform operations that sleep for a long time, such as waiting for a buffer to be complete. Implement them to avoid blocking qbuf or streamoff calls when a dqbuf is in progress. Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab --- diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_queue.c index 778addc5caff..6c233a54ce40 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -115,11 +115,27 @@ static int uvc_buffer_finish(struct vb2_buffer *vb) return 0; } +static void uvc_wait_prepare(struct vb2_queue *vq) +{ + struct uvc_video_queue *queue = vb2_get_drv_priv(vq); + + mutex_unlock(&queue->mutex); +} + +static void uvc_wait_finish(struct vb2_queue *vq) +{ + struct uvc_video_queue *queue = vb2_get_drv_priv(vq); + + mutex_lock(&queue->mutex); +} + 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, }; int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,