diff options
Diffstat (limited to 'drivers/media/usb/uvc/uvc_v4l2.c')
-rw-r--r-- | drivers/media/usb/uvc/uvc_v4l2.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index a16fe2167976..e8bf4f149a26 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -532,6 +532,7 @@ static int uvc_v4l2_release(struct file *file) /* Only free resources if this is a privileged handle. */ if (uvc_has_privileges(handle)) { uvc_video_enable(stream, 0); + uvc_queue_enable(&stream->queue, 0); uvc_free_buffers(&stream->queue); } @@ -766,7 +767,15 @@ static int uvc_ioctl_streamon(struct file *file, void *fh, return -EBUSY; mutex_lock(&stream->mutex); + ret = uvc_queue_enable(&stream->queue, 1); + if (ret < 0) + goto done; + ret = uvc_video_enable(stream, 1); + if (ret < 0) + uvc_queue_enable(&stream->queue, 0); + +done: mutex_unlock(&stream->mutex); return ret; @@ -777,7 +786,6 @@ static int uvc_ioctl_streamoff(struct file *file, void *fh, { struct uvc_fh *handle = fh; struct uvc_streaming *stream = handle->stream; - int ret; if (type != stream->type) return -EINVAL; @@ -786,10 +794,11 @@ static int uvc_ioctl_streamoff(struct file *file, void *fh, return -EBUSY; mutex_lock(&stream->mutex); - ret = uvc_video_enable(stream, 0); + uvc_video_enable(stream, 0); + uvc_queue_enable(&stream->queue, 0); mutex_unlock(&stream->mutex); - return ret; + return 0; } static int uvc_ioctl_enum_input(struct file *file, void *fh, |