diff options
Diffstat (limited to 'drivers/media/usb/uvc')
| -rw-r--r-- | drivers/media/usb/uvc/uvc_ctrl.c | 2 | ||||
| -rw-r--r-- | drivers/media/usb/uvc/uvc_queue.c | 16 | ||||
| -rw-r--r-- | drivers/media/usb/uvc/uvc_v4l2.c | 8 | 
3 files changed, 21 insertions, 5 deletions
diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index d5baab17a5e..61e28dec991 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1838,7 +1838,7 @@ static int uvc_ctrl_add_info(struct uvc_device *dev, struct uvc_control *ctrl,  {  	int ret = 0; -	memcpy(&ctrl->info, info, sizeof(*info)); +	ctrl->info = *info;  	INIT_LIST_HEAD(&ctrl->info.mappings);  	/* Allocate an array to save control values (cur, def, max, etc.) */ diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_queue.c index 778addc5caf..6c233a54ce4 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -115,11 +115,27 @@ static int uvc_buffer_finish(struct vb2_buffer *vb)  	return 0;  } +static void uvc_wait_prepare(struct vb2_queue *vq) +{ +	struct uvc_video_queue *queue = vb2_get_drv_priv(vq); + +	mutex_unlock(&queue->mutex); +} + +static void uvc_wait_finish(struct vb2_queue *vq) +{ +	struct uvc_video_queue *queue = vb2_get_drv_priv(vq); + +	mutex_lock(&queue->mutex); +} +  static struct vb2_ops uvc_queue_qops = {  	.queue_setup = uvc_queue_setup,  	.buf_prepare = uvc_buffer_prepare,  	.buf_queue = uvc_buffer_queue,  	.buf_finish = uvc_buffer_finish, +	.wait_prepare = uvc_wait_prepare, +	.wait_finish = uvc_wait_finish,  };  int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type, diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index 68d59b52749..b2dc32623a7 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -315,7 +315,7 @@ static int uvc_v4l2_set_format(struct uvc_streaming *stream,  		goto done;  	} -	memcpy(&stream->ctrl, &probe, sizeof probe); +	stream->ctrl = probe;  	stream->cur_format = format;  	stream->cur_frame = frame; @@ -387,7 +387,7 @@ static int uvc_v4l2_set_streamparm(struct uvc_streaming *stream,  		return -EBUSY;  	} -	memcpy(&probe, &stream->ctrl, sizeof probe); +	probe = stream->ctrl;  	probe.dwFrameInterval =  		uvc_try_frame_interval(stream->cur_frame, interval); @@ -398,7 +398,7 @@ static int uvc_v4l2_set_streamparm(struct uvc_streaming *stream,  		return ret;  	} -	memcpy(&stream->ctrl, &probe, sizeof probe); +	stream->ctrl = probe;  	mutex_unlock(&stream->mutex);  	/* Return the actual frame period. */ @@ -501,8 +501,8 @@ static int uvc_v4l2_open(struct file *file)  	if (atomic_inc_return(&stream->dev->users) == 1) {  		ret = uvc_status_start(stream->dev);  		if (ret < 0) { -			usb_autopm_put_interface(stream->dev->intf);  			atomic_dec(&stream->dev->users); +			usb_autopm_put_interface(stream->dev->intf);  			kfree(handle);  			return ret;  		}  |