aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base/driver.c')
-rw-r--r--drivers/base/driver.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 3b269f7e5213..1b645886e9eb 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -18,6 +18,43 @@
18#define to_dev(node) container_of(node, struct device, driver_list) 18#define to_dev(node) container_of(node, struct device, driver_list)
19#define to_drv(obj) container_of(obj, struct device_driver, kobj) 19#define to_drv(obj) container_of(obj, struct device_driver, kobj)
20 20
21
22static struct device * next_device(struct klist_iter * i)
23{
24 struct klist_node * n = klist_next(i);
25 return n ? container_of(n, struct device, knode_driver) : NULL;
26}
27
28/**
29 * driver_for_each_device - Iterator for devices bound to a driver.
30 * @drv: Driver we're iterating.
31 * @data: Data to pass to the callback.
32 * @fn: Function to call for each device.
33 *
34 * Iterate over the @drv's list of devices calling @fn for each one.
35 */
36
37int driver_for_each_device(struct device_driver * drv, struct device * start,
38 void * data, int (*fn)(struct device *, void *))
39{
40 struct klist_iter i;
41 struct device * dev;
42 int error = 0;
43
44 if (!drv)
45 return -EINVAL;
46
47 klist_iter_init_node(&drv->klist_devices, &i,
48 start ? &start->knode_driver : NULL);
49 while ((dev = next_device(&i)) && !error)
50 error = fn(dev, data);
51 klist_iter_exit(&i);
52 return error;
53}
54
55EXPORT_SYMBOL_GPL(driver_for_each_device);
56
57
21/** 58/**
22 * driver_create_file - create sysfs file for driver. 59 * driver_create_file - create sysfs file for driver.
23 * @drv: driver. 60 * @drv: driver.
@@ -85,7 +122,7 @@ void put_driver(struct device_driver * drv)
85 */ 122 */
86int driver_register(struct device_driver * drv) 123int driver_register(struct device_driver * drv)
87{ 124{
88 INIT_LIST_HEAD(&drv->devices); 125 klist_init(&drv->klist_devices);
89 init_completion(&drv->unloaded); 126 init_completion(&drv->unloaded);
90 return bus_add_driver(drv); 127 return bus_add_driver(drv);
91} 128}