diff options
Diffstat (limited to 'include/media/media-devnode.h')
| -rw-r--r-- | include/media/media-devnode.h | 46 | 
1 files changed, 35 insertions, 11 deletions
| diff --git a/include/media/media-devnode.h b/include/media/media-devnode.h index fe42f08e72bd..37d494805944 100644 --- a/include/media/media-devnode.h +++ b/include/media/media-devnode.h @@ -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; @@ -94,7 +99,7 @@ struct media_devnode {  	unsigned long flags;		/* Use bitops to access flags */  	/* callbacks */ -	void (*release)(struct media_devnode *mdev); +	void (*release)(struct media_devnode *devnode);  };  /* dev to media_devnode */ @@ -103,7 +108,8 @@ struct media_devnode {  /**   * media_devnode_register - register a media device node   * - * @mdev: media device node structure we want to register + * @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   *   * The registration code assigns minor numbers and registers the new device node @@ -116,20 +122,33 @@ 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 *mdev, +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 - * @mdev: the device node to unregister + * @devnode: the device node to unregister   *   * 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 *mdev); +void media_devnode_unregister(struct media_devnode *devnode);  /**   * media_devnode_data - returns a pointer to the &media_devnode @@ -145,11 +164,16 @@ static inline struct media_devnode *media_devnode_data(struct file *filp)   * media_devnode_is_registered - returns true if &media_devnode is registered;   *	false otherwise.   * - * @mdev: pointer to struct &media_devnode. + * @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 *mdev) +static inline int media_devnode_is_registered(struct media_devnode *devnode)  { -	return test_bit(MEDIA_FLAG_REGISTERED, &mdev->flags); +	if (!devnode) +		return false; + +	return test_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);  }  #endif /* _MEDIA_DEVNODE_H */ |