diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2015-03-09 12:34:08 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-04-02 22:36:20 -0400 |
commit | dbe98b30d3a0d703369fef9712482e12fc685805 (patch) | |
tree | 41f5434ffe7c5e264728235f82160efe3c19df6c /drivers/usb/gadget/function | |
parent | cab9bf11f8ef433151a15b9519e3e0a56302c9a4 (diff) |
[media] gadget/uvc: embed video_device
Embed the video_device struct to simplify the error handling and in
order to (eventually) get rid of video_device_alloc/release.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/usb/gadget/function')
-rw-r--r-- | drivers/usb/gadget/function/f_uvc.c | 44 | ||||
-rw-r--r-- | drivers/usb/gadget/function/uvc.h | 2 |
2 files changed, 19 insertions, 27 deletions
diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c index 3242bc684e2d..cf0df8fbba89 100644 --- a/drivers/usb/gadget/function/f_uvc.c +++ b/drivers/usb/gadget/function/f_uvc.c | |||
@@ -222,7 +222,7 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req) | |||
222 | v4l2_event.type = UVC_EVENT_DATA; | 222 | v4l2_event.type = UVC_EVENT_DATA; |
223 | uvc_event->data.length = req->actual; | 223 | uvc_event->data.length = req->actual; |
224 | memcpy(&uvc_event->data.data, req->buf, req->actual); | 224 | memcpy(&uvc_event->data.data, req->buf, req->actual); |
225 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 225 | v4l2_event_queue(&uvc->vdev, &v4l2_event); |
226 | } | 226 | } |
227 | } | 227 | } |
228 | 228 | ||
@@ -256,7 +256,7 @@ uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) | |||
256 | memset(&v4l2_event, 0, sizeof(v4l2_event)); | 256 | memset(&v4l2_event, 0, sizeof(v4l2_event)); |
257 | v4l2_event.type = UVC_EVENT_SETUP; | 257 | v4l2_event.type = UVC_EVENT_SETUP; |
258 | memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req)); | 258 | memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req)); |
259 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 259 | v4l2_event_queue(&uvc->vdev, &v4l2_event); |
260 | 260 | ||
261 | return 0; | 261 | return 0; |
262 | } | 262 | } |
@@ -315,7 +315,7 @@ uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt) | |||
315 | memset(&v4l2_event, 0, sizeof(v4l2_event)); | 315 | memset(&v4l2_event, 0, sizeof(v4l2_event)); |
316 | v4l2_event.type = UVC_EVENT_CONNECT; | 316 | v4l2_event.type = UVC_EVENT_CONNECT; |
317 | uvc_event->speed = cdev->gadget->speed; | 317 | uvc_event->speed = cdev->gadget->speed; |
318 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 318 | v4l2_event_queue(&uvc->vdev, &v4l2_event); |
319 | 319 | ||
320 | uvc->state = UVC_STATE_CONNECTED; | 320 | uvc->state = UVC_STATE_CONNECTED; |
321 | } | 321 | } |
@@ -343,7 +343,7 @@ uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt) | |||
343 | 343 | ||
344 | memset(&v4l2_event, 0, sizeof(v4l2_event)); | 344 | memset(&v4l2_event, 0, sizeof(v4l2_event)); |
345 | v4l2_event.type = UVC_EVENT_STREAMOFF; | 345 | v4l2_event.type = UVC_EVENT_STREAMOFF; |
346 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 346 | v4l2_event_queue(&uvc->vdev, &v4l2_event); |
347 | 347 | ||
348 | uvc->state = UVC_STATE_CONNECTED; | 348 | uvc->state = UVC_STATE_CONNECTED; |
349 | return 0; | 349 | return 0; |
@@ -370,7 +370,7 @@ uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt) | |||
370 | 370 | ||
371 | memset(&v4l2_event, 0, sizeof(v4l2_event)); | 371 | memset(&v4l2_event, 0, sizeof(v4l2_event)); |
372 | v4l2_event.type = UVC_EVENT_STREAMON; | 372 | v4l2_event.type = UVC_EVENT_STREAMON; |
373 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 373 | v4l2_event_queue(&uvc->vdev, &v4l2_event); |
374 | return USB_GADGET_DELAYED_STATUS; | 374 | return USB_GADGET_DELAYED_STATUS; |
375 | 375 | ||
376 | default: | 376 | default: |
@@ -388,7 +388,7 @@ uvc_function_disable(struct usb_function *f) | |||
388 | 388 | ||
389 | memset(&v4l2_event, 0, sizeof(v4l2_event)); | 389 | memset(&v4l2_event, 0, sizeof(v4l2_event)); |
390 | v4l2_event.type = UVC_EVENT_DISCONNECT; | 390 | v4l2_event.type = UVC_EVENT_DISCONNECT; |
391 | v4l2_event_queue(uvc->vdev, &v4l2_event); | 391 | v4l2_event_queue(&uvc->vdev, &v4l2_event); |
392 | 392 | ||
393 | uvc->state = UVC_STATE_DISCONNECTED; | 393 | uvc->state = UVC_STATE_DISCONNECTED; |
394 | 394 | ||
@@ -435,25 +435,19 @@ static int | |||
435 | uvc_register_video(struct uvc_device *uvc) | 435 | uvc_register_video(struct uvc_device *uvc) |
436 | { | 436 | { |
437 | struct usb_composite_dev *cdev = uvc->func.config->cdev; | 437 | struct usb_composite_dev *cdev = uvc->func.config->cdev; |
438 | struct video_device *video; | ||
439 | 438 | ||
440 | /* TODO reference counting. */ | 439 | /* TODO reference counting. */ |
441 | video = video_device_alloc(); | 440 | uvc->vdev.v4l2_dev = &uvc->v4l2_dev; |
442 | if (video == NULL) | 441 | uvc->vdev.fops = &uvc_v4l2_fops; |
443 | return -ENOMEM; | 442 | uvc->vdev.ioctl_ops = &uvc_v4l2_ioctl_ops; |
444 | 443 | uvc->vdev.release = video_device_release_empty; | |
445 | video->v4l2_dev = &uvc->v4l2_dev; | 444 | uvc->vdev.vfl_dir = VFL_DIR_TX; |
446 | video->fops = &uvc_v4l2_fops; | 445 | uvc->vdev.lock = &uvc->video.mutex; |
447 | video->ioctl_ops = &uvc_v4l2_ioctl_ops; | 446 | strlcpy(uvc->vdev.name, cdev->gadget->name, sizeof(uvc->vdev.name)); |
448 | video->release = video_device_release; | 447 | |
449 | video->vfl_dir = VFL_DIR_TX; | 448 | video_set_drvdata(&uvc->vdev, uvc); |
450 | video->lock = &uvc->video.mutex; | 449 | |
451 | strlcpy(video->name, cdev->gadget->name, sizeof(video->name)); | 450 | return video_register_device(&uvc->vdev, VFL_TYPE_GRABBER, -1); |
452 | |||
453 | uvc->vdev = video; | ||
454 | video_set_drvdata(video, uvc); | ||
455 | |||
456 | return video_register_device(video, VFL_TYPE_GRABBER, -1); | ||
457 | } | 451 | } |
458 | 452 | ||
459 | #define UVC_COPY_DESCRIPTOR(mem, dst, desc) \ | 453 | #define UVC_COPY_DESCRIPTOR(mem, dst, desc) \ |
@@ -766,8 +760,6 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f) | |||
766 | 760 | ||
767 | error: | 761 | error: |
768 | v4l2_device_unregister(&uvc->v4l2_dev); | 762 | v4l2_device_unregister(&uvc->v4l2_dev); |
769 | if (uvc->vdev) | ||
770 | video_device_release(uvc->vdev); | ||
771 | 763 | ||
772 | if (uvc->control_ep) | 764 | if (uvc->control_ep) |
773 | uvc->control_ep->driver_data = NULL; | 765 | uvc->control_ep->driver_data = NULL; |
@@ -898,7 +890,7 @@ static void uvc_unbind(struct usb_configuration *c, struct usb_function *f) | |||
898 | 890 | ||
899 | INFO(cdev, "%s\n", __func__); | 891 | INFO(cdev, "%s\n", __func__); |
900 | 892 | ||
901 | video_unregister_device(uvc->vdev); | 893 | video_unregister_device(&uvc->vdev); |
902 | v4l2_device_unregister(&uvc->v4l2_dev); | 894 | v4l2_device_unregister(&uvc->v4l2_dev); |
903 | uvc->control_ep->driver_data = NULL; | 895 | uvc->control_ep->driver_data = NULL; |
904 | uvc->video.ep->driver_data = NULL; | 896 | uvc->video.ep->driver_data = NULL; |
diff --git a/drivers/usb/gadget/function/uvc.h b/drivers/usb/gadget/function/uvc.h index 3390ecd1a1f3..ebe409b9e419 100644 --- a/drivers/usb/gadget/function/uvc.h +++ b/drivers/usb/gadget/function/uvc.h | |||
@@ -144,7 +144,7 @@ enum uvc_state | |||
144 | 144 | ||
145 | struct uvc_device | 145 | struct uvc_device |
146 | { | 146 | { |
147 | struct video_device *vdev; | 147 | struct video_device vdev; |
148 | struct v4l2_device v4l2_dev; | 148 | struct v4l2_device v4l2_dev; |
149 | enum uvc_state state; | 149 | enum uvc_state state; |
150 | struct usb_function func; | 150 | struct usb_function func; |