}
 EXPORT_SYMBOL_GPL(v4l2_device_register_subdev);
 
+static void v4l2_subdev_release(struct v4l2_subdev *sd)
+{
+       struct module *owner = !sd->owner_v4l2_dev ? sd->owner : NULL;
+
+       if (sd->internal_ops && sd->internal_ops->release)
+               sd->internal_ops->release(sd);
+       module_put(owner);
+}
+
 static void v4l2_device_release_subdev_node(struct video_device *vdev)
 {
-       struct v4l2_subdev *sd = video_get_drvdata(vdev);
-       sd->devnode = NULL;
+       v4l2_subdev_release(video_get_drvdata(vdev));
        kfree(vdev);
 }
 
                media_device_unregister_entity(&sd->entity);
        }
 #endif
-       video_unregister_device(sd->devnode);
-       if (!sd->owner_v4l2_dev)
-               module_put(sd->owner);
+       if (sd->devnode)
+               video_unregister_device(sd->devnode);
+       else
+               v4l2_subdev_release(sd);
 }
 EXPORT_SYMBOL_GPL(v4l2_device_unregister_subdev);
 
  *
  * @open: called when the subdev device node is opened by an application.
  *
- * @close: called when the subdev device node is closed.
+ * @close: called when the subdev device node is closed. Please note that
+ *     it is possible for @close to be called after @unregistered!
+ *
+ * @release: called when the last user of the subdev device is gone. This
+ *     happens after the @unregistered callback and when the last open
+ *     filehandle to the v4l-subdevX device node was closed. If no device
+ *     node was created for this sub-device, then the @release callback
+ *     is called right after the @unregistered callback.
+ *     The @release callback is typically used to free the memory containing
+ *     the v4l2_subdev structure. It is almost certainly required for any
+ *     sub-device that sets the V4L2_SUBDEV_FL_HAS_DEVNODE flag.
  *
  * .. note::
  *     Never call this from drivers, only the v4l2 framework can call
        void (*unregistered)(struct v4l2_subdev *sd);
        int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
        int (*close)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
+       void (*release)(struct v4l2_subdev *sd);
 };
 
 #define V4L2_SUBDEV_NAME_SIZE 32