[i2c] [patch 2.6.21-rc3-git +i2c 3/4] remove i2c_adapter.list
David Brownell
david-b at pacbell.net
Mon Mar 12 19:38:03 CET 2007
Remove some more duplication in i2c core: i2c_adapter.list has the
same members as i2c_adapter_class.devices; the former should vanish.
Signed-off-by: David Brownell <dbrownell at users.sourceforge.net>
---
Not tested much at all ...
drivers/i2c/i2c-core.c | 19 +++++--------------
include/linux/i2c.h | 1 -
2 files changed, 5 insertions(+), 15 deletions(-)
Index: at91/include/linux/i2c.h
===================================================================
--- at91.orig/include/linux/i2c.h 2007-03-12 11:06:29.000000000 -0700
+++ at91/include/linux/i2c.h 2007-03-12 11:16:09.000000000 -0700
@@ -305,7 +305,6 @@ struct i2c_adapter {
int nr;
struct list_head clients;
- struct list_head list;
char name[50];
struct completion dev_released;
};
Index: at91/drivers/i2c/i2c-core.c
===================================================================
--- at91.orig/drivers/i2c/i2c-core.c 2007-03-12 11:09:05.000000000 -0700
+++ at91/drivers/i2c/i2c-core.c 2007-03-12 11:17:01.000000000 -0700
@@ -38,7 +38,6 @@
#include "i2c-core.h"
-static LIST_HEAD(adapters);
static LIST_HEAD(drivers);
static DEFINE_MUTEX(core_lists);
static DEFINE_IDR(i2c_adapter_idr);
@@ -335,7 +334,6 @@ static int i2c_register_adapter(struct i
INIT_LIST_HEAD(&adap->clients);
mutex_lock(&core_lists);
- list_add_tail(&adap->list, &adapters);
/* Add the adapter to the driver core.
* If the parent pointer is not set up,
@@ -373,7 +371,6 @@ out_unlock:
return res;
out_list:
- list_del(&adap->list);
idr_remove(&i2c_adapter_idr, adap->nr);
goto out_unlock;
}
@@ -468,7 +465,6 @@ EXPORT_SYMBOL_GPL(i2c_add_numbered_adapt
int i2c_del_adapter(struct i2c_adapter *adap)
{
struct list_head *item, *_n;
- struct i2c_adapter *adap_from_list;
struct i2c_driver *driver;
struct i2c_client *client;
int res = 0;
@@ -476,11 +472,7 @@ int i2c_del_adapter(struct i2c_adapter *
mutex_lock(&core_lists);
/* First make sure that this adapter was ever added */
- list_for_each_entry(adap_from_list, &adapters, list) {
- if (adap_from_list == adap)
- break;
- }
- if (adap_from_list != adap) {
+ if (idr_find(&i2c_adapter_idr, adap->id) != adap) {
pr_debug("i2c-core: attempting to delete unregistered "
"adapter [%s]\n", adap->name);
res = -EINVAL;
@@ -526,7 +518,6 @@ int i2c_del_adapter(struct i2c_adapter *
/* clean up the sysfs representation */
init_completion(&adap->dev_released);
device_unregister(&adap->dev);
- list_del(&adap->list);
/* wait for sysfs to drop all references */
wait_for_completion(&adap->dev_released);
@@ -588,7 +579,8 @@ int i2c_register_driver(struct module *o
struct i2c_adapter *adapter;
mutex_lock(&core_lists);
- list_for_each_entry(adapter, &adapters, list) {
+ list_for_each_entry(adapter, &i2c_adapter_class.devices,
+ dev.node) {
driver->attach_adapter(adapter);
}
mutex_unlock(&core_lists);
@@ -604,7 +596,7 @@ EXPORT_SYMBOL(i2c_register_driver);
*/
int i2c_del_driver(struct i2c_driver *driver)
{
- struct list_head *item1, *item2, *_n;
+ struct list_head *item2, *_n;
struct i2c_client *client;
struct i2c_adapter *adap;
@@ -620,8 +612,7 @@ int i2c_del_driver(struct i2c_driver *dr
* attached. If so, detach them to be able to kill the driver
* afterwards.
*/
- list_for_each(item1,&adapters) {
- adap = list_entry(item1, struct i2c_adapter, list);
+ list_for_each_entry(adap, &i2c_adapter_class.devices, dev.node) {
if (driver->detach_adapter) {
if ((res = driver->detach_adapter(adap))) {
dev_err(&adap->dev, "detach_adapter failed "
More information about the i2c
mailing list