usb: gadget: uvc: Implement videobuf2 .wait_prepare and .wait_finish operations
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Fri, 8 Feb 2013 23:54:54 +0000 (00:54 +0100)
committerFelipe Balbi <balbi@ti.com>
Tue, 4 Jun 2013 20:27:50 +0000 (23:27 +0300)
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: Michael Grzeschik <m.grzeschik@pengutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/uvc_queue.c

index 7ce27e35550b7e50c887764b53f6907e4fc5864d..e6170478ea9f737b0a6eeec9a1a9524a5307db62 100644 (file)
@@ -103,10 +103,26 @@ static void uvc_buffer_queue(struct vb2_buffer *vb)
        spin_unlock_irqrestore(&queue->irqlock, flags);
 }
 
+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,
+       .wait_prepare = uvc_wait_prepare,
+       .wait_finish = uvc_wait_finish,
 };
 
 static int uvc_queue_init(struct uvc_video_queue *queue,