Commit fae3cd00 authored by mochel@digitalimplant.org's avatar mochel@digitalimplant.org Committed by Greg Kroah-Hartman

[PATCH] Add driver_for_each_device().

Now there's an iterator for accessing each device bound to a driver.
Signed-off-by: default avatarPatrick Mochel <mochel@digitalimplant.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>

Index: linux-2.6.12-rc2/drivers/base/driver.c
===================================================================
parent 07e4a3e2
...@@ -18,6 +18,41 @@ ...@@ -18,6 +18,41 @@
#define to_dev(node) container_of(node, struct device, driver_list) #define to_dev(node) container_of(node, struct device, driver_list)
#define to_drv(obj) container_of(obj, struct device_driver, kobj) #define to_drv(obj) container_of(obj, struct device_driver, kobj)
/**
* driver_for_each_device - Iterator for devices bound to a driver.
* @drv: Driver we're iterating.
* @data: Data to pass to the callback.
* @fn: Function to call for each device.
*
* Take the bus's rwsem and iterate over the @drv's list of devices,
* calling @fn for each one.
*/
int driver_for_each_device(struct device_driver * drv, struct device * start,
void * data, int (*fn)(struct device *, void *))
{
struct list_head * head;
struct device * dev;
int error = 0;
down_read(&drv->bus->subsys.rwsem);
head = &drv->devices;
dev = list_prepare_entry(start, head, driver_list);
list_for_each_entry_continue(dev, head, driver_list) {
get_device(dev);
error = fn(dev, data);
put_device(dev);
if (error)
break;
}
up_read(&drv->bus->subsys.rwsem);
return error;
}
EXPORT_SYMBOL(driver_for_each_device);
/** /**
* driver_create_file - create sysfs file for driver. * driver_create_file - create sysfs file for driver.
* @drv: driver. * @drv: driver.
......
...@@ -136,6 +136,9 @@ struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store) ...@@ -136,6 +136,9 @@ struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store)
extern int driver_create_file(struct device_driver *, struct driver_attribute *); extern int driver_create_file(struct device_driver *, struct driver_attribute *);
extern void driver_remove_file(struct device_driver *, struct driver_attribute *); extern void driver_remove_file(struct device_driver *, struct driver_attribute *);
extern int driver_for_each_device(struct device_driver * drv, struct device * start,
void * data, int (*fn)(struct device *, void *));
/* /*
* device classes * device classes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment