]>
Commit | Line | Data |
---|---|---|
1 | #include <linux/notifier.h> | |
2 | ||
3 | /** | |
4 | * struct subsys_private - structure to hold the private to the driver core portions of the bus_type/class structure. | |
5 | * | |
6 | * @subsys - the struct kset that defines this subsystem | |
7 | * @devices_kset - the subsystem's 'devices' directory | |
8 | * @interfaces - list of subsystem interfaces associated | |
9 | * @mutex - protect the devices, and interfaces lists. | |
10 | * | |
11 | * @drivers_kset - the list of drivers associated | |
12 | * @klist_devices - the klist to iterate over the @devices_kset | |
13 | * @klist_drivers - the klist to iterate over the @drivers_kset | |
14 | * @bus_notifier - the bus notifier list for anything that cares about things | |
15 | * on this bus. | |
16 | * @bus - pointer back to the struct bus_type that this structure is associated | |
17 | * with. | |
18 | * | |
19 | * @glue_dirs - "glue" directory to put in-between the parent device to | |
20 | * avoid namespace conflicts | |
21 | * @class - pointer back to the struct class that this structure is associated | |
22 | * with. | |
23 | * | |
24 | * This structure is the one that is the actual kobject allowing struct | |
25 | * bus_type/class to be statically allocated safely. Nothing outside of the | |
26 | * driver core should ever touch these fields. | |
27 | */ | |
28 | struct subsys_private { | |
29 | struct kset subsys; | |
30 | struct kset *devices_kset; | |
31 | struct list_head interfaces; | |
32 | struct mutex mutex; | |
33 | ||
34 | struct kset *drivers_kset; | |
35 | struct klist klist_devices; | |
36 | struct klist klist_drivers; | |
37 | struct blocking_notifier_head bus_notifier; | |
38 | unsigned int drivers_autoprobe:1; | |
39 | struct bus_type *bus; | |
40 | ||
41 | struct kset glue_dirs; | |
42 | struct class *class; | |
43 | }; | |
44 | #define to_subsys_private(obj) container_of(obj, struct subsys_private, subsys.kobj) | |
45 | ||
46 | struct driver_private { | |
47 | struct kobject kobj; | |
48 | struct klist klist_devices; | |
49 | struct klist_node knode_bus; | |
50 | struct module_kobject *mkobj; | |
51 | struct device_driver *driver; | |
52 | }; | |
53 | #define to_driver(obj) container_of(obj, struct driver_private, kobj) | |
54 | ||
55 | /** | |
56 | * struct device_private - structure to hold the private to the driver core portions of the device structure. | |
57 | * | |
58 | * @klist_children - klist containing all children of this device | |
59 | * @knode_parent - node in sibling list | |
60 | * @knode_driver - node in driver list | |
61 | * @knode_bus - node in bus list | |
62 | * @deferred_probe - entry in deferred_probe_list which is used to retry the | |
63 | * binding of drivers which were unable to get all the resources needed by | |
64 | * the device; typically because it depends on another driver getting | |
65 | * probed first. | |
66 | * @driver_data - private pointer for driver specific info. Will turn into a | |
67 | * list soon. | |
68 | * @device - pointer back to the struct class that this structure is | |
69 | * associated with. | |
70 | * | |
71 | * Nothing outside of the driver core should ever touch these fields. | |
72 | */ | |
73 | struct device_private { | |
74 | struct klist klist_children; | |
75 | struct klist_node knode_parent; | |
76 | struct klist_node knode_driver; | |
77 | struct klist_node knode_bus; | |
78 | struct list_head deferred_probe; | |
79 | void *driver_data; | |
80 | struct device *device; | |
81 | }; | |
82 | #define to_device_private_parent(obj) \ | |
83 | container_of(obj, struct device_private, knode_parent) | |
84 | #define to_device_private_driver(obj) \ | |
85 | container_of(obj, struct device_private, knode_driver) | |
86 | #define to_device_private_bus(obj) \ | |
87 | container_of(obj, struct device_private, knode_bus) | |
88 | ||
89 | extern int device_private_init(struct device *dev); | |
90 | ||
91 | /* initialisation functions */ | |
92 | extern int devices_init(void); | |
93 | extern int buses_init(void); | |
94 | extern int classes_init(void); | |
95 | extern int firmware_init(void); | |
96 | #ifdef CONFIG_SYS_HYPERVISOR | |
97 | extern int hypervisor_init(void); | |
98 | #else | |
99 | static inline int hypervisor_init(void) { return 0; } | |
100 | #endif | |
101 | extern int platform_bus_init(void); | |
102 | extern void cpu_dev_init(void); | |
103 | ||
104 | struct kobject *virtual_device_parent(struct device *dev); | |
105 | ||
106 | extern int bus_add_device(struct device *dev); | |
107 | extern void bus_probe_device(struct device *dev); | |
108 | extern void bus_remove_device(struct device *dev); | |
109 | ||
110 | extern int bus_add_driver(struct device_driver *drv); | |
111 | extern void bus_remove_driver(struct device_driver *drv); | |
112 | ||
113 | extern void driver_detach(struct device_driver *drv); | |
114 | extern int driver_probe_device(struct device_driver *drv, struct device *dev); | |
115 | extern void driver_deferred_probe_del(struct device *dev); | |
116 | static inline int driver_match_device(struct device_driver *drv, | |
117 | struct device *dev) | |
118 | { | |
119 | return drv->bus->match ? drv->bus->match(dev, drv) : 1; | |
120 | } | |
121 | ||
122 | extern int driver_add_groups(struct device_driver *drv, | |
123 | const struct attribute_group **groups); | |
124 | extern void driver_remove_groups(struct device_driver *drv, | |
125 | const struct attribute_group **groups); | |
126 | ||
127 | extern int device_add_groups(struct device *dev, | |
128 | const struct attribute_group **groups); | |
129 | extern void device_remove_groups(struct device *dev, | |
130 | const struct attribute_group **groups); | |
131 | ||
132 | extern char *make_class_name(const char *name, struct kobject *kobj); | |
133 | ||
134 | extern int devres_release_all(struct device *dev); | |
135 | ||
136 | /* /sys/devices directory */ | |
137 | extern struct kset *devices_kset; | |
138 | ||
139 | #if defined(CONFIG_MODULES) && defined(CONFIG_SYSFS) | |
140 | extern void module_add_driver(struct module *mod, struct device_driver *drv); | |
141 | extern void module_remove_driver(struct device_driver *drv); | |
142 | #else | |
143 | static inline void module_add_driver(struct module *mod, | |
144 | struct device_driver *drv) { } | |
145 | static inline void module_remove_driver(struct device_driver *drv) { } | |
146 | #endif | |
147 | ||
148 | #ifdef CONFIG_DEVTMPFS | |
149 | extern int devtmpfs_init(void); | |
150 | #else | |
151 | static inline int devtmpfs_init(void) { return 0; } | |
152 | #endif |