public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [patch 1/16] s390: klist bus_find_device & driver_find_device callback.
@ 2005-06-21 16:22 Martin Schwidefsky
  2005-06-22  6:26 ` Greg KH
  2005-06-22  8:11 ` [patch 1/16] s390: klist bus_find_device & driver_find_device callback Christoph Hellwig
  0 siblings, 2 replies; 9+ messages in thread
From: Martin Schwidefsky @ 2005-06-21 16:22 UTC (permalink / raw)
  To: akpm, mochel, gregkh, cohuck, linux-kernel

[patch 1/16] s390: klist bus_find_device & driver_find_device callback.

From: Cornelia Huck <cohuck@de.ibm.com>

Add bus_find_device() and driver_find_device() which allow a callback for each
device in the bus's resp. the driver's klist.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

diffstat:
 drivers/base/bus.c     |   31 +++++++++++++++++++++++++++++++
 drivers/base/driver.c  |   34 ++++++++++++++++++++++++++++++++++
 include/linux/device.h |    7 +++++++
 3 files changed, 72 insertions(+)

diff -urpN linux-2.6/drivers/base/bus.c linux-2.6-patched/drivers/base/bus.c
--- linux-2.6/drivers/base/bus.c	2005-06-21 17:36:38.000000000 +0200
+++ linux-2.6-patched/drivers/base/bus.c	2005-06-21 17:36:45.000000000 +0200
@@ -177,6 +177,37 @@ int bus_for_each_dev(struct bus_type * b
 	return error;
 }
 
+/**
+ * bus_find_device - device iterator for locating a particular device.
+ * @bus: bus type
+ * @start: Device to begin with
+ * @data: Data to pass to match function
+ * @match: Callback function to check device
+ *
+ * This is similar to the bus_for_each_dev() function above, but it
+ * returns a pointer to a device that is 'found', as determined
+ * by the @match callback. The callback should return a bool - 0 if
+ * the device doesn't match and 1 if it does.
+ * The function will return if a device is found.
+ */
+
+struct device * bus_find_device(struct bus_type * bus, struct device * start,
+				void * data, int (*match)(struct device *, void *))
+{
+	struct klist_iter i;
+	struct device * dev;
+
+	if (!bus)
+		return NULL;
+
+	klist_iter_init_node(&bus->klist_devices, &i,
+			     (start ? &start->knode_bus : NULL));
+	while ((dev = next_device(&i)))
+		if (match(dev, data))
+			break;
+	klist_iter_exit(&i);
+	return dev;
+}
 
 
 static struct device_driver * next_driver(struct klist_iter * i)
diff -urpN linux-2.6/drivers/base/driver.c linux-2.6-patched/drivers/base/driver.c
--- linux-2.6/drivers/base/driver.c	2005-06-21 17:36:38.000000000 +0200
+++ linux-2.6-patched/drivers/base/driver.c	2005-06-21 17:36:45.000000000 +0200
@@ -56,6 +56,40 @@ EXPORT_SYMBOL_GPL(driver_for_each_device
 
 
 /**
+ * driver_find_device - device iterator for locating a particular device.
+ * @driver: The device's driver
+ * @start: Device to begin with
+ * @data: Data to pass to match function
+ * @match: Callback function to check device
+ *
+ * This is similar to the driver_for_each_device() function above, but it
+ * returns a pointer to a device that is 'found', as determined
+ * by the @match callback. The callback should return a bool - 0 if
+ * the device doesn't match and 1 if it does.
+ * The function will return if a device is found.
+ */
+
+struct device * driver_find_device(struct device_driver *drv,
+				   struct device * start, void * data,
+				   int (*match)(struct device *, void *))
+{
+	struct klist_iter i;
+	struct device * dev;
+
+	if (!drv)
+		return NULL;
+
+	klist_iter_init_node(&drv->klist_devices, &i,
+			     (start ? &start->knode_driver : NULL));
+	while ((dev = next_device(&i)))
+		if (match(dev, data))
+			break;
+	klist_iter_exit(&i);
+	return dev;
+}
+
+
+/**
  *	driver_create_file - create sysfs file for driver.
  *	@drv:	driver.
  *	@attr:	driver attribute descriptor.
diff -urpN linux-2.6/include/linux/device.h linux-2.6-patched/include/linux/device.h
--- linux-2.6/include/linux/device.h	2005-06-21 17:36:39.000000000 +0200
+++ linux-2.6-patched/include/linux/device.h	2005-06-21 17:36:45.000000000 +0200
@@ -81,6 +81,9 @@ extern struct bus_type * find_bus(char *
 int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data,
 		     int (*fn)(struct device *, void *));
 
+struct device *  bus_find_device(struct bus_type * bus, struct device * start,
+				 void * data, int (*match)(struct device *, void *));
+
 int bus_for_each_drv(struct bus_type * bus, struct device_driver * start, 
 		     void * data, int (*fn)(struct device_driver *, void *));
 
@@ -143,6 +146,10 @@ extern void driver_remove_file(struct de
 extern int driver_for_each_device(struct device_driver * drv, struct device * start,
 				  void * data, int (*fn)(struct device *, void *));
 
+struct device *  driver_find_device(struct device_driver * drv,
+				    struct device * start, void * data,
+				    int (*match)(struct device *, void *));
+
 
 /*
  * device classes

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2005-06-22 15:04 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-06-21 16:22 [patch 1/16] s390: klist bus_find_device & driver_find_device callback Martin Schwidefsky
2005-06-22  6:26 ` Greg KH
2005-06-22  7:48   ` Cornelia Huck
2005-06-22  8:14     ` Greg KH
2005-06-22 14:59       ` Cornelia Huck
2005-06-22 14:59       ` [patch 1/2] " Cornelia Huck
2005-06-22 14:59       ` [patch 2/2] s390: use klist in cio Cornelia Huck
2005-06-22  8:11 ` [patch 1/16] s390: klist bus_find_device & driver_find_device callback Christoph Hellwig
2005-06-22  8:19   ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox