Rev 847 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
847 | giacomo | 1 | /* |
2 | * device.h - generic, centralized driver model |
||
3 | * |
||
4 | * Copyright (c) 2001-2003 Patrick Mochel <mochel@osdl.org> |
||
5 | * |
||
6 | * This file is released under the GPLv2 |
||
7 | * |
||
8 | * See Documentation/driver-model/ for more information. |
||
9 | */ |
||
10 | |||
11 | #ifndef _DEVICE_H_ |
||
12 | #define _DEVICE_H_ |
||
13 | |||
14 | #include <linux/config.h> |
||
15 | #include <linux/ioport.h> |
||
16 | #include <linux/kobject.h> |
||
17 | #include <linux/list.h> |
||
18 | #include <linux/spinlock.h> |
||
19 | #include <linux/types.h> |
||
20 | #include <linux/ioport.h> |
||
21 | #include <linux/module.h> |
||
22 | #include <linux/pm.h> |
||
23 | #include <asm/semaphore.h> |
||
24 | #include <asm/atomic.h> |
||
25 | |||
26 | #define DEVICE_NAME_SIZE 50 |
||
27 | #define DEVICE_NAME_HALF __stringify(20) /* Less than half to accommodate slop */ |
||
28 | #define DEVICE_ID_SIZE 32 |
||
29 | #define BUS_ID_SIZE KOBJ_NAME_LEN |
||
30 | |||
31 | |||
32 | enum { |
||
33 | SUSPEND_NOTIFY, |
||
34 | SUSPEND_SAVE_STATE, |
||
35 | SUSPEND_DISABLE, |
||
36 | SUSPEND_POWER_DOWN, |
||
37 | }; |
||
38 | |||
39 | enum { |
||
40 | RESUME_POWER_ON, |
||
41 | RESUME_RESTORE_STATE, |
||
42 | RESUME_ENABLE, |
||
43 | }; |
||
44 | |||
45 | struct device; |
||
46 | struct device_driver; |
||
47 | struct class; |
||
48 | struct class_device; |
||
49 | |||
50 | struct bus_type { |
||
51 | char * name; |
||
52 | |||
53 | struct subsystem subsys; |
||
54 | struct kset drivers; |
||
55 | struct kset devices; |
||
56 | |||
57 | int (*match)(struct device * dev, struct device_driver * drv); |
||
58 | struct device * (*add) (struct device * parent, char * bus_id); |
||
59 | int (*hotplug) (struct device *dev, char **envp, |
||
60 | int num_envp, char *buffer, int buffer_size); |
||
61 | int (*suspend)(struct device * dev, u32 state); |
||
62 | int (*resume)(struct device * dev); |
||
63 | }; |
||
64 | |||
65 | extern int bus_register(struct bus_type * bus); |
||
66 | extern void bus_unregister(struct bus_type * bus); |
||
67 | |||
68 | extern int bus_rescan_devices(struct bus_type * bus); |
||
69 | |||
70 | extern struct bus_type * get_bus(struct bus_type * bus); |
||
71 | extern void put_bus(struct bus_type * bus); |
||
72 | |||
73 | extern struct bus_type * find_bus(char * name); |
||
74 | |||
75 | /* iterator helpers for buses */ |
||
76 | |||
77 | int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data, |
||
78 | int (*fn)(struct device *, void *)); |
||
79 | |||
80 | int bus_for_each_drv(struct bus_type * bus, struct device_driver * start, |
||
81 | void * data, int (*fn)(struct device_driver *, void *)); |
||
82 | |||
83 | |||
84 | /* driverfs interface for exporting bus attributes */ |
||
85 | |||
86 | struct bus_attribute { |
||
87 | struct attribute attr; |
||
88 | ssize_t (*show)(struct bus_type *, char * buf); |
||
89 | ssize_t (*store)(struct bus_type *, const char * buf, size_t count); |
||
90 | }; |
||
91 | |||
92 | #define BUS_ATTR(_name,_mode,_show,_store) \ |
||
93 | struct bus_attribute bus_attr_##_name = { \ |
||
94 | .attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \ |
||
95 | .show = _show, \ |
||
96 | .store = _store, \ |
||
97 | }; |
||
98 | |||
99 | extern int bus_create_file(struct bus_type *, struct bus_attribute *); |
||
100 | extern void bus_remove_file(struct bus_type *, struct bus_attribute *); |
||
101 | |||
102 | struct device_driver { |
||
103 | char * name; |
||
104 | struct bus_type * bus; |
||
105 | |||
106 | struct semaphore unload_sem; |
||
107 | struct kobject kobj; |
||
108 | struct list_head devices; |
||
109 | |||
110 | int (*probe) (struct device * dev); |
||
111 | int (*remove) (struct device * dev); |
||
112 | void (*shutdown) (struct device * dev); |
||
113 | int (*suspend) (struct device * dev, u32 state, u32 level); |
||
114 | int (*resume) (struct device * dev, u32 level); |
||
115 | }; |
||
116 | |||
117 | |||
118 | extern int driver_register(struct device_driver * drv); |
||
119 | extern void driver_unregister(struct device_driver * drv); |
||
120 | |||
121 | extern struct device_driver * get_driver(struct device_driver * drv); |
||
122 | extern void put_driver(struct device_driver * drv); |
||
123 | |||
124 | |||
125 | /* driverfs interface for exporting driver attributes */ |
||
126 | |||
127 | struct driver_attribute { |
||
128 | struct attribute attr; |
||
129 | ssize_t (*show)(struct device_driver *, char * buf); |
||
130 | ssize_t (*store)(struct device_driver *, const char * buf, size_t count); |
||
131 | }; |
||
132 | |||
133 | #define DRIVER_ATTR(_name,_mode,_show,_store) \ |
||
134 | struct driver_attribute driver_attr_##_name = { \ |
||
135 | .attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \ |
||
136 | .show = _show, \ |
||
137 | .store = _store, \ |
||
138 | }; |
||
139 | |||
140 | extern int driver_create_file(struct device_driver *, struct driver_attribute *); |
||
141 | extern void driver_remove_file(struct device_driver *, struct driver_attribute *); |
||
142 | |||
143 | |||
144 | /* |
||
145 | * device classes |
||
146 | */ |
||
147 | struct class { |
||
148 | char * name; |
||
149 | |||
150 | struct subsystem subsys; |
||
151 | struct list_head children; |
||
152 | struct list_head interfaces; |
||
153 | |||
154 | int (*hotplug)(struct class_device *dev, char **envp, |
||
155 | int num_envp, char *buffer, int buffer_size); |
||
156 | |||
157 | void (*release)(struct class_device *dev); |
||
158 | }; |
||
159 | |||
160 | extern int class_register(struct class *); |
||
161 | extern void class_unregister(struct class *); |
||
162 | |||
163 | extern struct class * class_get(struct class *); |
||
164 | extern void class_put(struct class *); |
||
165 | |||
166 | |||
167 | struct class_attribute { |
||
168 | struct attribute attr; |
||
169 | ssize_t (*show)(struct class *, char * buf); |
||
170 | ssize_t (*store)(struct class *, const char * buf, size_t count); |
||
171 | }; |
||
172 | |||
173 | #define CLASS_ATTR(_name,_mode,_show,_store) \ |
||
174 | struct class_attribute class_attr_##_name = { \ |
||
175 | .attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \ |
||
176 | .show = _show, \ |
||
177 | .store = _store, \ |
||
178 | }; |
||
179 | |||
180 | extern int class_create_file(struct class *, const struct class_attribute *); |
||
181 | extern void class_remove_file(struct class *, const struct class_attribute *); |
||
182 | |||
183 | |||
184 | struct class_device { |
||
185 | struct list_head node; |
||
186 | |||
187 | struct kobject kobj; |
||
188 | struct class * class; /* required */ |
||
189 | struct device * dev; /* not necessary, but nice to have */ |
||
190 | void * class_data; /* class-specific data */ |
||
191 | |||
192 | char class_id[BUS_ID_SIZE]; /* unique to this class */ |
||
193 | }; |
||
194 | |||
195 | static inline void * |
||
196 | class_get_devdata (struct class_device *dev) |
||
197 | { |
||
198 | return dev->class_data; |
||
199 | } |
||
200 | |||
201 | static inline void |
||
202 | class_set_devdata (struct class_device *dev, void *data) |
||
203 | { |
||
204 | dev->class_data = data; |
||
205 | } |
||
206 | |||
207 | |||
208 | extern int class_device_register(struct class_device *); |
||
209 | extern void class_device_unregister(struct class_device *); |
||
210 | extern void class_device_initialize(struct class_device *); |
||
211 | extern int class_device_add(struct class_device *); |
||
212 | extern void class_device_del(struct class_device *); |
||
213 | |||
214 | extern int class_device_rename(struct class_device *, char *); |
||
215 | |||
216 | extern struct class_device * class_device_get(struct class_device *); |
||
217 | extern void class_device_put(struct class_device *); |
||
218 | |||
219 | struct class_device_attribute { |
||
220 | struct attribute attr; |
||
221 | ssize_t (*show)(struct class_device *, char * buf); |
||
222 | ssize_t (*store)(struct class_device *, const char * buf, size_t count); |
||
223 | }; |
||
224 | |||
225 | #define CLASS_DEVICE_ATTR(_name,_mode,_show,_store) \ |
||
226 | struct class_device_attribute class_device_attr_##_name = { \ |
||
227 | .attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \ |
||
228 | .show = _show, \ |
||
229 | .store = _store, \ |
||
230 | }; |
||
231 | |||
232 | extern int class_device_create_file(struct class_device *, |
||
233 | const struct class_device_attribute *); |
||
234 | extern void class_device_remove_file(struct class_device *, |
||
235 | const struct class_device_attribute *); |
||
236 | |||
237 | |||
238 | struct class_interface { |
||
239 | struct list_head node; |
||
240 | struct class *class; |
||
241 | |||
242 | int (*add) (struct class_device *); |
||
243 | void (*remove) (struct class_device *); |
||
244 | }; |
||
245 | |||
246 | extern int class_interface_register(struct class_interface *); |
||
247 | extern void class_interface_unregister(struct class_interface *); |
||
248 | |||
249 | |||
250 | struct device { |
||
251 | struct list_head node; /* node in sibling list */ |
||
252 | struct list_head bus_list; /* node in bus's list */ |
||
253 | struct list_head driver_list; |
||
254 | struct list_head children; |
||
255 | struct device * parent; |
||
256 | |||
257 | struct completion * complete; /* Notification for freeing device. */ |
||
258 | struct kobject kobj; |
||
259 | char bus_id[BUS_ID_SIZE]; /* position on parent bus */ |
||
260 | |||
261 | struct bus_type * bus; /* type of bus device is on */ |
||
262 | struct device_driver *driver; /* which driver has allocated this |
||
263 | device */ |
||
264 | void *driver_data; /* data private to the driver */ |
||
265 | void *platform_data; /* Platform specific data (e.g. ACPI, |
||
266 | BIOS data relevant to device) */ |
||
267 | struct dev_pm_info power; |
||
268 | u32 power_state; /* Current operating state. In |
||
269 | ACPI-speak, this is D0-D3, D0 |
||
270 | being fully functional, and D3 |
||
271 | being off. */ |
||
272 | |||
273 | unsigned char *saved_state; /* saved device state */ |
||
274 | u32 detach_state; /* State to enter when device is |
||
275 | detached from its driver. */ |
||
276 | |||
277 | u64 *dma_mask; /* dma mask (if dma'able device) */ |
||
278 | |||
279 | void (*release)(struct device * dev); |
||
280 | }; |
||
281 | |||
282 | static inline struct device * |
||
283 | list_to_dev(struct list_head *node) |
||
284 | { |
||
285 | return list_entry(node, struct device, node); |
||
286 | } |
||
287 | |||
288 | static inline void * |
||
289 | dev_get_drvdata (struct device *dev) |
||
290 | { |
||
291 | return dev->driver_data; |
||
292 | } |
||
293 | |||
294 | static inline void |
||
295 | dev_set_drvdata (struct device *dev, void *data) |
||
296 | { |
||
297 | dev->driver_data = data; |
||
298 | } |
||
299 | |||
300 | /* |
||
301 | * High level routines for use by the bus drivers |
||
302 | */ |
||
303 | extern int device_register(struct device * dev); |
||
304 | extern void device_unregister(struct device * dev); |
||
305 | extern void device_unregister_wait(struct device * dev); |
||
306 | extern void device_initialize(struct device * dev); |
||
307 | extern int device_add(struct device * dev); |
||
308 | extern void device_del(struct device * dev); |
||
309 | extern int device_for_each_child(struct device *, void *, |
||
310 | int (*fn)(struct device *, void *)); |
||
311 | |||
312 | /* |
||
313 | * Manual binding of a device to driver. See drivers/base/bus.c |
||
314 | * for information on use. |
||
315 | */ |
||
316 | extern void device_bind_driver(struct device * dev); |
||
317 | extern void device_release_driver(struct device * dev); |
||
318 | extern void driver_attach(struct device_driver * drv); |
||
319 | |||
320 | |||
321 | /* driverfs interface for exporting device attributes */ |
||
322 | |||
323 | struct device_attribute { |
||
324 | struct attribute attr; |
||
325 | ssize_t (*show)(struct device * dev, char * buf); |
||
326 | ssize_t (*store)(struct device * dev, const char * buf, size_t count); |
||
327 | }; |
||
328 | |||
329 | #define DEVICE_ATTR(_name,_mode,_show,_store) \ |
||
330 | struct device_attribute dev_attr_##_name = { \ |
||
331 | .attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE }, \ |
||
332 | .show = _show, \ |
||
333 | .store = _store, \ |
||
334 | }; |
||
335 | |||
336 | |||
337 | extern int device_create_file(struct device *device, struct device_attribute * entry); |
||
338 | extern void device_remove_file(struct device * dev, struct device_attribute * attr); |
||
339 | |||
340 | /* |
||
341 | * Platform "fixup" functions - allow the platform to have their say |
||
342 | * about devices and actions that the general device layer doesn't |
||
343 | * know about. |
||
344 | */ |
||
345 | /* Notify platform of device discovery */ |
||
346 | extern int (*platform_notify)(struct device * dev); |
||
347 | |||
348 | extern int (*platform_notify_remove)(struct device * dev); |
||
349 | |||
350 | |||
351 | /** |
||
352 | * get_device - atomically increment the reference count for the device. |
||
353 | * |
||
354 | */ |
||
355 | extern struct device * get_device(struct device * dev); |
||
356 | extern void put_device(struct device * dev); |
||
357 | |||
358 | |||
359 | /* drivers/base/platform.c */ |
||
360 | |||
361 | struct platform_device { |
||
362 | char * name; |
||
363 | u32 id; |
||
364 | struct device dev; |
||
365 | u32 num_resources; |
||
366 | struct resource * resource; |
||
367 | }; |
||
368 | |||
369 | #define to_platform_device(x) container_of((x), struct platform_device, dev) |
||
370 | |||
371 | extern int platform_device_register(struct platform_device *); |
||
372 | extern void platform_device_unregister(struct platform_device *); |
||
373 | |||
374 | extern struct bus_type platform_bus_type; |
||
375 | extern struct device legacy_bus; |
||
376 | |||
377 | /* drivers/base/power.c */ |
||
378 | extern void device_shutdown(void); |
||
379 | |||
380 | |||
381 | /* drivers/base/firmware.c */ |
||
382 | extern int firmware_register(struct subsystem *); |
||
383 | extern void firmware_unregister(struct subsystem *); |
||
384 | |||
385 | /* debugging and troubleshooting/diagnostic helpers. */ |
||
386 | #define dev_printk(level, dev, format, arg...) \ |
||
387 | printk(level "%s %s: " format , (dev)->driver->name , (dev)->bus_id , ## arg) |
||
388 | |||
389 | #ifdef DEBUG |
||
390 | #define dev_dbg(dev, format, arg...) \ |
||
391 | dev_printk(KERN_DEBUG , dev , format , ## arg) |
||
392 | #else |
||
393 | #define dev_dbg(dev, format, arg...) do {} while (0) |
||
394 | #endif |
||
395 | |||
396 | #ifdef DEBUG //** for shark usb |
||
397 | |||
398 | #define dev_err(dev, format, arg...) \ |
||
399 | dev_printk(KERN_ERR , dev , format , ## arg) |
||
400 | #define dev_info(dev, format, arg...) \ |
||
401 | dev_printk(KERN_INFO , dev , format , ## arg) |
||
402 | #define dev_warn(dev, format, arg...) \ |
||
403 | dev_printk(KERN_WARNING , dev , format , ## arg) |
||
404 | |||
405 | #else |
||
406 | |||
407 | #define dev_err(dev, format, arg...) |
||
408 | #define dev_info(dev, format, arg...) |
||
409 | #define dev_warn(dev, format, arg...) |
||
410 | |||
411 | #endif |
||
412 | |||
413 | /* Create alias, so I can be autoloaded. */ |
||
414 | #define MODULE_ALIAS_CHARDEV(major,minor) \ |
||
415 | MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor)) |
||
416 | #define MODULE_ALIAS_CHARDEV_MAJOR(major) \ |
||
417 | MODULE_ALIAS("char-major-" __stringify(major) "-*") |
||
418 | #endif /* _DEVICE_H_ */ |