Use class_for_each_device for iteration.
Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
---
drivers/i2c/i2c-core.c | 96 ++++++++++++++++++++++++++-----------------------
1 file changed, 52 insertions(+), 44 deletions(-)
diff -upr a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
--- a/drivers/i2c/i2c-core.c 2008-05-09 13:55:41.000000000 +0800
+++ b/drivers/i2c/i2c-core.c 2008-05-09 14:24:07.000000000 +0800
@@ -35,7 +35,6 @@
#include <linux/completion.h>
#include <linux/hardirq.h>
#include <linux/irqflags.h>
-#include <linux/semaphore.h>
#include <asm/uaccess.h>
#include "i2c-core.h"
@@ -655,6 +654,16 @@ EXPORT_SYMBOL(i2c_del_adapter);
/* ------------------------------------------------------------------------- */
+static int __attach_adapter(struct device *dev, void *data)
+{
+ struct i2c_adapter *adapter;
+ struct i2c_driver *driver = data;
+
+ adapter = container_of(dev, struct i2c_adapter, dev);
+ driver->attach_adapter(adapter);
+
+ return 0;
+}
/*
* An i2c_driver is used with one or more i2c_client (device) nodes to access
@@ -696,21 +705,52 @@ int i2c_register_driver(struct module *o
pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name);
/* legacy drivers scan i2c busses directly */
- if (driver->attach_adapter) {
- struct i2c_adapter *adapter;
+ if (driver->attach_adapter)
+ class_for_each_device(&i2c_adapter_class, driver,
+ __attach_adapter);
+
+ mutex_unlock(&core_lock);
+ return 0;
+}
+EXPORT_SYMBOL(i2c_register_driver);
+
+static int __detach_adapter(struct device *dev, void *data)
+{
+ struct list_head *item2, *_n;
+ struct i2c_client *client;
+ struct i2c_adapter *adap;
+ struct i2c_driver *driver = data;
- down(&i2c_adapter_class.sem);
- list_for_each_entry(adapter, &i2c_adapter_class.devices,
- dev.node) {
- driver->attach_adapter(adapter);
+ /* Have a look at each adapter, if clients of this driver
+ * are still attached. If so, detach them to be able to
+ ...