aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/usb/uvc/uvc_queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/usb/uvc/uvc_queue.c')
-rw-r--r--drivers/media/usb/uvc/uvc_queue.c29
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
107static int uvc_buffer_finish(struct vb2_buffer *vb) 109static 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
118static void uvc_wait_prepare(struct vb2_queue *vq) 120static 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
202int 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
199int uvc_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf) 214int uvc_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)
200{ 215{
201 int ret; 216 int ret;