Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Hans Verkuil and committed by
Mauro Carvalho Chehab
dbe98b30 cab9bf11

+17 -25
+16 -24
drivers/usb/gadget/function/f_uvc.c
··· 222 222 v4l2_event.type = UVC_EVENT_DATA; 223 223 uvc_event->data.length = req->actual; 224 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 256 memset(&v4l2_event, 0, sizeof(v4l2_event)); 257 257 v4l2_event.type = UVC_EVENT_SETUP; 258 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 261 return 0; 262 262 } ··· 315 315 memset(&v4l2_event, 0, sizeof(v4l2_event)); 316 316 v4l2_event.type = UVC_EVENT_CONNECT; 317 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 320 uvc->state = UVC_STATE_CONNECTED; 321 321 } ··· 343 343 344 344 memset(&v4l2_event, 0, sizeof(v4l2_event)); 345 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 348 uvc->state = UVC_STATE_CONNECTED; 349 349 return 0; ··· 370 370 371 371 memset(&v4l2_event, 0, sizeof(v4l2_event)); 372 372 v4l2_event.type = UVC_EVENT_STREAMON; 373 - v4l2_event_queue(uvc->vdev, &v4l2_event); 373 + v4l2_event_queue(&uvc->vdev, &v4l2_event); 374 374 return USB_GADGET_DELAYED_STATUS; 375 375 376 376 default: ··· 388 388 389 389 memset(&v4l2_event, 0, sizeof(v4l2_event)); 390 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 393 uvc->state = UVC_STATE_DISCONNECTED; 394 394 ··· 435 435 uvc_register_video(struct uvc_device *uvc) 436 436 { 437 437 struct usb_composite_dev *cdev = uvc->func.config->cdev; 438 - struct video_device *video; 439 438 440 439 /* TODO reference counting. */ 441 - video = video_device_alloc(); 442 - if (video == NULL) 443 - return -ENOMEM; 440 + uvc->vdev.v4l2_dev = &uvc->v4l2_dev; 441 + uvc->vdev.fops = &uvc_v4l2_fops; 442 + uvc->vdev.ioctl_ops = &uvc_v4l2_ioctl_ops; 443 + uvc->vdev.release = video_device_release_empty; 444 + uvc->vdev.vfl_dir = VFL_DIR_TX; 445 + uvc->vdev.lock = &uvc->video.mutex; 446 + strlcpy(uvc->vdev.name, cdev->gadget->name, sizeof(uvc->vdev.name)); 444 447 445 - video->v4l2_dev = &uvc->v4l2_dev; 446 - video->fops = &uvc_v4l2_fops; 447 - video->ioctl_ops = &uvc_v4l2_ioctl_ops; 448 - video->release = video_device_release; 449 - video->vfl_dir = VFL_DIR_TX; 450 - video->lock = &uvc->video.mutex; 451 - strlcpy(video->name, cdev->gadget->name, sizeof(video->name)); 448 + video_set_drvdata(&uvc->vdev, uvc); 452 449 453 - uvc->vdev = video; 454 - video_set_drvdata(video, uvc); 455 - 456 - return video_register_device(video, VFL_TYPE_GRABBER, -1); 450 + return video_register_device(&uvc->vdev, VFL_TYPE_GRABBER, -1); 457 451 } 458 452 459 453 #define UVC_COPY_DESCRIPTOR(mem, dst, desc) \ ··· 760 766 761 767 error: 762 768 v4l2_device_unregister(&uvc->v4l2_dev); 763 - if (uvc->vdev) 764 - video_device_release(uvc->vdev); 765 769 766 770 if (uvc->control_ep) 767 771 uvc->control_ep->driver_data = NULL; ··· 890 898 891 899 INFO(cdev, "%s\n", __func__); 892 900 893 - video_unregister_device(uvc->vdev); 901 + video_unregister_device(&uvc->vdev); 894 902 v4l2_device_unregister(&uvc->v4l2_dev); 895 903 uvc->control_ep->driver_data = NULL; 896 904 uvc->video.ep->driver_data = NULL;
+1 -1
drivers/usb/gadget/function/uvc.h
··· 144 144 145 145 struct uvc_device 146 146 { 147 - struct video_device *vdev; 147 + struct video_device vdev; 148 148 struct v4l2_device v4l2_dev; 149 149 enum uvc_state state; 150 150 struct usb_function func;