aboutsummaryrefslogtreecommitdiffstats
path: root/include/media/media-devnode.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/media/media-devnode.h')
-rw-r--r--include/media/media-devnode.h46
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 @@
33#include <linux/device.h> 33#include <linux/device.h>
34#include <linux/cdev.h> 34#include <linux/cdev.h>
35 35
36struct media_device;
37
36/* 38/*
37 * Flag to mark the media_devnode struct as registered. Drivers must not touch 39 * Flag to mark the media_devnode struct as registered. Drivers must not touch
38 * this flag directly, it will be set and cleared by media_devnode_register and 40 * this flag directly, it will be set and cleared by media_devnode_register and
@@ -67,8 +69,9 @@ struct media_file_operations {
67 69
68/** 70/**
69 * struct media_devnode - Media device node 71 * struct media_devnode - Media device node
72 * @media_dev: pointer to struct &media_device
70 * @fops: pointer to struct &media_file_operations with media device ops 73 * @fops: pointer to struct &media_file_operations with media device ops
71 * @dev: struct device pointer for the media controller device 74 * @dev: pointer to struct &device containing the media controller device
72 * @cdev: struct cdev pointer character device 75 * @cdev: struct cdev pointer character device
73 * @parent: parent device 76 * @parent: parent device
74 * @minor: device node minor number 77 * @minor: device node minor number
@@ -81,6 +84,8 @@ struct media_file_operations {
81 * before registering the node. 84 * before registering the node.
82 */ 85 */
83struct media_devnode { 86struct media_devnode {
87 struct media_device *media_dev;
88
84 /* device ops */ 89 /* device ops */
85 const struct media_file_operations *fops; 90 const struct media_file_operations *fops;
86 91
@@ -94,7 +99,7 @@ struct media_devnode {
94 unsigned long flags; /* Use bitops to access flags */ 99 unsigned long flags; /* Use bitops to access flags */
95 100
96 /* callbacks */ 101 /* callbacks */
97 void (*release)(struct media_devnode *mdev); 102 void (*release)(struct media_devnode *devnode);
98}; 103};
99 104
100/* dev to media_devnode */ 105/* dev to media_devnode */
@@ -103,7 +108,8 @@ struct media_devnode {
103/** 108/**
104 * media_devnode_register - register a media device node 109 * media_devnode_register - register a media device node
105 * 110 *
106 * @mdev: media device node structure we want to register 111 * @mdev: struct media_device we want to register a device node
112 * @devnode: media device node structure we want to register
107 * @owner: should be filled with %THIS_MODULE 113 * @owner: should be filled with %THIS_MODULE
108 * 114 *
109 * The registration code assigns minor numbers and registers the new device node 115 * The registration code assigns minor numbers and registers the new device node
@@ -116,20 +122,33 @@ struct media_devnode {
116 * the media_devnode structure is *not* called, so the caller is responsible for 122 * the media_devnode structure is *not* called, so the caller is responsible for
117 * freeing any data. 123 * freeing any data.
118 */ 124 */
119int __must_check media_devnode_register(struct media_devnode *mdev, 125int __must_check media_devnode_register(struct media_device *mdev,
126 struct media_devnode *devnode,
120 struct module *owner); 127 struct module *owner);
121 128
122/** 129/**
130 * media_devnode_unregister_prepare - clear the media device node register bit
131 * @devnode: the device node to prepare for unregister
132 *
133 * This clears the passed device register bit. Future open calls will be met
134 * with errors. Should be called before media_devnode_unregister() to avoid
135 * races with unregister and device file open calls.
136 *
137 * This function can safely be called if the device node has never been
138 * registered or has already been unregistered.
139 */
140void media_devnode_unregister_prepare(struct media_devnode *devnode);
141
142/**
123 * media_devnode_unregister - unregister a media device node 143 * media_devnode_unregister - unregister a media device node
124 * @mdev: the device node to unregister 144 * @devnode: the device node to unregister
125 * 145 *
126 * This unregisters the passed device. Future open calls will be met with 146 * This unregisters the passed device. Future open calls will be met with
127 * errors. 147 * errors.
128 * 148 *
129 * This function can safely be called if the device node has never been 149 * Should be called after media_devnode_unregister_prepare()
130 * registered or has already been unregistered.
131 */ 150 */
132void media_devnode_unregister(struct media_devnode *mdev); 151void media_devnode_unregister(struct media_devnode *devnode);
133 152
134/** 153/**
135 * media_devnode_data - returns a pointer to the &media_devnode 154 * 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)
145 * media_devnode_is_registered - returns true if &media_devnode is registered; 164 * media_devnode_is_registered - returns true if &media_devnode is registered;
146 * false otherwise. 165 * false otherwise.
147 * 166 *
148 * @mdev: pointer to struct &media_devnode. 167 * @devnode: pointer to struct &media_devnode.
168 *
169 * Note: If mdev is NULL, it also returns false.
149 */ 170 */
150static inline int media_devnode_is_registered(struct media_devnode *mdev) 171static inline int media_devnode_is_registered(struct media_devnode *devnode)
151{ 172{
152 return test_bit(MEDIA_FLAG_REGISTERED, &mdev->flags); 173 if (!devnode)
174 return false;
175
176 return test_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
153} 177}
154 178
155#endif /* _MEDIA_DEVNODE_H */ 179#endif /* _MEDIA_DEVNODE_H */