aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/uvc/uvc_queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/uvc/uvc_queue.c')
-rw-r--r--drivers/media/video/uvc/uvc_queue.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/drivers/media/video/uvc/uvc_queue.c b/drivers/media/video/uvc/uvc_queue.c
index 42546342e97d..0155752e4a5a 100644
--- a/drivers/media/video/uvc/uvc_queue.c
+++ b/drivers/media/video/uvc/uvc_queue.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * uvc_queue.c -- USB Video Class driver - Buffers management 2 * uvc_queue.c -- USB Video Class driver - Buffers management
3 * 3 *
4 * Copyright (C) 2005-2008 4 * Copyright (C) 2005-2009
5 * Laurent Pinchart (laurent.pinchart@skynet.be) 5 * Laurent Pinchart (laurent.pinchart@skynet.be)
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
@@ -12,7 +12,6 @@
12 */ 12 */
13 13
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/version.h>
16#include <linux/mm.h> 15#include <linux/mm.h>
17#include <linux/list.h> 16#include <linux/list.h>
18#include <linux/module.h> 17#include <linux/module.h>
@@ -37,22 +36,22 @@
37 * to user space will return -EBUSY. 36 * to user space will return -EBUSY.
38 * 37 *
39 * Video buffers are managed using two queues. However, unlike most USB video 38 * Video buffers are managed using two queues. However, unlike most USB video
40 * drivers which use an in queue and an out queue, we use a main queue which 39 * drivers that use an in queue and an out queue, we use a main queue to hold
41 * holds all queued buffers (both 'empty' and 'done' buffers), and an irq 40 * all queued buffers (both 'empty' and 'done' buffers), and an irq queue to
42 * queue which holds empty buffers. This design (copied from video-buf) 41 * hold empty buffers. This design (copied from video-buf) minimizes locking
43 * minimizes locking in interrupt, as only one queue is shared between 42 * in interrupt, as only one queue is shared between interrupt and user
44 * interrupt and user contexts. 43 * contexts.
45 * 44 *
46 * Use cases 45 * Use cases
47 * --------- 46 * ---------
48 * 47 *
49 * Unless stated otherwise, all operations which modify the irq buffers queue 48 * Unless stated otherwise, all operations that modify the irq buffers queue
50 * are protected by the irq spinlock. 49 * are protected by the irq spinlock.
51 * 50 *
52 * 1. The user queues the buffers, starts streaming and dequeues a buffer. 51 * 1. The user queues the buffers, starts streaming and dequeues a buffer.
53 * 52 *
54 * The buffers are added to the main and irq queues. Both operations are 53 * The buffers are added to the main and irq queues. Both operations are
55 * protected by the queue lock, and the latert is protected by the irq 54 * protected by the queue lock, and the later is protected by the irq
56 * spinlock as well. 55 * spinlock as well.
57 * 56 *
58 * The completion handler fetches a buffer from the irq queue and fills it 57 * The completion handler fetches a buffer from the irq queue and fills it
@@ -60,7 +59,7 @@
60 * returns immediately. 59 * returns immediately.
61 * 60 *
62 * When the buffer is full, the completion handler removes it from the irq 61 * When the buffer is full, the completion handler removes it from the irq
63 * queue, marks it as ready (UVC_BUF_STATE_DONE) and wake its wait queue. 62 * queue, marks it as ready (UVC_BUF_STATE_DONE) and wakes its wait queue.
64 * At that point, any process waiting on the buffer will be woken up. If a 63 * At that point, any process waiting on the buffer will be woken up. If a
65 * process tries to dequeue a buffer after it has been marked ready, the 64 * process tries to dequeue a buffer after it has been marked ready, the
66 * dequeing will succeed immediately. 65 * dequeing will succeed immediately.
@@ -91,8 +90,8 @@ void uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
91/* 90/*
92 * Allocate the video buffers. 91 * Allocate the video buffers.
93 * 92 *
94 * Pages are reserved to make sure they will not be swaped, as they will be 93 * Pages are reserved to make sure they will not be swapped, as they will be
95 * filled in URB completion handler. 94 * filled in the URB completion handler.
96 * 95 *
97 * Buffers will be individually mapped, so they must all be page aligned. 96 * Buffers will be individually mapped, so they must all be page aligned.
98 */ 97 */
@@ -210,8 +209,8 @@ int uvc_query_buffer(struct uvc_video_queue *queue,
210 __uvc_query_buffer(&queue->buffer[v4l2_buf->index], v4l2_buf); 209 __uvc_query_buffer(&queue->buffer[v4l2_buf->index], v4l2_buf);
211 210
212done: 211done:
213 mutex_unlock(&queue->mutex); 212 mutex_unlock(&queue->mutex);
214 return ret; 213 return ret;
215} 214}
216 215
217/* 216/*
@@ -236,7 +235,7 @@ int uvc_queue_buffer(struct uvc_video_queue *queue,
236 } 235 }
237 236
238 mutex_lock(&queue->mutex); 237 mutex_lock(&queue->mutex);
239 if (v4l2_buf->index >= queue->count) { 238 if (v4l2_buf->index >= queue->count) {
240 uvc_trace(UVC_TRACE_CAPTURE, "[E] Out of range index.\n"); 239 uvc_trace(UVC_TRACE_CAPTURE, "[E] Out of range index.\n");
241 ret = -EINVAL; 240 ret = -EINVAL;
242 goto done; 241 goto done;
@@ -429,7 +428,7 @@ done:
429 * Cancel the video buffers queue. 428 * Cancel the video buffers queue.
430 * 429 *
431 * Cancelling the queue marks all buffers on the irq queue as erroneous, 430 * Cancelling the queue marks all buffers on the irq queue as erroneous,
432 * wakes them up and remove them from the queue. 431 * wakes them up and removes them from the queue.
433 * 432 *
434 * If the disconnect parameter is set, further calls to uvc_queue_buffer will 433 * If the disconnect parameter is set, further calls to uvc_queue_buffer will
435 * fail with -ENODEV. 434 * fail with -ENODEV.