diff options
Diffstat (limited to 'drivers/media/usb/uvc/uvc_queue.c')
-rw-r--r-- | drivers/media/usb/uvc/uvc_queue.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_queue.c index cd962be860ca..6e92d2080255 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c | |||
@@ -48,12 +48,14 @@ static int uvc_queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt, | |||
48 | struct uvc_streaming *stream = | 48 | struct uvc_streaming *stream = |
49 | container_of(queue, struct uvc_streaming, queue); | 49 | container_of(queue, struct uvc_streaming, queue); |
50 | 50 | ||
51 | if (*nbuffers > UVC_MAX_VIDEO_BUFFERS) | 51 | /* Make sure the image size is large enough. */ |
52 | *nbuffers = UVC_MAX_VIDEO_BUFFERS; | 52 | if (fmt && fmt->fmt.pix.sizeimage < stream->ctrl.dwMaxVideoFrameSize) |
53 | return -EINVAL; | ||
53 | 54 | ||
54 | *nplanes = 1; | 55 | *nplanes = 1; |
55 | 56 | ||
56 | sizes[0] = stream->ctrl.dwMaxVideoFrameSize; | 57 | sizes[0] = fmt ? fmt->fmt.pix.sizeimage |
58 | : stream->ctrl.dwMaxVideoFrameSize; | ||
57 | 59 | ||
58 | return 0; | 60 | return 0; |
59 | } | 61 | } |
@@ -104,15 +106,15 @@ static void uvc_buffer_queue(struct vb2_buffer *vb) | |||
104 | spin_unlock_irqrestore(&queue->irqlock, flags); | 106 | spin_unlock_irqrestore(&queue->irqlock, flags); |
105 | } | 107 | } |
106 | 108 | ||
107 | static int uvc_buffer_finish(struct vb2_buffer *vb) | 109 | static void uvc_buffer_finish(struct vb2_buffer *vb) |
108 | { | 110 | { |
109 | struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue); | 111 | struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue); |
110 | struct uvc_streaming *stream = | 112 | struct uvc_streaming *stream = |
111 | container_of(queue, struct uvc_streaming, queue); | 113 | container_of(queue, struct uvc_streaming, queue); |
112 | struct uvc_buffer *buf = container_of(vb, struct uvc_buffer, buf); | 114 | struct uvc_buffer *buf = container_of(vb, struct uvc_buffer, buf); |
113 | 115 | ||
114 | uvc_video_clock_update(stream, &vb->v4l2_buf, buf); | 116 | if (vb->state == VB2_BUF_STATE_DONE) |
115 | return 0; | 117 | uvc_video_clock_update(stream, &vb->v4l2_buf, buf); |
116 | } | 118 | } |
117 | 119 | ||
118 | static void uvc_wait_prepare(struct vb2_queue *vq) | 120 | static void uvc_wait_prepare(struct vb2_queue *vq) |
@@ -149,7 +151,8 @@ int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type, | |||
149 | queue->queue.buf_struct_size = sizeof(struct uvc_buffer); | 151 | queue->queue.buf_struct_size = sizeof(struct uvc_buffer); |
150 | queue->queue.ops = &uvc_queue_qops; | 152 | queue->queue.ops = &uvc_queue_qops; |
151 | queue->queue.mem_ops = &vb2_vmalloc_memops; | 153 | queue->queue.mem_ops = &vb2_vmalloc_memops; |
152 | queue->queue.timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; | 154 | queue->queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC |
155 | | V4L2_BUF_FLAG_TSTAMP_SRC_SOE; | ||
153 | ret = vb2_queue_init(&queue->queue); | 156 | ret = vb2_queue_init(&queue->queue); |
154 | if (ret) | 157 | if (ret) |
155 | return ret; | 158 | return ret; |
@@ -196,6 +199,18 @@ int uvc_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf) | |||
196 | return ret; | 199 | return ret; |
197 | } | 200 | } |
198 | 201 | ||
202 | int uvc_create_buffers(struct uvc_video_queue *queue, | ||
203 | struct v4l2_create_buffers *cb) | ||
204 | { | ||
205 | int ret; | ||
206 | |||
207 | mutex_lock(&queue->mutex); | ||
208 | ret = vb2_create_bufs(&queue->queue, cb); | ||
209 | mutex_unlock(&queue->mutex); | ||
210 | |||
211 | return ret; | ||
212 | } | ||
213 | |||
199 | int uvc_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf) | 214 | int uvc_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf) |
200 | { | 215 | { |
201 | int ret; | 216 | int ret; |