Merge tag 'mfd-for-linus-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd
[cascardo/linux.git] / include / media / media-devnode.h
index e1d5af0..37d4948 100644 (file)
@@ -33,6 +33,8 @@
 #include <linux/device.h>
 #include <linux/cdev.h>
 
+struct media_device;
+
 /*
  * Flag to mark the media_devnode struct as registered. Drivers must not touch
  * this flag directly, it will be set and cleared by media_devnode_register and
@@ -67,8 +69,9 @@ struct media_file_operations {
 
 /**
  * struct media_devnode - Media device node
+ * @media_dev: pointer to struct &media_device
  * @fops:      pointer to struct &media_file_operations with media device ops
- * @dev:       struct device pointer for the media controller device
+ * @dev:       pointer to struct &device containing the media controller device
  * @cdev:      struct cdev pointer character device
  * @parent:    parent device
  * @minor:     device node minor number
@@ -81,6 +84,8 @@ struct media_file_operations {
  * before registering the node.
  */
 struct media_devnode {
+       struct media_device *media_dev;
+
        /* device ops */
        const struct media_file_operations *fops;
 
@@ -103,6 +108,7 @@ struct media_devnode {
 /**
  * media_devnode_register - register a media device node
  *
+ * @mdev: struct media_device we want to register a device node
  * @devnode: media device node structure we want to register
  * @owner: should be filled with %THIS_MODULE
  *
@@ -116,9 +122,23 @@ struct media_devnode {
  * the media_devnode structure is *not* called, so the caller is responsible for
  * freeing any data.
  */
-int __must_check media_devnode_register(struct media_devnode *devnode,
+int __must_check media_devnode_register(struct media_device *mdev,
+                                       struct media_devnode *devnode,
                                        struct module *owner);
 
+/**
+ * media_devnode_unregister_prepare - clear the media device node register bit
+ * @devnode: the device node to prepare for unregister
+ *
+ * This clears the passed device register bit. Future open calls will be met
+ * with errors. Should be called before media_devnode_unregister() to avoid
+ * races with unregister and device file open calls.
+ *
+ * This function can safely be called if the device node has never been
+ * registered or has already been unregistered.
+ */
+void media_devnode_unregister_prepare(struct media_devnode *devnode);
+
 /**
  * media_devnode_unregister - unregister a media device node
  * @devnode: the device node to unregister
@@ -126,8 +146,7 @@ int __must_check media_devnode_register(struct media_devnode *devnode,
  * This unregisters the passed device. Future open calls will be met with
  * errors.
  *
- * This function can safely be called if the device node has never been
- * registered or has already been unregistered.
+ * Should be called after media_devnode_unregister_prepare()
  */
 void media_devnode_unregister(struct media_devnode *devnode);
 
@@ -146,9 +165,14 @@ static inline struct media_devnode *media_devnode_data(struct file *filp)
  *     false otherwise.
  *
  * @devnode: pointer to struct &media_devnode.
+ *
+ * Note: If mdev is NULL, it also returns false.
  */
 static inline int media_devnode_is_registered(struct media_devnode *devnode)
 {
+       if (!devnode)
+               return false;
+
        return test_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
 }