diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-01-25 11:34:42 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-01-25 11:35:13 -0500 |
commit | df8dc74e8a383eaf2d9b44b80a71ec6f0e52b42e (patch) | |
tree | bc3799a43e8b94fa84b32e37b1c124d5e4868f50 /include/linux/device.h | |
parent | 556a169dab38b5100df6f4a45b655dddd3db94c1 (diff) | |
parent | 4a3ad20ccd8f4d2a0535cf98fa83f7b561ba59a9 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6
This can be broken down into these major areas:
- Documentation updates (language translations and fixes, as
well as kobject and kset documenatation updates.)
- major kset/kobject/ktype rework and fixes. This cleans up the
kset and kobject and ktype relationship and architecture,
making sense of things now, and good documenation and samples
are provided for others to use. Also the attributes for
kobjects are much easier to handle now. This cleaned up a LOT
of code all through the kernel, making kobjects easier to use
if you want to.
- struct bus_type has been reworked to now handle the lifetime
rules properly, as the kobject is properly dynamic.
- struct driver has also been reworked, and now the lifetime
issues are resolved.
- the block subsystem has been converted to use struct device
now, and not "raw" kobjects. This patch has been in the -mm
tree for over a year now, and finally all the issues are
worked out with it. Older distros now properly work with new
kernels, and no userspace updates are needed at all.
- nozomi driver is added. This has also been in -mm for a long
time, and many people have asked for it to go in. It is now
in good enough shape to do so.
- lots of class_device conversions to use struct device instead.
The tree is almost all cleaned up now, only SCSI and IB is the
remaining code to fix up...
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6: (196 commits)
Driver core: coding style fixes
Kobject: fix coding style issues in kobject c files
Kobject: fix coding style issues in kobject.h
Driver core: fix coding style issues in device.h
spi: use class iteration api
scsi: use class iteration api
rtc: use class iteration api
power supply : use class iteration api
ieee1394: use class iteration api
Driver Core: add class iteration api
Driver core: Cleanup get_device_parent() in device_add() and device_move()
UIO: constify function pointer tables
Driver Core: constify the name passed to platform_device_register_simple
driver core: fix build with SYSFS=n
sysfs: make SYSFS_DEPRECATED depend on SYSFS
Driver core: use LIST_HEAD instead of call to INIT_LIST_HEAD in __init
kobject: add sample code for how to use ksets/ktypes/kobjects
kobject: add sample code for how to use kobjects in a simple manner.
kobject: update the kobject/kset documentation
kobject: remove old, outdated documentation.
...
Diffstat (limited to 'include/linux/device.h')
-rw-r--r-- | include/linux/device.h | 360 |
1 files changed, 189 insertions, 171 deletions
diff --git a/include/linux/device.h b/include/linux/device.h index 2e15822fe409..1880208964d6 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -25,75 +25,69 @@ | |||
25 | #include <asm/device.h> | 25 | #include <asm/device.h> |
26 | 26 | ||
27 | #define DEVICE_NAME_SIZE 50 | 27 | #define DEVICE_NAME_SIZE 50 |
28 | #define DEVICE_NAME_HALF __stringify(20) /* Less than half to accommodate slop */ | 28 | /* DEVICE_NAME_HALF is really less than half to accommodate slop */ |
29 | #define DEVICE_NAME_HALF __stringify(20) | ||
29 | #define DEVICE_ID_SIZE 32 | 30 | #define DEVICE_ID_SIZE 32 |
30 | #define BUS_ID_SIZE KOBJ_NAME_LEN | 31 | #define BUS_ID_SIZE KOBJ_NAME_LEN |
31 | 32 | ||
32 | 33 | ||
33 | struct device; | 34 | struct device; |
34 | struct device_driver; | 35 | struct device_driver; |
36 | struct driver_private; | ||
35 | struct class; | 37 | struct class; |
36 | struct class_device; | 38 | struct class_device; |
37 | struct bus_type; | 39 | struct bus_type; |
40 | struct bus_type_private; | ||
38 | 41 | ||
39 | struct bus_attribute { | 42 | struct bus_attribute { |
40 | struct attribute attr; | 43 | struct attribute attr; |
41 | ssize_t (*show)(struct bus_type *, char * buf); | 44 | ssize_t (*show)(struct bus_type *bus, char *buf); |
42 | ssize_t (*store)(struct bus_type *, const char * buf, size_t count); | 45 | ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count); |
43 | }; | 46 | }; |
44 | 47 | ||
45 | #define BUS_ATTR(_name,_mode,_show,_store) \ | 48 | #define BUS_ATTR(_name, _mode, _show, _store) \ |
46 | struct bus_attribute bus_attr_##_name = __ATTR(_name,_mode,_show,_store) | 49 | struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store) |
47 | 50 | ||
48 | extern int __must_check bus_create_file(struct bus_type *, | 51 | extern int __must_check bus_create_file(struct bus_type *, |
49 | struct bus_attribute *); | 52 | struct bus_attribute *); |
50 | extern void bus_remove_file(struct bus_type *, struct bus_attribute *); | 53 | extern void bus_remove_file(struct bus_type *, struct bus_attribute *); |
51 | 54 | ||
52 | struct bus_type { | 55 | struct bus_type { |
53 | const char * name; | 56 | const char *name; |
54 | struct module * owner; | 57 | struct bus_attribute *bus_attrs; |
58 | struct device_attribute *dev_attrs; | ||
59 | struct driver_attribute *drv_attrs; | ||
55 | 60 | ||
56 | struct kset subsys; | 61 | int (*match)(struct device *dev, struct device_driver *drv); |
57 | struct kset drivers; | 62 | int (*uevent)(struct device *dev, struct kobj_uevent_env *env); |
58 | struct kset devices; | 63 | int (*probe)(struct device *dev); |
59 | struct klist klist_devices; | 64 | int (*remove)(struct device *dev); |
60 | struct klist klist_drivers; | 65 | void (*shutdown)(struct device *dev); |
61 | |||
62 | struct blocking_notifier_head bus_notifier; | ||
63 | |||
64 | struct bus_attribute * bus_attrs; | ||
65 | struct device_attribute * dev_attrs; | ||
66 | struct driver_attribute * drv_attrs; | ||
67 | |||
68 | int (*match)(struct device * dev, struct device_driver * drv); | ||
69 | int (*uevent)(struct device *dev, struct kobj_uevent_env *env); | ||
70 | int (*probe)(struct device * dev); | ||
71 | int (*remove)(struct device * dev); | ||
72 | void (*shutdown)(struct device * dev); | ||
73 | 66 | ||
74 | int (*suspend)(struct device * dev, pm_message_t state); | 67 | int (*suspend)(struct device *dev, pm_message_t state); |
75 | int (*suspend_late)(struct device * dev, pm_message_t state); | 68 | int (*suspend_late)(struct device *dev, pm_message_t state); |
76 | int (*resume_early)(struct device * dev); | 69 | int (*resume_early)(struct device *dev); |
77 | int (*resume)(struct device * dev); | 70 | int (*resume)(struct device *dev); |
78 | 71 | ||
79 | unsigned int drivers_autoprobe:1; | 72 | struct bus_type_private *p; |
80 | }; | 73 | }; |
81 | 74 | ||
82 | extern int __must_check bus_register(struct bus_type * bus); | 75 | extern int __must_check bus_register(struct bus_type *bus); |
83 | extern void bus_unregister(struct bus_type * bus); | 76 | extern void bus_unregister(struct bus_type *bus); |
84 | 77 | ||
85 | extern int __must_check bus_rescan_devices(struct bus_type * bus); | 78 | extern int __must_check bus_rescan_devices(struct bus_type *bus); |
86 | 79 | ||
87 | /* iterator helpers for buses */ | 80 | /* iterator helpers for buses */ |
88 | 81 | ||
89 | int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data, | 82 | int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, |
90 | int (*fn)(struct device *, void *)); | 83 | int (*fn)(struct device *dev, void *data)); |
91 | struct device * bus_find_device(struct bus_type *bus, struct device *start, | 84 | struct device *bus_find_device(struct bus_type *bus, struct device *start, |
92 | void *data, int (*match)(struct device *, void *)); | 85 | void *data, |
86 | int (*match)(struct device *dev, void *data)); | ||
93 | 87 | ||
94 | int __must_check bus_for_each_drv(struct bus_type *bus, | 88 | int __must_check bus_for_each_drv(struct bus_type *bus, |
95 | struct device_driver *start, void *data, | 89 | struct device_driver *start, void *data, |
96 | int (*fn)(struct device_driver *, void *)); | 90 | int (*fn)(struct device_driver *, void *)); |
97 | 91 | ||
98 | /* | 92 | /* |
99 | * Bus notifiers: Get notified of addition/removal of devices | 93 | * Bus notifiers: Get notified of addition/removal of devices |
@@ -118,111 +112,128 @@ extern int bus_unregister_notifier(struct bus_type *bus, | |||
118 | #define BUS_NOTIFY_UNBIND_DRIVER 0x00000004 /* driver about to be | 112 | #define BUS_NOTIFY_UNBIND_DRIVER 0x00000004 /* driver about to be |
119 | unbound */ | 113 | unbound */ |
120 | 114 | ||
115 | extern struct kset *bus_get_kset(struct bus_type *bus); | ||
116 | extern struct klist *bus_get_device_klist(struct bus_type *bus); | ||
117 | |||
121 | struct device_driver { | 118 | struct device_driver { |
122 | const char * name; | 119 | const char *name; |
123 | struct bus_type * bus; | 120 | struct bus_type *bus; |
124 | 121 | ||
125 | struct kobject kobj; | 122 | struct module *owner; |
126 | struct klist klist_devices; | 123 | const char *mod_name; /* used for built-in modules */ |
127 | struct klist_node knode_bus; | ||
128 | 124 | ||
129 | struct module * owner; | 125 | int (*probe) (struct device *dev); |
130 | const char * mod_name; /* used for built-in modules */ | 126 | int (*remove) (struct device *dev); |
131 | struct module_kobject * mkobj; | 127 | void (*shutdown) (struct device *dev); |
128 | int (*suspend) (struct device *dev, pm_message_t state); | ||
129 | int (*resume) (struct device *dev); | ||
130 | struct attribute_group **groups; | ||
132 | 131 | ||
133 | int (*probe) (struct device * dev); | 132 | struct driver_private *p; |
134 | int (*remove) (struct device * dev); | ||
135 | void (*shutdown) (struct device * dev); | ||
136 | int (*suspend) (struct device * dev, pm_message_t state); | ||
137 | int (*resume) (struct device * dev); | ||
138 | }; | 133 | }; |
139 | 134 | ||
140 | 135 | ||
141 | extern int __must_check driver_register(struct device_driver * drv); | 136 | extern int __must_check driver_register(struct device_driver *drv); |
142 | extern void driver_unregister(struct device_driver * drv); | 137 | extern void driver_unregister(struct device_driver *drv); |
143 | 138 | ||
144 | extern struct device_driver * get_driver(struct device_driver * drv); | 139 | extern struct device_driver *get_driver(struct device_driver *drv); |
145 | extern void put_driver(struct device_driver * drv); | 140 | extern void put_driver(struct device_driver *drv); |
146 | extern struct device_driver *driver_find(const char *name, struct bus_type *bus); | 141 | extern struct device_driver *driver_find(const char *name, |
142 | struct bus_type *bus); | ||
147 | extern int driver_probe_done(void); | 143 | extern int driver_probe_done(void); |
148 | 144 | ||
149 | /* sysfs interface for exporting driver attributes */ | 145 | /* sysfs interface for exporting driver attributes */ |
150 | 146 | ||
151 | struct driver_attribute { | 147 | struct driver_attribute { |
152 | struct attribute attr; | 148 | struct attribute attr; |
153 | ssize_t (*show)(struct device_driver *, char * buf); | 149 | ssize_t (*show)(struct device_driver *driver, char *buf); |
154 | ssize_t (*store)(struct device_driver *, const char * buf, size_t count); | 150 | ssize_t (*store)(struct device_driver *driver, const char *buf, |
151 | size_t count); | ||
155 | }; | 152 | }; |
156 | 153 | ||
157 | #define DRIVER_ATTR(_name,_mode,_show,_store) \ | 154 | #define DRIVER_ATTR(_name, _mode, _show, _store) \ |
158 | struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store) | 155 | struct driver_attribute driver_attr_##_name = \ |
156 | __ATTR(_name, _mode, _show, _store) | ||
159 | 157 | ||
160 | extern int __must_check driver_create_file(struct device_driver *, | 158 | extern int __must_check driver_create_file(struct device_driver *driver, |
161 | struct driver_attribute *); | 159 | struct driver_attribute *attr); |
162 | extern void driver_remove_file(struct device_driver *, struct driver_attribute *); | 160 | extern void driver_remove_file(struct device_driver *driver, |
161 | struct driver_attribute *attr); | ||
163 | 162 | ||
164 | extern int __must_check driver_for_each_device(struct device_driver * drv, | 163 | extern int __must_check driver_add_kobj(struct device_driver *drv, |
165 | struct device *start, void *data, | 164 | struct kobject *kobj, |
166 | int (*fn)(struct device *, void *)); | 165 | const char *fmt, ...); |
167 | struct device * driver_find_device(struct device_driver *drv, | 166 | |
168 | struct device *start, void *data, | 167 | extern int __must_check driver_for_each_device(struct device_driver *drv, |
169 | int (*match)(struct device *, void *)); | 168 | struct device *start, |
169 | void *data, | ||
170 | int (*fn)(struct device *dev, | ||
171 | void *)); | ||
172 | struct device *driver_find_device(struct device_driver *drv, | ||
173 | struct device *start, void *data, | ||
174 | int (*match)(struct device *dev, void *data)); | ||
170 | 175 | ||
171 | /* | 176 | /* |
172 | * device classes | 177 | * device classes |
173 | */ | 178 | */ |
174 | struct class { | 179 | struct class { |
175 | const char * name; | 180 | const char *name; |
176 | struct module * owner; | 181 | struct module *owner; |
177 | 182 | ||
178 | struct kset subsys; | 183 | struct kset subsys; |
179 | struct list_head children; | 184 | struct list_head children; |
180 | struct list_head devices; | 185 | struct list_head devices; |
181 | struct list_head interfaces; | 186 | struct list_head interfaces; |
182 | struct kset class_dirs; | 187 | struct kset class_dirs; |
183 | struct semaphore sem; /* locks both the children and interfaces lists */ | 188 | struct semaphore sem; /* locks children, devices, interfaces */ |
184 | 189 | struct class_attribute *class_attrs; | |
185 | struct class_attribute * class_attrs; | 190 | struct class_device_attribute *class_dev_attrs; |
186 | struct class_device_attribute * class_dev_attrs; | 191 | struct device_attribute *dev_attrs; |
187 | struct device_attribute * dev_attrs; | ||
188 | 192 | ||
189 | int (*uevent)(struct class_device *dev, struct kobj_uevent_env *env); | 193 | int (*uevent)(struct class_device *dev, struct kobj_uevent_env *env); |
190 | int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env); | 194 | int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env); |
191 | 195 | ||
192 | void (*release)(struct class_device *dev); | 196 | void (*release)(struct class_device *dev); |
193 | void (*class_release)(struct class *class); | 197 | void (*class_release)(struct class *class); |
194 | void (*dev_release)(struct device *dev); | 198 | void (*dev_release)(struct device *dev); |
195 | 199 | ||
196 | int (*suspend)(struct device *, pm_message_t state); | 200 | int (*suspend)(struct device *dev, pm_message_t state); |
197 | int (*resume)(struct device *); | 201 | int (*resume)(struct device *dev); |
198 | }; | 202 | }; |
199 | 203 | ||
200 | extern int __must_check class_register(struct class *); | 204 | extern int __must_check class_register(struct class *class); |
201 | extern void class_unregister(struct class *); | 205 | extern void class_unregister(struct class *class); |
206 | extern int class_for_each_device(struct class *class, void *data, | ||
207 | int (*fn)(struct device *dev, void *data)); | ||
208 | extern struct device *class_find_device(struct class *class, void *data, | ||
209 | int (*match)(struct device *, void *)); | ||
210 | extern struct class_device *class_find_child(struct class *class, void *data, | ||
211 | int (*match)(struct class_device *, void *)); | ||
202 | 212 | ||
203 | 213 | ||
204 | struct class_attribute { | 214 | struct class_attribute { |
205 | struct attribute attr; | 215 | struct attribute attr; |
206 | ssize_t (*show)(struct class *, char * buf); | 216 | ssize_t (*show)(struct class *class, char *buf); |
207 | ssize_t (*store)(struct class *, const char * buf, size_t count); | 217 | ssize_t (*store)(struct class *class, const char *buf, size_t count); |
208 | }; | 218 | }; |
209 | 219 | ||
210 | #define CLASS_ATTR(_name,_mode,_show,_store) \ | 220 | #define CLASS_ATTR(_name, _mode, _show, _store) \ |
211 | struct class_attribute class_attr_##_name = __ATTR(_name,_mode,_show,_store) | 221 | struct class_attribute class_attr_##_name = __ATTR(_name, _mode, _show, _store) |
212 | 222 | ||
213 | extern int __must_check class_create_file(struct class *, | 223 | extern int __must_check class_create_file(struct class *class, |
214 | const struct class_attribute *); | 224 | const struct class_attribute *attr); |
215 | extern void class_remove_file(struct class *, const struct class_attribute *); | 225 | extern void class_remove_file(struct class *class, |
226 | const struct class_attribute *attr); | ||
216 | 227 | ||
217 | struct class_device_attribute { | 228 | struct class_device_attribute { |
218 | struct attribute attr; | 229 | struct attribute attr; |
219 | ssize_t (*show)(struct class_device *, char * buf); | 230 | ssize_t (*show)(struct class_device *, char *buf); |
220 | ssize_t (*store)(struct class_device *, const char * buf, size_t count); | 231 | ssize_t (*store)(struct class_device *, const char *buf, size_t count); |
221 | }; | 232 | }; |
222 | 233 | ||
223 | #define CLASS_DEVICE_ATTR(_name,_mode,_show,_store) \ | 234 | #define CLASS_DEVICE_ATTR(_name, _mode, _show, _store) \ |
224 | struct class_device_attribute class_device_attr_##_name = \ | 235 | struct class_device_attribute class_device_attr_##_name = \ |
225 | __ATTR(_name,_mode,_show,_store) | 236 | __ATTR(_name, _mode, _show, _store) |
226 | 237 | ||
227 | extern int __must_check class_device_create_file(struct class_device *, | 238 | extern int __must_check class_device_create_file(struct class_device *, |
228 | const struct class_device_attribute *); | 239 | const struct class_device_attribute *); |
@@ -255,26 +266,24 @@ struct class_device { | |||
255 | struct list_head node; | 266 | struct list_head node; |
256 | 267 | ||
257 | struct kobject kobj; | 268 | struct kobject kobj; |
258 | struct class * class; /* required */ | 269 | struct class *class; |
259 | dev_t devt; /* dev_t, creates the sysfs "dev" */ | 270 | dev_t devt; |
260 | struct device * dev; /* not necessary, but nice to have */ | 271 | struct device *dev; |
261 | void * class_data; /* class-specific data */ | 272 | void *class_data; |
262 | struct class_device *parent; /* parent of this child device, if there is one */ | 273 | struct class_device *parent; |
263 | struct attribute_group ** groups; /* optional groups */ | 274 | struct attribute_group **groups; |
264 | 275 | ||
265 | void (*release)(struct class_device *dev); | 276 | void (*release)(struct class_device *dev); |
266 | int (*uevent)(struct class_device *dev, struct kobj_uevent_env *env); | 277 | int (*uevent)(struct class_device *dev, struct kobj_uevent_env *env); |
267 | char class_id[BUS_ID_SIZE]; /* unique to this class */ | 278 | char class_id[BUS_ID_SIZE]; |
268 | }; | 279 | }; |
269 | 280 | ||
270 | static inline void * | 281 | static inline void *class_get_devdata(struct class_device *dev) |
271 | class_get_devdata (struct class_device *dev) | ||
272 | { | 282 | { |
273 | return dev->class_data; | 283 | return dev->class_data; |
274 | } | 284 | } |
275 | 285 | ||
276 | static inline void | 286 | static inline void class_set_devdata(struct class_device *dev, void *data) |
277 | class_set_devdata (struct class_device *dev, void *data) | ||
278 | { | 287 | { |
279 | dev->class_data = data; | 288 | dev->class_data = data; |
280 | } | 289 | } |
@@ -286,10 +295,10 @@ extern void class_device_initialize(struct class_device *); | |||
286 | extern int __must_check class_device_add(struct class_device *); | 295 | extern int __must_check class_device_add(struct class_device *); |
287 | extern void class_device_del(struct class_device *); | 296 | extern void class_device_del(struct class_device *); |
288 | 297 | ||
289 | extern struct class_device * class_device_get(struct class_device *); | 298 | extern struct class_device *class_device_get(struct class_device *); |
290 | extern void class_device_put(struct class_device *); | 299 | extern void class_device_put(struct class_device *); |
291 | 300 | ||
292 | extern void class_device_remove_file(struct class_device *, | 301 | extern void class_device_remove_file(struct class_device *, |
293 | const struct class_device_attribute *); | 302 | const struct class_device_attribute *); |
294 | extern int __must_check class_device_create_bin_file(struct class_device *, | 303 | extern int __must_check class_device_create_bin_file(struct class_device *, |
295 | struct bin_attribute *); | 304 | struct bin_attribute *); |
@@ -316,7 +325,7 @@ extern struct class_device *class_device_create(struct class *cls, | |||
316 | dev_t devt, | 325 | dev_t devt, |
317 | struct device *device, | 326 | struct device *device, |
318 | const char *fmt, ...) | 327 | const char *fmt, ...) |
319 | __attribute__((format(printf,5,6))); | 328 | __attribute__((format(printf, 5, 6))); |
320 | extern void class_device_destroy(struct class *cls, dev_t devt); | 329 | extern void class_device_destroy(struct class *cls, dev_t devt); |
321 | 330 | ||
322 | /* | 331 | /* |
@@ -333,8 +342,8 @@ struct device_type { | |||
333 | struct attribute_group **groups; | 342 | struct attribute_group **groups; |
334 | int (*uevent)(struct device *dev, struct kobj_uevent_env *env); | 343 | int (*uevent)(struct device *dev, struct kobj_uevent_env *env); |
335 | void (*release)(struct device *dev); | 344 | void (*release)(struct device *dev); |
336 | int (*suspend)(struct device * dev, pm_message_t state); | 345 | int (*suspend)(struct device *dev, pm_message_t state); |
337 | int (*resume)(struct device * dev); | 346 | int (*resume)(struct device *dev); |
338 | }; | 347 | }; |
339 | 348 | ||
340 | /* interface for exporting device attributes */ | 349 | /* interface for exporting device attributes */ |
@@ -346,18 +355,19 @@ struct device_attribute { | |||
346 | const char *buf, size_t count); | 355 | const char *buf, size_t count); |
347 | }; | 356 | }; |
348 | 357 | ||
349 | #define DEVICE_ATTR(_name,_mode,_show,_store) \ | 358 | #define DEVICE_ATTR(_name, _mode, _show, _store) \ |
350 | struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store) | 359 | struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) |
351 | 360 | ||
352 | extern int __must_check device_create_file(struct device *device, | 361 | extern int __must_check device_create_file(struct device *device, |
353 | struct device_attribute * entry); | 362 | struct device_attribute *entry); |
354 | extern void device_remove_file(struct device * dev, struct device_attribute * attr); | 363 | extern void device_remove_file(struct device *dev, |
364 | struct device_attribute *attr); | ||
355 | extern int __must_check device_create_bin_file(struct device *dev, | 365 | extern int __must_check device_create_bin_file(struct device *dev, |
356 | struct bin_attribute *attr); | 366 | struct bin_attribute *attr); |
357 | extern void device_remove_bin_file(struct device *dev, | 367 | extern void device_remove_bin_file(struct device *dev, |
358 | struct bin_attribute *attr); | 368 | struct bin_attribute *attr); |
359 | extern int device_schedule_callback_owner(struct device *dev, | 369 | extern int device_schedule_callback_owner(struct device *dev, |
360 | void (*func)(struct device *), struct module *owner); | 370 | void (*func)(struct device *dev), struct module *owner); |
361 | 371 | ||
362 | /* This is a macro to avoid include problems with THIS_MODULE */ | 372 | /* This is a macro to avoid include problems with THIS_MODULE */ |
363 | #define device_schedule_callback(dev, func) \ | 373 | #define device_schedule_callback(dev, func) \ |
@@ -368,21 +378,21 @@ typedef void (*dr_release_t)(struct device *dev, void *res); | |||
368 | typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data); | 378 | typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data); |
369 | 379 | ||
370 | #ifdef CONFIG_DEBUG_DEVRES | 380 | #ifdef CONFIG_DEBUG_DEVRES |
371 | extern void * __devres_alloc(dr_release_t release, size_t size, gfp_t gfp, | 381 | extern void *__devres_alloc(dr_release_t release, size_t size, gfp_t gfp, |
372 | const char *name); | 382 | const char *name); |
373 | #define devres_alloc(release, size, gfp) \ | 383 | #define devres_alloc(release, size, gfp) \ |
374 | __devres_alloc(release, size, gfp, #release) | 384 | __devres_alloc(release, size, gfp, #release) |
375 | #else | 385 | #else |
376 | extern void * devres_alloc(dr_release_t release, size_t size, gfp_t gfp); | 386 | extern void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp); |
377 | #endif | 387 | #endif |
378 | extern void devres_free(void *res); | 388 | extern void devres_free(void *res); |
379 | extern void devres_add(struct device *dev, void *res); | 389 | extern void devres_add(struct device *dev, void *res); |
380 | extern void * devres_find(struct device *dev, dr_release_t release, | 390 | extern void *devres_find(struct device *dev, dr_release_t release, |
381 | dr_match_t match, void *match_data); | ||
382 | extern void * devres_get(struct device *dev, void *new_res, | ||
383 | dr_match_t match, void *match_data); | 391 | dr_match_t match, void *match_data); |
384 | extern void * devres_remove(struct device *dev, dr_release_t release, | 392 | extern void *devres_get(struct device *dev, void *new_res, |
385 | dr_match_t match, void *match_data); | 393 | dr_match_t match, void *match_data); |
394 | extern void *devres_remove(struct device *dev, dr_release_t release, | ||
395 | dr_match_t match, void *match_data); | ||
386 | extern int devres_destroy(struct device *dev, dr_release_t release, | 396 | extern int devres_destroy(struct device *dev, dr_release_t release, |
387 | dr_match_t match, void *match_data); | 397 | dr_match_t match, void *match_data); |
388 | 398 | ||
@@ -399,7 +409,7 @@ extern void devm_kfree(struct device *dev, void *p); | |||
399 | 409 | ||
400 | struct device { | 410 | struct device { |
401 | struct klist klist_children; | 411 | struct klist klist_children; |
402 | struct klist_node knode_parent; /* node in sibling list */ | 412 | struct klist_node knode_parent; /* node in sibling list */ |
403 | struct klist_node knode_driver; | 413 | struct klist_node knode_driver; |
404 | struct klist_node knode_bus; | 414 | struct klist_node knode_bus; |
405 | struct device *parent; | 415 | struct device *parent; |
@@ -414,7 +424,7 @@ struct device { | |||
414 | * its driver. | 424 | * its driver. |
415 | */ | 425 | */ |
416 | 426 | ||
417 | struct bus_type * bus; /* type of bus device is on */ | 427 | struct bus_type *bus; /* type of bus device is on */ |
418 | struct device_driver *driver; /* which driver has allocated this | 428 | struct device_driver *driver; /* which driver has allocated this |
419 | device */ | 429 | device */ |
420 | void *driver_data; /* data private to the driver */ | 430 | void *driver_data; /* data private to the driver */ |
@@ -445,10 +455,10 @@ struct device { | |||
445 | /* class_device migration path */ | 455 | /* class_device migration path */ |
446 | struct list_head node; | 456 | struct list_head node; |
447 | struct class *class; | 457 | struct class *class; |
448 | dev_t devt; /* dev_t, creates the sysfs "dev" */ | 458 | dev_t devt; /* dev_t, creates the sysfs "dev" */ |
449 | struct attribute_group **groups; /* optional groups */ | 459 | struct attribute_group **groups; /* optional groups */ |
450 | 460 | ||
451 | void (*release)(struct device * dev); | 461 | void (*release)(struct device *dev); |
452 | }; | 462 | }; |
453 | 463 | ||
454 | #ifdef CONFIG_NUMA | 464 | #ifdef CONFIG_NUMA |
@@ -470,14 +480,12 @@ static inline void set_dev_node(struct device *dev, int node) | |||
470 | } | 480 | } |
471 | #endif | 481 | #endif |
472 | 482 | ||
473 | static inline void * | 483 | static inline void *dev_get_drvdata(struct device *dev) |
474 | dev_get_drvdata (struct device *dev) | ||
475 | { | 484 | { |
476 | return dev->driver_data; | 485 | return dev->driver_data; |
477 | } | 486 | } |
478 | 487 | ||
479 | static inline void | 488 | static inline void dev_set_drvdata(struct device *dev, void *data) |
480 | dev_set_drvdata (struct device *dev, void *data) | ||
481 | { | 489 | { |
482 | dev->driver_data = data; | 490 | dev->driver_data = data; |
483 | } | 491 | } |
@@ -492,15 +500,15 @@ void driver_init(void); | |||
492 | /* | 500 | /* |
493 | * High level routines for use by the bus drivers | 501 | * High level routines for use by the bus drivers |
494 | */ | 502 | */ |
495 | extern int __must_check device_register(struct device * dev); | 503 | extern int __must_check device_register(struct device *dev); |
496 | extern void device_unregister(struct device * dev); | 504 | extern void device_unregister(struct device *dev); |
497 | extern void device_initialize(struct device * dev); | 505 | extern void device_initialize(struct device *dev); |
498 | extern int __must_check device_add(struct device * dev); | 506 | extern int __must_check device_add(struct device *dev); |
499 | extern void device_del(struct device * dev); | 507 | extern void device_del(struct device *dev); |
500 | extern int device_for_each_child(struct device *, void *, | 508 | extern int device_for_each_child(struct device *dev, void *data, |
501 | int (*fn)(struct device *, void *)); | 509 | int (*fn)(struct device *dev, void *data)); |
502 | extern struct device *device_find_child(struct device *, void *data, | 510 | extern struct device *device_find_child(struct device *dev, void *data, |
503 | int (*match)(struct device *, void *)); | 511 | int (*match)(struct device *dev, void *data)); |
504 | extern int device_rename(struct device *dev, char *new_name); | 512 | extern int device_rename(struct device *dev, char *new_name); |
505 | extern int device_move(struct device *dev, struct device *new_parent); | 513 | extern int device_move(struct device *dev, struct device *new_parent); |
506 | 514 | ||
@@ -509,8 +517,8 @@ extern int device_move(struct device *dev, struct device *new_parent); | |||
509 | * for information on use. | 517 | * for information on use. |
510 | */ | 518 | */ |
511 | extern int __must_check device_bind_driver(struct device *dev); | 519 | extern int __must_check device_bind_driver(struct device *dev); |
512 | extern void device_release_driver(struct device * dev); | 520 | extern void device_release_driver(struct device *dev); |
513 | extern int __must_check device_attach(struct device * dev); | 521 | extern int __must_check device_attach(struct device *dev); |
514 | extern int __must_check driver_attach(struct device_driver *drv); | 522 | extern int __must_check driver_attach(struct device_driver *drv); |
515 | extern int __must_check device_reprobe(struct device *dev); | 523 | extern int __must_check device_reprobe(struct device *dev); |
516 | 524 | ||
@@ -519,8 +527,16 @@ extern int __must_check device_reprobe(struct device *dev); | |||
519 | */ | 527 | */ |
520 | extern struct device *device_create(struct class *cls, struct device *parent, | 528 | extern struct device *device_create(struct class *cls, struct device *parent, |
521 | dev_t devt, const char *fmt, ...) | 529 | dev_t devt, const char *fmt, ...) |
522 | __attribute__((format(printf,4,5))); | 530 | __attribute__((format(printf, 4, 5))); |
523 | extern void device_destroy(struct class *cls, dev_t devt); | 531 | extern void device_destroy(struct class *cls, dev_t devt); |
532 | #ifdef CONFIG_PM_SLEEP | ||
533 | extern void destroy_suspended_device(struct class *cls, dev_t devt); | ||
534 | #else /* !CONFIG_PM_SLEEP */ | ||
535 | static inline void destroy_suspended_device(struct class *cls, dev_t devt) | ||
536 | { | ||
537 | device_destroy(cls, devt); | ||
538 | } | ||
539 | #endif /* !CONFIG_PM_SLEEP */ | ||
524 | 540 | ||
525 | /* | 541 | /* |
526 | * Platform "fixup" functions - allow the platform to have their say | 542 | * Platform "fixup" functions - allow the platform to have their say |
@@ -528,17 +544,17 @@ extern void device_destroy(struct class *cls, dev_t devt); | |||
528 | * know about. | 544 | * know about. |
529 | */ | 545 | */ |
530 | /* Notify platform of device discovery */ | 546 | /* Notify platform of device discovery */ |
531 | extern int (*platform_notify)(struct device * dev); | 547 | extern int (*platform_notify)(struct device *dev); |
532 | 548 | ||
533 | extern int (*platform_notify_remove)(struct device * dev); | 549 | extern int (*platform_notify_remove)(struct device *dev); |
534 | 550 | ||
535 | 551 | ||
536 | /** | 552 | /** |
537 | * get_device - atomically increment the reference count for the device. | 553 | * get_device - atomically increment the reference count for the device. |
538 | * | 554 | * |
539 | */ | 555 | */ |
540 | extern struct device * get_device(struct device * dev); | 556 | extern struct device *get_device(struct device *dev); |
541 | extern void put_device(struct device * dev); | 557 | extern void put_device(struct device *dev); |
542 | 558 | ||
543 | 559 | ||
544 | /* drivers/base/power/shutdown.c */ | 560 | /* drivers/base/power/shutdown.c */ |
@@ -547,22 +563,33 @@ extern void device_shutdown(void); | |||
547 | /* drivers/base/sys.c */ | 563 | /* drivers/base/sys.c */ |
548 | extern void sysdev_shutdown(void); | 564 | extern void sysdev_shutdown(void); |
549 | 565 | ||
550 | |||
551 | /* drivers/base/firmware.c */ | ||
552 | extern int __must_check firmware_register(struct kset *); | ||
553 | extern void firmware_unregister(struct kset *); | ||
554 | |||
555 | /* debugging and troubleshooting/diagnostic helpers. */ | 566 | /* debugging and troubleshooting/diagnostic helpers. */ |
556 | extern const char *dev_driver_string(struct device *dev); | 567 | extern const char *dev_driver_string(struct device *dev); |
557 | #define dev_printk(level, dev, format, arg...) \ | 568 | #define dev_printk(level, dev, format, arg...) \ |
558 | printk(level "%s %s: " format , dev_driver_string(dev) , (dev)->bus_id , ## arg) | 569 | printk(level "%s %s: " format , dev_driver_string(dev) , \ |
570 | (dev)->bus_id , ## arg) | ||
571 | |||
572 | #define dev_emerg(dev, format, arg...) \ | ||
573 | dev_printk(KERN_EMERG , dev , format , ## arg) | ||
574 | #define dev_alert(dev, format, arg...) \ | ||
575 | dev_printk(KERN_ALERT , dev , format , ## arg) | ||
576 | #define dev_crit(dev, format, arg...) \ | ||
577 | dev_printk(KERN_CRIT , dev , format , ## arg) | ||
578 | #define dev_err(dev, format, arg...) \ | ||
579 | dev_printk(KERN_ERR , dev , format , ## arg) | ||
580 | #define dev_warn(dev, format, arg...) \ | ||
581 | dev_printk(KERN_WARNING , dev , format , ## arg) | ||
582 | #define dev_notice(dev, format, arg...) \ | ||
583 | dev_printk(KERN_NOTICE , dev , format , ## arg) | ||
584 | #define dev_info(dev, format, arg...) \ | ||
585 | dev_printk(KERN_INFO , dev , format , ## arg) | ||
559 | 586 | ||
560 | #ifdef DEBUG | 587 | #ifdef DEBUG |
561 | #define dev_dbg(dev, format, arg...) \ | 588 | #define dev_dbg(dev, format, arg...) \ |
562 | dev_printk(KERN_DEBUG , dev , format , ## arg) | 589 | dev_printk(KERN_DEBUG , dev , format , ## arg) |
563 | #else | 590 | #else |
564 | static inline int __attribute__ ((format (printf, 2, 3))) | 591 | static inline int __attribute__ ((format (printf, 2, 3))) |
565 | dev_dbg(struct device * dev, const char * fmt, ...) | 592 | dev_dbg(struct device *dev, const char *fmt, ...) |
566 | { | 593 | { |
567 | return 0; | 594 | return 0; |
568 | } | 595 | } |
@@ -572,21 +599,12 @@ dev_dbg(struct device * dev, const char * fmt, ...) | |||
572 | #define dev_vdbg dev_dbg | 599 | #define dev_vdbg dev_dbg |
573 | #else | 600 | #else |
574 | static inline int __attribute__ ((format (printf, 2, 3))) | 601 | static inline int __attribute__ ((format (printf, 2, 3))) |
575 | dev_vdbg(struct device * dev, const char * fmt, ...) | 602 | dev_vdbg(struct device *dev, const char *fmt, ...) |
576 | { | 603 | { |
577 | return 0; | 604 | return 0; |
578 | } | 605 | } |
579 | #endif | 606 | #endif |
580 | 607 | ||
581 | #define dev_err(dev, format, arg...) \ | ||
582 | dev_printk(KERN_ERR , dev , format , ## arg) | ||
583 | #define dev_info(dev, format, arg...) \ | ||
584 | dev_printk(KERN_INFO , dev , format , ## arg) | ||
585 | #define dev_warn(dev, format, arg...) \ | ||
586 | dev_printk(KERN_WARNING , dev , format , ## arg) | ||
587 | #define dev_notice(dev, format, arg...) \ | ||
588 | dev_printk(KERN_NOTICE , dev , format , ## arg) | ||
589 | |||
590 | /* Create alias, so I can be autoloaded. */ | 608 | /* Create alias, so I can be autoloaded. */ |
591 | #define MODULE_ALIAS_CHARDEV(major,minor) \ | 609 | #define MODULE_ALIAS_CHARDEV(major,minor) \ |
592 | MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor)) | 610 | MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor)) |