]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/media/v4l2-core/v4l2-device.c
Merge branch 'for-3.13' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
[karo-tx-linux.git] / drivers / media / v4l2-core / v4l2-device.c
index 8ed5da2170bf8f6e5a6f3fd2103e88eaa6282ece..02d1b6327117b4ba599bed35f56e9c89a6669943 100644 (file)
@@ -44,7 +44,8 @@ int v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev)
        v4l2_dev->dev = dev;
        if (dev == NULL) {
                /* If dev == NULL, then name must be filled in by the caller */
-               WARN_ON(!v4l2_dev->name[0]);
+               if (WARN_ON(!v4l2_dev->name[0]))
+                       return -EINVAL;
                return 0;
        }
 
@@ -105,7 +106,9 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev)
 {
        struct v4l2_subdev *sd, *next;
 
-       if (v4l2_dev == NULL)
+       /* Just return if v4l2_dev is NULL or if it was already
+        * unregistered before. */
+       if (v4l2_dev == NULL || !v4l2_dev->name[0])
                return;
        v4l2_device_disconnect(v4l2_dev);
 
@@ -135,6 +138,8 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev)
                }
 #endif
        }
+       /* Mark as unregistered, thus preventing duplicate unregistrations */
+       v4l2_dev->name[0] = '\0';
 }
 EXPORT_SYMBOL_GPL(v4l2_device_unregister);
 
@@ -269,8 +274,10 @@ void v4l2_device_unregister_subdev(struct v4l2_subdev *sd)
        sd->v4l2_dev = NULL;
 
 #if defined(CONFIG_MEDIA_CONTROLLER)
-       if (v4l2_dev->mdev)
+       if (v4l2_dev->mdev) {
+               media_entity_remove_links(&sd->entity);
                media_device_unregister_entity(&sd->entity);
+       }
 #endif
        video_unregister_device(sd->devnode);
        module_put(sd->owner);