Rev 422 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 1 | /** |
2 | * System devices follow a slightly different driver model. |
||
3 | * They don't need to do dynammic driver binding, can't be probed, |
||
4 | * and don't reside on any type of peripheral bus. |
||
5 | * So, we represent and treat them a little differently. |
||
6 | * |
||
7 | * We still have a notion of a driver for a system device, because we still |
||
8 | * want to perform basic operations on these devices. |
||
9 | * |
||
10 | * We also support auxillary drivers binding to devices of a certain class. |
||
11 | * |
||
12 | * This allows configurable drivers to register themselves for devices of |
||
13 | * a certain type. And, it allows class definitions to reside in generic |
||
14 | * code while arch-specific code can register specific drivers. |
||
15 | * |
||
16 | * Auxillary drivers registered with a NULL cls are registered as drivers |
||
17 | * for all system devices, and get notification calls for each device. |
||
18 | */ |
||
19 | |||
20 | |||
21 | #ifndef _SYSDEV_H_ |
||
22 | #define _SYSDEV_H_ |
||
23 | |||
24 | #include <linux/kobject.h> |
||
25 | |||
26 | |||
27 | struct sys_device; |
||
28 | |||
29 | struct sysdev_class { |
||
30 | struct list_head drivers; |
||
31 | |||
32 | /* Default operations for these types of devices */ |
||
33 | int (*shutdown)(struct sys_device *); |
||
34 | int (*suspend)(struct sys_device *, u32 state); |
||
35 | int (*resume)(struct sys_device *); |
||
36 | struct kset kset; |
||
37 | }; |
||
38 | |||
39 | |||
40 | extern int sysdev_class_register(struct sysdev_class *); |
||
41 | extern void sysdev_class_unregister(struct sysdev_class *); |
||
42 | |||
43 | |||
44 | /** |
||
45 | * Auxillary system device drivers. |
||
46 | */ |
||
47 | |||
48 | struct sysdev_driver { |
||
49 | struct list_head entry; |
||
50 | int (*add)(struct sys_device *); |
||
51 | int (*remove)(struct sys_device *); |
||
52 | int (*shutdown)(struct sys_device *); |
||
53 | int (*suspend)(struct sys_device *, u32 state); |
||
54 | int (*resume)(struct sys_device *); |
||
55 | }; |
||
56 | |||
57 | |||
58 | extern int sysdev_driver_register(struct sysdev_class *, struct sysdev_driver *); |
||
59 | extern void sysdev_driver_unregister(struct sysdev_class *, struct sysdev_driver *); |
||
60 | |||
61 | |||
62 | /** |
||
63 | * sys_devices can be simplified a lot from regular devices, because they're |
||
64 | * simply not as versatile. |
||
65 | */ |
||
66 | |||
67 | struct sys_device { |
||
68 | u32 id; |
||
69 | struct sysdev_class * cls; |
||
70 | struct kobject kobj; |
||
71 | }; |
||
72 | |||
73 | extern int sys_device_register(struct sys_device *); |
||
74 | extern void sys_device_unregister(struct sys_device *); |
||
75 | |||
76 | |||
77 | struct sysdev_attribute { |
||
78 | struct attribute attr; |
||
79 | ssize_t (*show)(struct sys_device *, char *); |
||
80 | ssize_t (*store)(struct sys_device *, const char *, size_t); |
||
81 | }; |
||
82 | |||
83 | |||
84 | #define SYSDEV_ATTR(_name,_mode,_show,_store) \ |
||
85 | struct sysdev_attribute attr_##_name = { \ |
||
86 | .attr = {.name = __stringify(_name), .mode = _mode }, \ |
||
87 | .show = _show, \ |
||
88 | .store = _store, \ |
||
89 | }; |
||
90 | |||
91 | extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *); |
||
92 | extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *); |
||
93 | |||
94 | #endif /* _SYSDEV_H_ */ |