summaryrefslogtreecommitdiff
path: root/drivers/base/driver.c
diff options
context:
space:
mode:
authormochel@digitalimplant.org <mochel@digitalimplant.org>2005-03-21 10:59:56 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2005-06-20 15:15:13 -0700
commitfae3cd00255e3e51ffd59fedb1bdb91ec96be395 (patch)
tree59e56a65f4b01f496436bd9b0720737ce1937db4 /drivers/base/driver.c
parent07e4a3e27fe414980ddc85a358e5a56abc48b363 (diff)
downloadlinux-3.10-fae3cd00255e3e51ffd59fedb1bdb91ec96be395.tar.gz
linux-3.10-fae3cd00255e3e51ffd59fedb1bdb91ec96be395.tar.bz2
linux-3.10-fae3cd00255e3e51ffd59fedb1bdb91ec96be395.zip
[PATCH] Add driver_for_each_device().
Now there's an iterator for accessing each device bound to a driver. Signed-off-by: Patrick Mochel <mochel@digitalimplant.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> Index: linux-2.6.12-rc2/drivers/base/driver.c ===================================================================
Diffstat (limited to 'drivers/base/driver.c')
-rw-r--r--drivers/base/driver.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 3b269f7e521..484fed1985a 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -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.