lkml.org 
[lkml]   [2005]   [Jun]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] Add driver_for_each_device().
    Date
    From
    [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
    ===================================================================

    ---
    commit fae3cd00255e3e51ffd59fedb1bdb91ec96be395
    tree 59e56a65f4b01f496436bd9b0720737ce1937db4
    parent 07e4a3e27fe414980ddc85a358e5a56abc48b363
    author mochel@digitalimplant.org <mochel@digitalimplant.org> Mon, 21 Mar 2005 10:59:56 -0800
    committer Greg Kroah-Hartman <gregkh@suse.de> Mon, 20 Jun 2005 15:15:13 -0700

    drivers/base/driver.c | 35 +++++++++++++++++++++++++++++++++++
    include/linux/device.h | 3 +++
    2 files changed, 38 insertions(+), 0 deletions(-)

    diff --git a/drivers/base/driver.c b/drivers/base/driver.c
    --- 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.
    diff --git a/include/linux/device.h b/include/linux/device.h
    --- a/include/linux/device.h
    +++ b/include/linux/device.h
    @@ -136,6 +136,9 @@ struct driver_attribute driver_attr_##_n
    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
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-06-21 04:57    [W:0.025 / U:2.416 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site