aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/function
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2015-03-09 12:34:08 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-04-02 22:36:20 -0400
commitdbe98b30d3a0d703369fef9712482e12fc685805 (patch)
tree41f5434ffe7c5e264728235f82160efe3c19df6c /drivers/usb/gadget/function
parentcab9bf11f8ef433151a15b9519e3e0a56302c9a4 (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.c44
-rw-r--r--drivers/usb/gadget/function/uvc.h2
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
435uvc_register_video(struct uvc_device *uvc) 435uvc_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
767error: 761error:
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
145struct uvc_device 145struct 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;