diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/gadget/f_uvc.c | 15 | ||||
-rw-r--r-- | drivers/usb/gadget/uvc.h | 1 | ||||
-rw-r--r-- | drivers/usb/gadget/uvc_v4l2.c | 14 |
3 files changed, 23 insertions, 7 deletions
diff --git a/drivers/usb/gadget/f_uvc.c b/drivers/usb/gadget/f_uvc.c index 49939e44ed74..38dcedddc52c 100644 --- a/drivers/usb/gadget/f_uvc.c +++ b/drivers/usb/gadget/f_uvc.c | |||
@@ -266,6 +266,13 @@ uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) | |||
266 | return 0; | 266 | return 0; |
267 | } | 267 | } |
268 | 268 | ||
269 | void uvc_function_setup_continue(struct uvc_device *uvc) | ||
270 | { | ||
271 | struct usb_composite_dev *cdev = uvc->func.config->cdev; | ||
272 | |||
273 | usb_composite_setup_continue(cdev); | ||
274 | } | ||
275 | |||
269 | static int | 276 | static int |
270 | uvc_function_get_alt(struct usb_function *f, unsigned interface) | 277 | uvc_function_get_alt(struct usb_function *f, unsigned interface) |
271 | { | 278 | { |
@@ -328,7 +335,7 @@ uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt) | |||
328 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 335 | v4l2_event_queue(uvc->vdev, &v4l2_event); |
329 | 336 | ||
330 | uvc->state = UVC_STATE_CONNECTED; | 337 | uvc->state = UVC_STATE_CONNECTED; |
331 | break; | 338 | return 0; |
332 | 339 | ||
333 | case 1: | 340 | case 1: |
334 | if (uvc->state != UVC_STATE_CONNECTED) | 341 | if (uvc->state != UVC_STATE_CONNECTED) |
@@ -345,15 +352,11 @@ uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt) | |||
345 | memset(&v4l2_event, 0, sizeof(v4l2_event)); | 352 | memset(&v4l2_event, 0, sizeof(v4l2_event)); |
346 | v4l2_event.type = UVC_EVENT_STREAMON; | 353 | v4l2_event.type = UVC_EVENT_STREAMON; |
347 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 354 | v4l2_event_queue(uvc->vdev, &v4l2_event); |
348 | 355 | return USB_GADGET_DELAYED_STATUS; | |
349 | uvc->state = UVC_STATE_STREAMING; | ||
350 | break; | ||
351 | 356 | ||
352 | default: | 357 | default: |
353 | return -EINVAL; | 358 | return -EINVAL; |
354 | } | 359 | } |
355 | |||
356 | return 0; | ||
357 | } | 360 | } |
358 | 361 | ||
359 | static void | 362 | static void |
diff --git a/drivers/usb/gadget/uvc.h b/drivers/usb/gadget/uvc.h index 7e90b1d12d09..817e9e19cecf 100644 --- a/drivers/usb/gadget/uvc.h +++ b/drivers/usb/gadget/uvc.h | |||
@@ -188,6 +188,7 @@ struct uvc_file_handle | |||
188 | * Functions | 188 | * Functions |
189 | */ | 189 | */ |
190 | 190 | ||
191 | extern void uvc_function_setup_continue(struct uvc_device *uvc); | ||
191 | extern void uvc_endpoint_stream(struct uvc_device *dev); | 192 | extern void uvc_endpoint_stream(struct uvc_device *dev); |
192 | 193 | ||
193 | extern void uvc_function_connect(struct uvc_device *uvc); | 194 | extern void uvc_function_connect(struct uvc_device *uvc); |
diff --git a/drivers/usb/gadget/uvc_v4l2.c b/drivers/usb/gadget/uvc_v4l2.c index 0080d073bd5e..2bb5af8d2b23 100644 --- a/drivers/usb/gadget/uvc_v4l2.c +++ b/drivers/usb/gadget/uvc_v4l2.c | |||
@@ -253,7 +253,19 @@ uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) | |||
253 | if (*type != video->queue.type) | 253 | if (*type != video->queue.type) |
254 | return -EINVAL; | 254 | return -EINVAL; |
255 | 255 | ||
256 | return uvc_video_enable(video, 1); | 256 | /* Enable UVC video. */ |
257 | ret = uvc_video_enable(video, 1); | ||
258 | if (ret < 0) | ||
259 | return ret; | ||
260 | |||
261 | /* | ||
262 | * Complete the alternate setting selection setup phase now that | ||
263 | * userspace is ready to provide video frames. | ||
264 | */ | ||
265 | uvc_function_setup_continue(uvc); | ||
266 | uvc->state = UVC_STATE_STREAMING; | ||
267 | |||
268 | return 0; | ||
257 | } | 269 | } |
258 | 270 | ||
259 | case VIDIOC_STREAMOFF: | 271 | case VIDIOC_STREAMOFF: |