[media] uvc: embed video_device
authorHans Verkuil <hans.verkuil@cisco.com>
Mon, 9 Mar 2015 16:34:11 +0000 (13:34 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Wed, 8 Apr 2015 09:47:13 +0000 (06:47 -0300)
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>
drivers/media/usb/uvc/uvc_driver.c
drivers/media/usb/uvc/uvc_v4l2.c
drivers/media/usb/uvc/uvcvideo.h

index fd79a1afa9b43186ebcd9a10c952cbb2105d1f21..5970dd6a1c1cf491fe7ff64dbc6aedcfb957c55f 100644 (file)
@@ -1669,10 +1669,6 @@ static void uvc_delete(struct uvc_device *dev)
 #ifdef CONFIG_MEDIA_CONTROLLER
                uvc_mc_cleanup_entity(entity);
 #endif
-               if (entity->vdev) {
-                       video_device_release(entity->vdev);
-                       entity->vdev = NULL;
-               }
                kfree(entity);
        }
 
@@ -1717,11 +1713,10 @@ static void uvc_unregister_video(struct uvc_device *dev)
        atomic_inc(&dev->nstreams);
 
        list_for_each_entry(stream, &dev->streams, list) {
-               if (stream->vdev == NULL)
+               if (!video_is_registered(&stream->vdev))
                        continue;
 
-               video_unregister_device(stream->vdev);
-               stream->vdev = NULL;
+               video_unregister_device(&stream->vdev);
 
                uvc_debugfs_cleanup_stream(stream);
        }
@@ -1736,7 +1731,7 @@ static void uvc_unregister_video(struct uvc_device *dev)
 static int uvc_register_video(struct uvc_device *dev,
                struct uvc_streaming *stream)
 {
-       struct video_device *vdev;
+       struct video_device *vdev = &stream->vdev;
        int ret;
 
        /* Initialize the video buffers queue. */
@@ -1757,12 +1752,6 @@ static int uvc_register_video(struct uvc_device *dev,
        uvc_debugfs_init_stream(stream);
 
        /* Register the device with V4L. */
-       vdev = video_device_alloc();
-       if (vdev == NULL) {
-               uvc_printk(KERN_ERR, "Failed to allocate video device (%d).\n",
-                          ret);
-               return -ENOMEM;
-       }
 
        /* We already hold a reference to dev->udev. The video device will be
         * unregistered before the reference is released, so we don't need to
@@ -1780,15 +1769,12 @@ static int uvc_register_video(struct uvc_device *dev,
        /* Set the driver data before calling video_register_device, otherwise
         * uvc_v4l2_open might race us.
         */
-       stream->vdev = vdev;
        video_set_drvdata(vdev, stream);
 
        ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
        if (ret < 0) {
                uvc_printk(KERN_ERR, "Failed to register video device (%d).\n",
                           ret);
-               stream->vdev = NULL;
-               video_device_release(vdev);
                return ret;
        }
 
@@ -1827,7 +1813,7 @@ static int uvc_register_terms(struct uvc_device *dev,
                if (ret < 0)
                        return ret;
 
-               term->vdev = stream->vdev;
+               term->vdev = &stream->vdev;
        }
 
        return 0;
index 8d967fe2ef7d8709bdaf733b961abcafb2b740c8..b6a09835e7aa2cce90f3180b1d086cb2c2a62cec 100644 (file)
@@ -511,7 +511,7 @@ static int uvc_v4l2_open(struct file *file)
        stream->dev->users++;
        mutex_unlock(&stream->dev->lock);
 
-       v4l2_fh_init(&handle->vfh, stream->vdev);
+       v4l2_fh_init(&handle->vfh, &stream->vdev);
        v4l2_fh_add(&handle->vfh);
        handle->chain = stream->chain;
        handle->stream = stream;
index c63e5b55e1431b3eeffa954e32c7eb273e6845a5..1b594c2039927e9815ab26c5a047c2265c35fa59 100644 (file)
@@ -443,7 +443,7 @@ struct uvc_stats_stream {
 struct uvc_streaming {
        struct list_head list;
        struct uvc_device *dev;
-       struct video_device *vdev;
+       struct video_device vdev;
        struct uvc_video_chain *chain;
        atomic_t active;