blob: b203aca5479b5daae46e5d90bd082c03fd66fcb3 [file] [log] [blame]
Nicholas Flintham1e3d3112013-04-10 10:48:38 +01001
2
3#ifndef _SYSDEV_H_
4#define _SYSDEV_H_
5
6#include <linux/kobject.h>
7#include <linux/module.h>
8#include <linux/pm.h>
9
10
11struct sys_device;
12struct sysdev_class_attribute;
13
14struct sysdev_class {
15 const char *name;
16 struct list_head drivers;
17 struct sysdev_class_attribute **attrs;
18 struct kset kset;
19};
20
21struct sysdev_class_attribute {
22 struct attribute attr;
23 ssize_t (*show)(struct sysdev_class *, struct sysdev_class_attribute *,
24 char *);
25 ssize_t (*store)(struct sysdev_class *, struct sysdev_class_attribute *,
26 const char *, size_t);
27};
28
29#define _SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) \
30{ \
31 .attr = {.name = __stringify(_name), .mode = _mode }, \
32 .show = _show, \
33 .store = _store, \
34}
35
36#define SYSDEV_CLASS_ATTR(_name,_mode,_show,_store) \
37 struct sysdev_class_attribute attr_##_name = \
38 _SYSDEV_CLASS_ATTR(_name,_mode,_show,_store)
39
40
41extern int sysdev_class_register(struct sysdev_class *);
42extern void sysdev_class_unregister(struct sysdev_class *);
43
44extern int sysdev_class_create_file(struct sysdev_class *,
45 struct sysdev_class_attribute *);
46extern void sysdev_class_remove_file(struct sysdev_class *,
47 struct sysdev_class_attribute *);
48
49struct sysdev_driver {
50 struct list_head entry;
51 int (*add)(struct sys_device *);
52 int (*remove)(struct sys_device *);
53};
54
55
56extern int sysdev_driver_register(struct sysdev_class *, struct sysdev_driver *);
57extern void sysdev_driver_unregister(struct sysdev_class *, struct sysdev_driver *);
58
59
60
61struct sys_device {
62 u32 id;
63 struct sysdev_class * cls;
64 struct kobject kobj;
65};
66
67extern int sysdev_register(struct sys_device *);
68extern void sysdev_unregister(struct sys_device *);
69
70
71struct sysdev_attribute {
72 struct attribute attr;
73 ssize_t (*show)(struct sys_device *, struct sysdev_attribute *, char *);
74 ssize_t (*store)(struct sys_device *, struct sysdev_attribute *,
75 const char *, size_t);
76};
77
78
79#define _SYSDEV_ATTR(_name, _mode, _show, _store) \
80{ \
81 .attr = { .name = __stringify(_name), .mode = _mode }, \
82 .show = _show, \
83 .store = _store, \
84}
85
86#define SYSDEV_ATTR(_name, _mode, _show, _store) \
87 struct sysdev_attribute attr_##_name = \
88 _SYSDEV_ATTR(_name, _mode, _show, _store);
89
90extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *);
91extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *);
92
93static inline int
94sysdev_create_files(struct sys_device *d, struct sysdev_attribute **a)
95{
96 return sysfs_create_files(&d->kobj, (const struct attribute **)a);
97}
98
99static inline void
100sysdev_remove_files(struct sys_device *d, struct sysdev_attribute **a)
101{
102 return sysfs_remove_files(&d->kobj, (const struct attribute **)a);
103}
104
105struct sysdev_ext_attribute {
106 struct sysdev_attribute attr;
107 void *var;
108};
109
110
111
112extern ssize_t sysdev_show_ulong(struct sys_device *, struct sysdev_attribute *,
113 char *);
114extern ssize_t sysdev_store_ulong(struct sys_device *,
115 struct sysdev_attribute *, const char *, size_t);
116extern ssize_t sysdev_show_int(struct sys_device *, struct sysdev_attribute *,
117 char *);
118extern ssize_t sysdev_store_int(struct sys_device *,
119 struct sysdev_attribute *, const char *, size_t);
120
121#define _SYSDEV_ULONG_ATTR(_name, _mode, _var) \
122 { _SYSDEV_ATTR(_name, _mode, sysdev_show_ulong, sysdev_store_ulong), \
123 &(_var) }
124#define SYSDEV_ULONG_ATTR(_name, _mode, _var) \
125 struct sysdev_ext_attribute attr_##_name = \
126 _SYSDEV_ULONG_ATTR(_name, _mode, _var);
127#define _SYSDEV_INT_ATTR(_name, _mode, _var) \
128 { _SYSDEV_ATTR(_name, _mode, sysdev_show_int, sysdev_store_int), \
129 &(_var) }
130#define SYSDEV_INT_ATTR(_name, _mode, _var) \
131 struct sysdev_ext_attribute attr_##_name = \
132 _SYSDEV_INT_ATTR(_name, _mode, _var);
133
134#endif