i2c: Export i2c_for_each_dev
authorJean Delvare <khali@linux-fr.org>
Sun, 20 Mar 2011 13:50:52 +0000 (14:50 +0100)
committerJean Delvare <khali@endymion.delvare>
Sun, 20 Mar 2011 13:50:52 +0000 (14:50 +0100)
Introduce i2c_for_each_dev(), an i2c device iterator with proper
locking for use by i2c-dev. This is needed so that we can get rid of
the attach_adapter and detach_adapter legacy callback functions.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
drivers/i2c/i2c-core.c
include/linux/i2c.h

index f7620cada78206b35d55295888e76544b7b7eeab..b9fa1d0320b43f3d01bcd8282dec9ce0a16c09a1 100644 (file)
@@ -1091,6 +1091,18 @@ EXPORT_SYMBOL(i2c_del_adapter);
 
 /* ------------------------------------------------------------------------- */
 
+int i2c_for_each_dev(void *data, int (*fn)(struct device *, void *))
+{
+       int res;
+
+       mutex_lock(&core_lock);
+       res = bus_for_each_dev(&i2c_bus_type, NULL, data, fn);
+       mutex_unlock(&core_lock);
+
+       return res;
+}
+EXPORT_SYMBOL_GPL(i2c_for_each_dev);
+
 static int __process_new_driver(struct device *dev, void *data)
 {
        if (dev->type != &i2c_adapter_type)
@@ -1134,9 +1146,7 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
 
        INIT_LIST_HEAD(&driver->clients);
        /* Walk the adapters that are already present */
-       mutex_lock(&core_lock);
-       bus_for_each_dev(&i2c_bus_type, NULL, driver, __process_new_driver);
-       mutex_unlock(&core_lock);
+       i2c_for_each_dev(driver, __process_new_driver);
 
        return 0;
 }
@@ -1156,9 +1166,7 @@ static int __process_removed_driver(struct device *dev, void *data)
  */
 void i2c_del_driver(struct i2c_driver *driver)
 {
-       mutex_lock(&core_lock);
-       bus_for_each_dev(&i2c_bus_type, NULL, driver, __process_removed_driver);
-       mutex_unlock(&core_lock);
+       i2c_for_each_dev(driver, __process_removed_driver);
 
        driver_unregister(&driver->driver);
        pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);
index 3963a5567472929a06da4da07fb9f17d5af76809..4df12c7e69d7375a3631f317a271367d70782c03 100644 (file)
@@ -395,6 +395,8 @@ i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter)
                return NULL;
 }
 
+int i2c_for_each_dev(void *data, int (*fn)(struct device *, void *));
+
 /* Adapter locking functions, exported for shared pin cases */
 void i2c_lock_adapter(struct i2c_adapter *);
 void i2c_unlock_adapter(struct i2c_adapter *);