Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fae3cd00 authored by Patrick Mochel's avatar Patrick Mochel Committed by Greg Kroah-Hartman
Browse files

[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
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -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.
+3 −0
Original line number Diff line number Diff line
@@ -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 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