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 cd962be860c..6e92d208025 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,  	struct uvc_streaming *stream =  			container_of(queue, struct uvc_streaming, queue); -	if (*nbuffers > UVC_MAX_VIDEO_BUFFERS) -		*nbuffers = UVC_MAX_VIDEO_BUFFERS; +	/* Make sure the image size is large enough. */ +	if (fmt && fmt->fmt.pix.sizeimage < stream->ctrl.dwMaxVideoFrameSize) +		return -EINVAL;  	*nplanes = 1; -	sizes[0] = stream->ctrl.dwMaxVideoFrameSize; +	sizes[0] = fmt ? fmt->fmt.pix.sizeimage +		 : stream->ctrl.dwMaxVideoFrameSize;  	return 0;  } @@ -104,15 +106,15 @@ static void uvc_buffer_queue(struct vb2_buffer *vb)  	spin_unlock_irqrestore(&queue->irqlock, flags);  } -static int uvc_buffer_finish(struct vb2_buffer *vb) +static void uvc_buffer_finish(struct vb2_buffer *vb)  {  	struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);  	struct uvc_streaming *stream =  			container_of(queue, struct uvc_streaming, queue);  	struct uvc_buffer *buf = container_of(vb, struct uvc_buffer, buf); -	uvc_video_clock_update(stream, &vb->v4l2_buf, buf); -	return 0; +	if (vb->state == VB2_BUF_STATE_DONE) +		uvc_video_clock_update(stream, &vb->v4l2_buf, buf);  }  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,  	queue->queue.buf_struct_size = sizeof(struct uvc_buffer);  	queue->queue.ops = &uvc_queue_qops;  	queue->queue.mem_ops = &vb2_vmalloc_memops; -	queue->queue.timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; +	queue->queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC +		| V4L2_BUF_FLAG_TSTAMP_SRC_SOE;  	ret = vb2_queue_init(&queue->queue);  	if (ret)  		return ret; @@ -196,6 +199,18 @@ int uvc_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)  	return ret;  } +int uvc_create_buffers(struct uvc_video_queue *queue, +		       struct v4l2_create_buffers *cb) +{ +	int ret; + +	mutex_lock(&queue->mutex); +	ret = vb2_create_bufs(&queue->queue, cb); +	mutex_unlock(&queue->mutex); + +	return ret; +} +  int uvc_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *buf)  {  	int ret;  | 
