|
@@ -104,29 +104,16 @@ 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,
|
|
|
+ .wait_prepare = vb2_ops_wait_prepare,
|
|
|
+ .wait_finish = vb2_ops_wait_finish,
|
|
|
};
|
|
|
|
|
|
-int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
|
|
|
+int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
|
|
|
+ struct mutex *lock)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
@@ -135,6 +122,7 @@ int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
|
|
|
queue->queue.drv_priv = queue;
|
|
|
queue->queue.buf_struct_size = sizeof(struct uvc_buffer);
|
|
|
queue->queue.ops = &uvc_queue_qops;
|
|
|
+ queue->queue.lock = lock;
|
|
|
queue->queue.mem_ops = &vb2_vmalloc_memops;
|
|
|
queue->queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
|
|
|
| V4L2_BUF_FLAG_TSTAMP_SRC_EOF;
|
|
@@ -142,7 +130,6 @@ int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- mutex_init(&queue->mutex);
|
|
|
spin_lock_init(&queue->irqlock);
|
|
|
INIT_LIST_HEAD(&queue->irqqueue);
|
|
|
queue->flags = 0;
|
|
@@ -155,9 +142,7 @@ int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
|
|
|
*/
|
|
|
void uvcg_free_buffers(struct uvc_video_queue *queue)
|
|
|
{
|
|
|
- mutex_lock(&queue->mutex);
|
|
|
vb2_queue_release(&queue->queue);
|
|
|
- mutex_unlock(&queue->mutex);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -168,22 +153,14 @@ int uvcg_alloc_buffers(struct uvc_video_queue *queue,
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- mutex_lock(&queue->mutex);
|
|
|
ret = vb2_reqbufs(&queue->queue, rb);
|
|
|
- mutex_unlock(&queue->mutex);
|
|
|
|
|
|
return ret ? ret : rb->count;
|
|
|
}
|
|
|
|
|
|
int uvcg_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)
|
|
|
{
|
|
|
- int ret;
|
|
|
-
|
|
|
- mutex_lock(&queue->mutex);
|
|
|
- ret = vb2_querybuf(&queue->queue, buf);
|
|
|
- mutex_unlock(&queue->mutex);
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return vb2_querybuf(&queue->queue, buf);
|
|
|
}
|
|
|
|
|
|
int uvcg_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)
|
|
@@ -191,18 +168,14 @@ int uvcg_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)
|
|
|
unsigned long flags;
|
|
|
int ret;
|
|
|
|
|
|
- mutex_lock(&queue->mutex);
|
|
|
ret = vb2_qbuf(&queue->queue, buf);
|
|
|
if (ret < 0)
|
|
|
- goto done;
|
|
|
+ return ret;
|
|
|
|
|
|
spin_lock_irqsave(&queue->irqlock, flags);
|
|
|
ret = (queue->flags & UVC_QUEUE_PAUSED) != 0;
|
|
|
queue->flags &= ~UVC_QUEUE_PAUSED;
|
|
|
spin_unlock_irqrestore(&queue->irqlock, flags);
|
|
|
-
|
|
|
-done:
|
|
|
- mutex_unlock(&queue->mutex);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -213,13 +186,7 @@ done:
|
|
|
int uvcg_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf,
|
|
|
int nonblocking)
|
|
|
{
|
|
|
- int ret;
|
|
|
-
|
|
|
- mutex_lock(&queue->mutex);
|
|
|
- ret = vb2_dqbuf(&queue->queue, buf, nonblocking);
|
|
|
- mutex_unlock(&queue->mutex);
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return vb2_dqbuf(&queue->queue, buf, nonblocking);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -231,24 +198,12 @@ int uvcg_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf,
|
|
|
unsigned int uvcg_queue_poll(struct uvc_video_queue *queue, struct file *file,
|
|
|
poll_table *wait)
|
|
|
{
|
|
|
- unsigned int ret;
|
|
|
-
|
|
|
- mutex_lock(&queue->mutex);
|
|
|
- ret = vb2_poll(&queue->queue, file, wait);
|
|
|
- mutex_unlock(&queue->mutex);
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return vb2_poll(&queue->queue, file, wait);
|
|
|
}
|
|
|
|
|
|
int uvcg_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma)
|
|
|
{
|
|
|
- int ret;
|
|
|
-
|
|
|
- mutex_lock(&queue->mutex);
|
|
|
- ret = vb2_mmap(&queue->queue, vma);
|
|
|
- mutex_unlock(&queue->mutex);
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return vb2_mmap(&queue->queue, vma);
|
|
|
}
|
|
|
|
|
|
#ifndef CONFIG_MMU
|
|
@@ -260,12 +215,7 @@ int uvcg_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *vma)
|
|
|
unsigned long uvcg_queue_get_unmapped_area(struct uvc_video_queue *queue,
|
|
|
unsigned long pgoff)
|
|
|
{
|
|
|
- unsigned long ret;
|
|
|
-
|
|
|
- mutex_lock(&queue->mutex);
|
|
|
- ret = vb2_get_unmapped_area(&queue->queue, 0, 0, pgoff, 0);
|
|
|
- mutex_unlock(&queue->mutex);
|
|
|
- return ret;
|
|
|
+ return vb2_get_unmapped_area(&queue->queue, 0, 0, pgoff, 0);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -327,18 +277,17 @@ int uvcg_queue_enable(struct uvc_video_queue *queue, int enable)
|
|
|
unsigned long flags;
|
|
|
int ret = 0;
|
|
|
|
|
|
- mutex_lock(&queue->mutex);
|
|
|
if (enable) {
|
|
|
ret = vb2_streamon(&queue->queue, queue->queue.type);
|
|
|
if (ret < 0)
|
|
|
- goto done;
|
|
|
+ return ret;
|
|
|
|
|
|
queue->sequence = 0;
|
|
|
queue->buf_used = 0;
|
|
|
} else {
|
|
|
ret = vb2_streamoff(&queue->queue, queue->queue.type);
|
|
|
if (ret < 0)
|
|
|
- goto done;
|
|
|
+ return ret;
|
|
|
|
|
|
spin_lock_irqsave(&queue->irqlock, flags);
|
|
|
INIT_LIST_HEAD(&queue->irqqueue);
|
|
@@ -353,8 +302,6 @@ int uvcg_queue_enable(struct uvc_video_queue *queue, int enable)
|
|
|
spin_unlock_irqrestore(&queue->irqlock, flags);
|
|
|
}
|
|
|
|
|
|
-done:
|
|
|
- mutex_unlock(&queue->mutex);
|
|
|
return ret;
|
|
|
}
|
|
|
|