]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - include/linux/sysfs.h
d50a96b9bb6d47a4a1485d1ee2b94fdf64a72f0f
[karo-tx-linux.git] / include / linux / sysfs.h
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.
6  * Copyright (c) 2007 SUSE Linux Products GmbH
7  * Copyright (c) 2007 Tejun Heo <teheo@suse.de>
8  *
9  * Please see Documentation/filesystems/sysfs.txt for more information.
10  */
11
12 #ifndef _SYSFS_H_
13 #define _SYSFS_H_
14
15 #include <linux/compiler.h>
16 #include <linux/errno.h>
17 #include <linux/list.h>
18 #include <linux/lockdep.h>
19 #include <linux/kobject_ns.h>
20 #include <linux/atomic.h>
21
22 struct kobject;
23 struct module;
24 enum kobj_ns_type;
25
26 struct attribute {
27         const char              *name;
28         umode_t                 mode;
29 #ifdef CONFIG_DEBUG_LOCK_ALLOC
30         bool                    ignore_lockdep:1;
31         struct lock_class_key   *key;
32         struct lock_class_key   skey;
33 #endif
34 };
35
36 /**
37  *      sysfs_attr_init - initialize a dynamically allocated sysfs attribute
38  *      @attr: struct attribute to initialize
39  *
40  *      Initialize a dynamically allocated struct attribute so we can
41  *      make lockdep happy.  This is a new requirement for attributes
42  *      and initially this is only needed when lockdep is enabled.
43  *      Lockdep gives a nice error when your attribute is added to
44  *      sysfs if you don't have this.
45  */
46 #ifdef CONFIG_DEBUG_LOCK_ALLOC
47 #define sysfs_attr_init(attr)                           \
48 do {                                                    \
49         static struct lock_class_key __key;             \
50                                                         \
51         (attr)->key = &__key;                           \
52 } while(0)
53 #else
54 #define sysfs_attr_init(attr) do {} while(0)
55 #endif
56
57 struct attribute_group {
58         const char              *name;
59         umode_t                 (*is_visible)(struct kobject *,
60                                               struct attribute *, int);
61         struct attribute        **attrs;
62 };
63
64
65
66 /**
67  * Use these macros to make defining attributes easier. See include/linux/device.h
68  * for examples..
69  */
70
71 #define __ATTR(_name,_mode,_show,_store) { \
72         .attr = {.name = __stringify(_name), .mode = _mode },   \
73         .show   = _show,                                        \
74         .store  = _store,                                       \
75 }
76
77 #define __ATTR_RO(_name) { \
78         .attr   = { .name = __stringify(_name), .mode = 0444 }, \
79         .show   = _name##_show,                                 \
80 }
81
82 #define __ATTR_RW(_name) __ATTR(_name, 0644, _name##_show, _name##_store)
83
84 #define __ATTR_NULL { .attr = { .name = NULL } }
85
86 #ifdef CONFIG_DEBUG_LOCK_ALLOC
87 #define __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) {    \
88         .attr = {.name = __stringify(_name), .mode = _mode,     \
89                         .ignore_lockdep = true },               \
90         .show           = _show,                                \
91         .store          = _store,                               \
92 }
93 #else
94 #define __ATTR_IGNORE_LOCKDEP   __ATTR
95 #endif
96
97 #define ATTRIBUTE_GROUPS(name)                                  \
98 static const struct attribute_group name##_group = {            \
99         .attrs = name##_attrs,                                  \
100 };                                                              \
101 static const struct attribute_group *name##_groups[] = {        \
102         &name##_group,                                          \
103         NULL,                                                   \
104 }
105
106 #define attr_name(_attr) (_attr).attr.name
107
108 struct file;
109 struct vm_area_struct;
110
111 struct bin_attribute {
112         struct attribute        attr;
113         size_t                  size;
114         void                    *private;
115         ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,
116                         char *, loff_t, size_t);
117         ssize_t (*write)(struct file *,struct kobject *, struct bin_attribute *,
118                          char *, loff_t, size_t);
119         int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,
120                     struct vm_area_struct *vma);
121 };
122
123 /**
124  *      sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute
125  *      @attr: struct bin_attribute to initialize
126  *
127  *      Initialize a dynamically allocated struct bin_attribute so we
128  *      can make lockdep happy.  This is a new requirement for
129  *      attributes and initially this is only needed when lockdep is
130  *      enabled.  Lockdep gives a nice error when your attribute is
131  *      added to sysfs if you don't have this.
132  */
133 #define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr)
134
135 /* macro to create static binary attributes easier */
136 #define BIN_ATTR(_name, _mode, _read, _write, _size)            \
137 struct bin_attribute bin_attr_##_name = {                       \
138         .attr = {.name = __stringify(_name), .mode = _mode },   \
139         .read   = _read,                                        \
140         .write  = _write,                                       \
141         .size   = _size,                                        \
142 }
143
144 struct sysfs_ops {
145         ssize_t (*show)(struct kobject *, struct attribute *,char *);
146         ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);
147         const void *(*namespace)(struct kobject *, const struct attribute *);
148 };
149
150 struct sysfs_dirent;
151
152 #ifdef CONFIG_SYSFS
153
154 int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *),
155                             void *data, struct module *owner);
156
157 int __must_check sysfs_create_dir(struct kobject *kobj);
158 void sysfs_remove_dir(struct kobject *kobj);
159 int __must_check sysfs_rename_dir(struct kobject *kobj, const char *new_name);
160 int __must_check sysfs_move_dir(struct kobject *kobj,
161                                 struct kobject *new_parent_kobj);
162
163 int __must_check sysfs_create_file(struct kobject *kobj,
164                                    const struct attribute *attr);
165 int __must_check sysfs_create_files(struct kobject *kobj,
166                                    const struct attribute **attr);
167 int __must_check sysfs_chmod_file(struct kobject *kobj,
168                                   const struct attribute *attr, umode_t mode);
169 void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr);
170 void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr);
171
172 int __must_check sysfs_create_bin_file(struct kobject *kobj,
173                                        const struct bin_attribute *attr);
174 void sysfs_remove_bin_file(struct kobject *kobj,
175                            const struct bin_attribute *attr);
176
177 int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target,
178                                    const char *name);
179 int __must_check sysfs_create_link_nowarn(struct kobject *kobj,
180                                           struct kobject *target,
181                                           const char *name);
182 void sysfs_remove_link(struct kobject *kobj, const char *name);
183
184 int sysfs_rename_link(struct kobject *kobj, struct kobject *target,
185                         const char *old_name, const char *new_name);
186
187 void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
188                         const char *name);
189
190 int __must_check sysfs_create_group(struct kobject *kobj,
191                                     const struct attribute_group *grp);
192 int sysfs_update_group(struct kobject *kobj,
193                        const struct attribute_group *grp);
194 void sysfs_remove_group(struct kobject *kobj,
195                         const struct attribute_group *grp);
196 int sysfs_add_file_to_group(struct kobject *kobj,
197                         const struct attribute *attr, const char *group);
198 void sysfs_remove_file_from_group(struct kobject *kobj,
199                         const struct attribute *attr, const char *group);
200 int sysfs_merge_group(struct kobject *kobj,
201                        const struct attribute_group *grp);
202 void sysfs_unmerge_group(struct kobject *kobj,
203                        const struct attribute_group *grp);
204 int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
205                             struct kobject *target, const char *link_name);
206 void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
207                                   const char *link_name);
208
209 void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
210 void sysfs_notify_dirent(struct sysfs_dirent *sd);
211 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
212                                       const void *ns,
213                                       const unsigned char *name);
214 struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd);
215 void sysfs_put(struct sysfs_dirent *sd);
216
217 int __must_check sysfs_init(void);
218
219 #else /* CONFIG_SYSFS */
220
221 static inline int sysfs_schedule_callback(struct kobject *kobj,
222                 void (*func)(void *), void *data, struct module *owner)
223 {
224         return -ENOSYS;
225 }
226
227 static inline int sysfs_create_dir(struct kobject *kobj)
228 {
229         return 0;
230 }
231
232 static inline void sysfs_remove_dir(struct kobject *kobj)
233 {
234 }
235
236 static inline int sysfs_rename_dir(struct kobject *kobj, const char *new_name)
237 {
238         return 0;
239 }
240
241 static inline int sysfs_move_dir(struct kobject *kobj,
242                                  struct kobject *new_parent_kobj)
243 {
244         return 0;
245 }
246
247 static inline int sysfs_create_file(struct kobject *kobj,
248                                     const struct attribute *attr)
249 {
250         return 0;
251 }
252
253 static inline int sysfs_create_files(struct kobject *kobj,
254                                     const struct attribute **attr)
255 {
256         return 0;
257 }
258
259 static inline int sysfs_chmod_file(struct kobject *kobj,
260                                    const struct attribute *attr, umode_t mode)
261 {
262         return 0;
263 }
264
265 static inline void sysfs_remove_file(struct kobject *kobj,
266                                      const struct attribute *attr)
267 {
268 }
269
270 static inline void sysfs_remove_files(struct kobject *kobj,
271                                      const struct attribute **attr)
272 {
273 }
274
275 static inline int sysfs_create_bin_file(struct kobject *kobj,
276                                         const struct bin_attribute *attr)
277 {
278         return 0;
279 }
280
281 static inline void sysfs_remove_bin_file(struct kobject *kobj,
282                                          const struct bin_attribute *attr)
283 {
284 }
285
286 static inline int sysfs_create_link(struct kobject *kobj,
287                                     struct kobject *target, const char *name)
288 {
289         return 0;
290 }
291
292 static inline int sysfs_create_link_nowarn(struct kobject *kobj,
293                                            struct kobject *target,
294                                            const char *name)
295 {
296         return 0;
297 }
298
299 static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
300 {
301 }
302
303 static inline int sysfs_rename_link(struct kobject *k, struct kobject *t,
304                                     const char *old_name, const char *new_name)
305 {
306         return 0;
307 }
308
309 static inline void sysfs_delete_link(struct kobject *k, struct kobject *t,
310                                      const char *name)
311 {
312 }
313
314 static inline int sysfs_create_group(struct kobject *kobj,
315                                      const struct attribute_group *grp)
316 {
317         return 0;
318 }
319
320 static inline int sysfs_update_group(struct kobject *kobj,
321                                 const struct attribute_group *grp)
322 {
323         return 0;
324 }
325
326 static inline void sysfs_remove_group(struct kobject *kobj,
327                                       const struct attribute_group *grp)
328 {
329 }
330
331 static inline int sysfs_add_file_to_group(struct kobject *kobj,
332                 const struct attribute *attr, const char *group)
333 {
334         return 0;
335 }
336
337 static inline void sysfs_remove_file_from_group(struct kobject *kobj,
338                 const struct attribute *attr, const char *group)
339 {
340 }
341
342 static inline int sysfs_merge_group(struct kobject *kobj,
343                        const struct attribute_group *grp)
344 {
345         return 0;
346 }
347
348 static inline void sysfs_unmerge_group(struct kobject *kobj,
349                        const struct attribute_group *grp)
350 {
351 }
352
353 static inline int sysfs_add_link_to_group(struct kobject *kobj,
354                 const char *group_name, struct kobject *target,
355                 const char *link_name)
356 {
357         return 0;
358 }
359
360 static inline void sysfs_remove_link_from_group(struct kobject *kobj,
361                 const char *group_name, const char *link_name)
362 {
363 }
364
365 static inline void sysfs_notify(struct kobject *kobj, const char *dir,
366                                 const char *attr)
367 {
368 }
369 static inline void sysfs_notify_dirent(struct sysfs_dirent *sd)
370 {
371 }
372 static inline
373 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
374                                       const void *ns,
375                                       const unsigned char *name)
376 {
377         return NULL;
378 }
379 static inline struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd)
380 {
381         return NULL;
382 }
383 static inline void sysfs_put(struct sysfs_dirent *sd)
384 {
385 }
386
387 static inline int __must_check sysfs_init(void)
388 {
389         return 0;
390 }
391
392 #endif /* CONFIG_SYSFS */
393
394 #endif /* _SYSFS_H_ */