Commit 7ae31482 authored by Jean Delvare's avatar Jean Delvare Committed by Jean Delvare

i2c: Export i2c_for_each_dev

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: default avatarJean Delvare <khali@linux-fr.org>
parent 0c31f8e5
...@@ -1091,6 +1091,18 @@ EXPORT_SYMBOL(i2c_del_adapter); ...@@ -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) static int __process_new_driver(struct device *dev, void *data)
{ {
if (dev->type != &i2c_adapter_type) if (dev->type != &i2c_adapter_type)
...@@ -1134,9 +1146,7 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver) ...@@ -1134,9 +1146,7 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
INIT_LIST_HEAD(&driver->clients); INIT_LIST_HEAD(&driver->clients);
/* Walk the adapters that are already present */ /* Walk the adapters that are already present */
mutex_lock(&core_lock); i2c_for_each_dev(driver, __process_new_driver);
bus_for_each_dev(&i2c_bus_type, NULL, driver, __process_new_driver);
mutex_unlock(&core_lock);
return 0; return 0;
} }
...@@ -1156,9 +1166,7 @@ static int __process_removed_driver(struct device *dev, void *data) ...@@ -1156,9 +1166,7 @@ static int __process_removed_driver(struct device *dev, void *data)
*/ */
void i2c_del_driver(struct i2c_driver *driver) void i2c_del_driver(struct i2c_driver *driver)
{ {
mutex_lock(&core_lock); i2c_for_each_dev(driver, __process_removed_driver);
bus_for_each_dev(&i2c_bus_type, NULL, driver, __process_removed_driver);
mutex_unlock(&core_lock);
driver_unregister(&driver->driver); driver_unregister(&driver->driver);
pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name); pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);
......
...@@ -395,6 +395,8 @@ i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) ...@@ -395,6 +395,8 @@ i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter)
return NULL; return NULL;
} }
int i2c_for_each_dev(void *data, int (*fn)(struct device *, void *));
/* Adapter locking functions, exported for shared pin cases */ /* Adapter locking functions, exported for shared pin cases */
void i2c_lock_adapter(struct i2c_adapter *); void i2c_lock_adapter(struct i2c_adapter *);
void i2c_unlock_adapter(struct i2c_adapter *); void i2c_unlock_adapter(struct i2c_adapter *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment