From: Dave Young <[EMAIL PROTECTED]>

Use class_for_each_device for iteration.

Signed-off-by: Dave Young <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
---

 drivers/i2c/i2c-core.c |   96 +++++++++++++++++++++------------------
 1 file changed, 52 insertions(+), 44 deletions(-)

diff -puN drivers/i2c/i2c-core.c~i2c-use-class_for_each_device 
drivers/i2c/i2c-core.c
--- a/drivers/i2c/i2c-core.c~i2c-use-class_for_each_device
+++ a/drivers/i2c/i2c-core.c
@@ -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"
@@ -657,6 +656,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
@@ -698,21 +707,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
+        * kill the driver afterwards.
+        */
+       adap = container_of(dev, struct i2c_adapter, dev);
+       if (driver->detach_adapter) {
+               if (driver->attach_adapter(adap))
+                       dev_err(&adap->dev, "detach_adapter failed "
+                                       "for driver [%s]\n",
+                                       driver->driver.name);
+       } else {
+               list_for_each_safe(item2, _n, &adap->clients) {
+                       client = list_entry(item2, struct i2c_client,
+                                       list);
+                       if (client->driver != driver)
+                               continue;
+                       dev_dbg(&adap->dev, "detaching client [%s] "
+                               "at 0x%02x\n", client->name,
+                               client->addr);
+                       if (driver->detach_client(client)) {
+                               dev_err(&adap->dev, "detach_client "
+                                       "failed for client [%s] at "
+                                       "0x%02x\n", client->name,
+                                       client->addr);
+                       }
                }
-               up(&i2c_adapter_class.sem);
        }
 
-       mutex_unlock(&core_lock);
        return 0;
 }
-EXPORT_SYMBOL(i2c_register_driver);
 
 /**
  * i2c_del_driver - unregister I2C driver
@@ -721,46 +761,14 @@ EXPORT_SYMBOL(i2c_register_driver);
  */
 void i2c_del_driver(struct i2c_driver *driver)
 {
-       struct list_head   *item2, *_n;
-       struct i2c_client  *client;
-       struct i2c_adapter *adap;
-
        mutex_lock(&core_lock);
 
        /* new-style driver? */
        if (is_newstyle_driver(driver))
                goto unregister;
 
-       /* Have a look at each adapter, if clients of this driver are still
-        * attached. If so, detach them to be able to kill the driver
-        * afterwards.
-        */
-       down(&i2c_adapter_class.sem);
-       list_for_each_entry(adap, &i2c_adapter_class.devices, dev.node) {
-               if (driver->detach_adapter) {
-                       if (driver->detach_adapter(adap)) {
-                               dev_err(&adap->dev, "detach_adapter failed "
-                                       "for driver [%s]\n",
-                                       driver->driver.name);
-                       }
-               } else {
-                       list_for_each_safe(item2, _n, &adap->clients) {
-                               client = list_entry(item2, struct i2c_client, 
list);
-                               if (client->driver != driver)
-                                       continue;
-                               dev_dbg(&adap->dev, "detaching client [%s] "
-                                       "at 0x%02x\n", client->name,
-                                       client->addr);
-                               if (driver->detach_client(client)) {
-                                       dev_err(&adap->dev, "detach_client "
-                                               "failed for client [%s] at "
-                                               "0x%02x\n", client->name,
-                                               client->addr);
-                               }
-                       }
-               }
-       }
-       up(&i2c_adapter_class.sem);
+       class_for_each_device(&i2c_adapter_class, driver,
+                               __detach_adapter);
 
  unregister:
        driver_unregister(&driver->driver);
_

_______________________________________________
i2c mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/i2c

Reply via email to