Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * sysfs.h - definitions for the device driver filesystem | |
3 | * | |
4 | * Copyright (c) 2001,2002 Patrick Mochel | |
5 | * Copyright (c) 2004 Silicon Graphics, Inc. | |
6d66f5cd TH |
6 | * Copyright (c) 2007 SUSE Linux Products GmbH |
7 | * Copyright (c) 2007 Tejun Heo <teheo@suse.de> | |
1da177e4 LT |
8 | * |
9 | * Please see Documentation/filesystems/sysfs.txt for more information. | |
10 | */ | |
11 | ||
12 | #ifndef _SYSFS_H_ | |
13 | #define _SYSFS_H_ | |
14 | ||
4a7fb636 | 15 | #include <linux/compiler.h> |
5851fadc | 16 | #include <linux/errno.h> |
bf0acc33 | 17 | #include <linux/list.h> |
6992f533 | 18 | #include <linux/lockdep.h> |
1da177e4 LT |
19 | #include <asm/atomic.h> |
20 | ||
21 | struct kobject; | |
22 | struct module; | |
23 | ||
7b595756 | 24 | /* FIXME |
01e8ef11 PW |
25 | * The *owner field is no longer used. |
26 | * x86 tree has been cleaned up. The owner | |
27 | * attribute is still left for other arches. | |
7b595756 | 28 | */ |
1da177e4 | 29 | struct attribute { |
59f69015 TH |
30 | const char *name; |
31 | struct module *owner; | |
1da177e4 | 32 | mode_t mode; |
6992f533 EB |
33 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
34 | struct lock_class_key *key; | |
35 | struct lock_class_key skey; | |
36 | #endif | |
1da177e4 LT |
37 | }; |
38 | ||
35960258 EB |
39 | /** |
40 | * sysfs_attr_init - initialize a dynamically allocated sysfs attribute | |
41 | * @attr: struct attribute to initialize | |
42 | * | |
43 | * Initialize a dynamically allocated struct attribute so we can | |
44 | * make lockdep happy. This is a new requirement for attributes | |
45 | * and initially this is only needed when lockdep is enabled. | |
46 | * Lockdep gives a nice error when your attribute is added to | |
47 | * sysfs if you don't have this. | |
48 | */ | |
6992f533 EB |
49 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
50 | #define sysfs_attr_init(attr) \ | |
51 | do { \ | |
52 | static struct lock_class_key __key; \ | |
53 | \ | |
54 | (attr)->key = &__key; \ | |
55 | } while(0) | |
56 | #else | |
57 | #define sysfs_attr_init(attr) do {} while(0) | |
58 | #endif | |
59 | ||
1da177e4 | 60 | struct attribute_group { |
59f69015 | 61 | const char *name; |
0f423895 | 62 | mode_t (*is_visible)(struct kobject *, |
d4acd722 | 63 | struct attribute *, int); |
59f69015 | 64 | struct attribute **attrs; |
1da177e4 LT |
65 | }; |
66 | ||
67 | ||
68 | ||
69 | /** | |
70 | * Use these macros to make defining attributes easier. See include/linux/device.h | |
71 | * for examples.. | |
72 | */ | |
73 | ||
74 | #define __ATTR(_name,_mode,_show,_store) { \ | |
7b595756 | 75 | .attr = {.name = __stringify(_name), .mode = _mode }, \ |
1da177e4 LT |
76 | .show = _show, \ |
77 | .store = _store, \ | |
78 | } | |
79 | ||
80 | #define __ATTR_RO(_name) { \ | |
7b595756 TH |
81 | .attr = { .name = __stringify(_name), .mode = 0444 }, \ |
82 | .show = _name##_show, \ | |
1da177e4 LT |
83 | } |
84 | ||
85 | #define __ATTR_NULL { .attr = { .name = NULL } } | |
86 | ||
87 | #define attr_name(_attr) (_attr).attr.name | |
88 | ||
89 | struct vm_area_struct; | |
90 | ||
91 | struct bin_attribute { | |
92 | struct attribute attr; | |
93 | size_t size; | |
94 | void *private; | |
91a69029 ZR |
95 | ssize_t (*read)(struct kobject *, struct bin_attribute *, |
96 | char *, loff_t, size_t); | |
97 | ssize_t (*write)(struct kobject *, struct bin_attribute *, | |
98 | char *, loff_t, size_t); | |
1da177e4 LT |
99 | int (*mmap)(struct kobject *, struct bin_attribute *attr, |
100 | struct vm_area_struct *vma); | |
101 | }; | |
102 | ||
35960258 EB |
103 | /** |
104 | * sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute | |
105 | * @attr: struct bin_attribute to initialize | |
106 | * | |
107 | * Initialize a dynamically allocated struct bin_attribute so we | |
108 | * can make lockdep happy. This is a new requirement for | |
109 | * attributes and initially this is only needed when lockdep is | |
110 | * enabled. Lockdep gives a nice error when your attribute is | |
111 | * added to sysfs if you don't have this. | |
112 | */ | |
62e877b8 | 113 | #define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr) |
6992f533 | 114 | |
1da177e4 LT |
115 | struct sysfs_ops { |
116 | ssize_t (*show)(struct kobject *, struct attribute *,char *); | |
117 | ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); | |
118 | }; | |
119 | ||
f1282c84 NB |
120 | struct sysfs_dirent; |
121 | ||
1da177e4 LT |
122 | #ifdef CONFIG_SYSFS |
123 | ||
59f69015 TH |
124 | int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *), |
125 | void *data, struct module *owner); | |
1da177e4 | 126 | |
59f69015 TH |
127 | int __must_check sysfs_create_dir(struct kobject *kobj); |
128 | void sysfs_remove_dir(struct kobject *kobj); | |
129 | int __must_check sysfs_rename_dir(struct kobject *kobj, const char *new_name); | |
130 | int __must_check sysfs_move_dir(struct kobject *kobj, | |
131 | struct kobject *new_parent_kobj); | |
31e5abe9 | 132 | |
59f69015 TH |
133 | int __must_check sysfs_create_file(struct kobject *kobj, |
134 | const struct attribute *attr); | |
1c205ae1 AK |
135 | int __must_check sysfs_create_files(struct kobject *kobj, |
136 | const struct attribute **attr); | |
59f69015 TH |
137 | int __must_check sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, |
138 | mode_t mode); | |
139 | void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr); | |
1c205ae1 | 140 | void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr); |
1da177e4 | 141 | |
4a7fb636 | 142 | int __must_check sysfs_create_bin_file(struct kobject *kobj, |
66ecb92b PC |
143 | const struct bin_attribute *attr); |
144 | void sysfs_remove_bin_file(struct kobject *kobj, | |
145 | const struct bin_attribute *attr); | |
1da177e4 | 146 | |
59f69015 TH |
147 | int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target, |
148 | const char *name); | |
36ce6dad CH |
149 | int __must_check sysfs_create_link_nowarn(struct kobject *kobj, |
150 | struct kobject *target, | |
151 | const char *name); | |
59f69015 TH |
152 | void sysfs_remove_link(struct kobject *kobj, const char *name); |
153 | ||
7cb32942 EB |
154 | int sysfs_rename_link(struct kobject *kobj, struct kobject *target, |
155 | const char *old_name, const char *new_name); | |
156 | ||
59f69015 TH |
157 | int __must_check sysfs_create_group(struct kobject *kobj, |
158 | const struct attribute_group *grp); | |
0f423895 JB |
159 | int sysfs_update_group(struct kobject *kobj, |
160 | const struct attribute_group *grp); | |
59f69015 TH |
161 | void sysfs_remove_group(struct kobject *kobj, |
162 | const struct attribute_group *grp); | |
dfa87c82 | 163 | int sysfs_add_file_to_group(struct kobject *kobj, |
59f69015 | 164 | const struct attribute *attr, const char *group); |
dfa87c82 | 165 | void sysfs_remove_file_from_group(struct kobject *kobj, |
59f69015 | 166 | const struct attribute *attr, const char *group); |
dfa87c82 | 167 | |
8c0e3998 | 168 | void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr); |
f1282c84 NB |
169 | void sysfs_notify_dirent(struct sysfs_dirent *sd); |
170 | struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, | |
171 | const unsigned char *name); | |
172 | struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd); | |
173 | void sysfs_put(struct sysfs_dirent *sd); | |
ae87221d | 174 | void sysfs_printk_last_file(void); |
f1282c84 | 175 | int __must_check sysfs_init(void); |
f20a9ead | 176 | |
1da177e4 LT |
177 | #else /* CONFIG_SYSFS */ |
178 | ||
d9a9cdfb | 179 | static inline int sysfs_schedule_callback(struct kobject *kobj, |
523ded71 | 180 | void (*func)(void *), void *data, struct module *owner) |
d9a9cdfb AS |
181 | { |
182 | return -ENOSYS; | |
183 | } | |
184 | ||
59f69015 | 185 | static inline int sysfs_create_dir(struct kobject *kobj) |
1da177e4 LT |
186 | { |
187 | return 0; | |
188 | } | |
189 | ||
59f69015 | 190 | static inline void sysfs_remove_dir(struct kobject *kobj) |
1da177e4 | 191 | { |
1da177e4 LT |
192 | } |
193 | ||
59f69015 | 194 | static inline int sysfs_rename_dir(struct kobject *kobj, const char *new_name) |
1da177e4 | 195 | { |
0b4a4fea | 196 | return 0; |
1da177e4 LT |
197 | } |
198 | ||
59f69015 TH |
199 | static inline int sysfs_move_dir(struct kobject *kobj, |
200 | struct kobject *new_parent_kobj) | |
8a82472f CH |
201 | { |
202 | return 0; | |
203 | } | |
204 | ||
59f69015 TH |
205 | static inline int sysfs_create_file(struct kobject *kobj, |
206 | const struct attribute *attr) | |
1da177e4 LT |
207 | { |
208 | return 0; | |
209 | } | |
210 | ||
1c205ae1 AK |
211 | static inline int sysfs_create_files(struct kobject *kobj, |
212 | const struct attribute **attr) | |
213 | { | |
214 | return 0; | |
215 | } | |
216 | ||
59f69015 TH |
217 | static inline int sysfs_chmod_file(struct kobject *kobj, |
218 | struct attribute *attr, mode_t mode) | |
31e5abe9 KS |
219 | { |
220 | return 0; | |
221 | } | |
1da177e4 | 222 | |
59f69015 TH |
223 | static inline void sysfs_remove_file(struct kobject *kobj, |
224 | const struct attribute *attr) | |
1da177e4 | 225 | { |
1da177e4 LT |
226 | } |
227 | ||
1c205ae1 AK |
228 | static inline void sysfs_remove_files(struct kobject *kobj, |
229 | const struct attribute **attr) | |
230 | { | |
231 | } | |
232 | ||
59f69015 | 233 | static inline int sysfs_create_bin_file(struct kobject *kobj, |
66ecb92b | 234 | const struct bin_attribute *attr) |
1da177e4 LT |
235 | { |
236 | return 0; | |
237 | } | |
238 | ||
3612e06b | 239 | static inline void sysfs_remove_bin_file(struct kobject *kobj, |
66ecb92b | 240 | const struct bin_attribute *attr) |
1da177e4 | 241 | { |
1da177e4 LT |
242 | } |
243 | ||
59f69015 TH |
244 | static inline int sysfs_create_link(struct kobject *kobj, |
245 | struct kobject *target, const char *name) | |
1da177e4 LT |
246 | { |
247 | return 0; | |
248 | } | |
249 | ||
36ce6dad CH |
250 | static inline int sysfs_create_link_nowarn(struct kobject *kobj, |
251 | struct kobject *target, | |
252 | const char *name) | |
253 | { | |
254 | return 0; | |
255 | } | |
256 | ||
59f69015 | 257 | static inline void sysfs_remove_link(struct kobject *kobj, const char *name) |
1da177e4 | 258 | { |
1da177e4 LT |
259 | } |
260 | ||
7cb32942 EB |
261 | static inline int sysfs_rename_link(struct kobject *k, struct kobject *t, |
262 | const char *old_name, const char *new_name) | |
263 | { | |
264 | return 0; | |
265 | } | |
266 | ||
59f69015 TH |
267 | static inline int sysfs_create_group(struct kobject *kobj, |
268 | const struct attribute_group *grp) | |
1da177e4 LT |
269 | { |
270 | return 0; | |
271 | } | |
272 | ||
1cbfb7a5 RD |
273 | static inline int sysfs_update_group(struct kobject *kobj, |
274 | const struct attribute_group *grp) | |
275 | { | |
276 | return 0; | |
277 | } | |
278 | ||
59f69015 TH |
279 | static inline void sysfs_remove_group(struct kobject *kobj, |
280 | const struct attribute_group *grp) | |
1da177e4 | 281 | { |
1da177e4 LT |
282 | } |
283 | ||
dfa87c82 AS |
284 | static inline int sysfs_add_file_to_group(struct kobject *kobj, |
285 | const struct attribute *attr, const char *group) | |
286 | { | |
287 | return 0; | |
288 | } | |
289 | ||
290 | static inline void sysfs_remove_file_from_group(struct kobject *kobj, | |
d701d8a3 | 291 | const struct attribute *attr, const char *group) |
dfa87c82 | 292 | { |
dfa87c82 AS |
293 | } |
294 | ||
8c0e3998 TP |
295 | static inline void sysfs_notify(struct kobject *kobj, const char *dir, |
296 | const char *attr) | |
4508a7a7 N |
297 | { |
298 | } | |
f1282c84 NB |
299 | static inline void sysfs_notify_dirent(struct sysfs_dirent *sd) |
300 | { | |
301 | } | |
302 | static inline | |
303 | struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, | |
304 | const unsigned char *name) | |
305 | { | |
306 | return NULL; | |
307 | } | |
308 | static inline struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd) | |
309 | { | |
310 | return NULL; | |
311 | } | |
312 | static inline void sysfs_put(struct sysfs_dirent *sd) | |
313 | { | |
314 | } | |
4508a7a7 | 315 | |
f20a9ead AM |
316 | static inline int __must_check sysfs_init(void) |
317 | { | |
318 | return 0; | |
319 | } | |
320 | ||
ae87221d AM |
321 | static inline void sysfs_printk_last_file(void) |
322 | { | |
323 | } | |
324 | ||
1da177e4 LT |
325 | #endif /* CONFIG_SYSFS */ |
326 | ||
327 | #endif /* _SYSFS_H_ */ |