diff options
Diffstat (limited to 'drivers/media/usb/uvc/uvc_v4l2.c')
| -rw-r--r-- | drivers/media/usb/uvc/uvc_v4l2.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index c4b1ac6750d8..2764f43607c1 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -483,9 +483,6 @@ static int uvc_v4l2_open(struct file *file)  	uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_open\n");  	stream = video_drvdata(file); -	if (stream->dev->state & UVC_DEV_DISCONNECTED) -		return -ENODEV; -  	ret = usb_autopm_get_interface(stream->dev->intf);  	if (ret < 0)  		return ret; @@ -723,6 +720,18 @@ static int uvc_ioctl_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf)  	return uvc_queue_buffer(&stream->queue, buf);  } +static int uvc_ioctl_expbuf(struct file *file, void *fh, +			    struct v4l2_exportbuffer *exp) +{ +	struct uvc_fh *handle = fh; +	struct uvc_streaming *stream = handle->stream; + +	if (!uvc_has_privileges(handle)) +		return -EBUSY; + +	return uvc_export_buffer(&stream->queue, exp); +} +  static int uvc_ioctl_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)  {  	struct uvc_fh *handle = fh; @@ -1478,6 +1487,7 @@ const struct v4l2_ioctl_ops uvc_ioctl_ops = {  	.vidioc_reqbufs = uvc_ioctl_reqbufs,  	.vidioc_querybuf = uvc_ioctl_querybuf,  	.vidioc_qbuf = uvc_ioctl_qbuf, +	.vidioc_expbuf = uvc_ioctl_expbuf,  	.vidioc_dqbuf = uvc_ioctl_dqbuf,  	.vidioc_create_bufs = uvc_ioctl_create_bufs,  	.vidioc_streamon = uvc_ioctl_streamon,  |