From foo@baz Tue Apr 9 12:12:43 2002 To: Greg KH Date: 21 Mar 2005 10:59:56 -08:00 From: mochel@digitalimplant.org Subject: [driver core] Add driver_for_each_device(). Now there's an iterator for accessing each device bound to a driver. Signed-off-by: Patrick Mochel Signed-off-by: Greg Kroah-Hartman Index: linux-2.6.12-rc2/drivers/base/driver.c =================================================================== --- linux-2.6.12-rc2.orig/drivers/base/driver.c 2005-04-05 11:49:58.000000000 -0700 +++ linux-2.6.12-rc2/drivers/base/driver.c 2005-04-05 14:34:33.000000000 -0700 @@ -18,6 +18,41 @@ #define to_dev(node) container_of(node, struct device, driver_list) #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. * @drv: driver. Index: linux-2.6.12-rc2/include/linux/device.h =================================================================== --- linux-2.6.12-rc2.orig/include/linux/device.h 2005-04-05 14:33:58.000000000 -0700 +++ linux-2.6.12-rc2/include/linux/device.h 2005-04-05 14:34:33.000000000 -0700 @@ -136,6 +136,9 @@ extern int driver_create_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