Merge by hand (conflicts in sr.c)
[powerpc.git] / drivers / i2c / i2c-core.c
index ecf43b1..4a9ead2 100644 (file)
@@ -156,7 +156,7 @@ int i2c_add_adapter(struct i2c_adapter *adap)
                goto out_unlock;
        }
 
-       res = idr_get_new(&i2c_adapter_idr, NULL, &id);
+       res = idr_get_new(&i2c_adapter_idr, adap, &id);
        if (res < 0) {
                if (res == -EAGAIN)
                        res = -ENOMEM;
@@ -231,14 +231,14 @@ int i2c_del_adapter(struct i2c_adapter *adap)
                if (driver->detach_adapter)
                        if ((res = driver->detach_adapter(adap))) {
                                dev_warn(&adap->dev, "can't detach adapter "
-                                        "while detaching driver %s: driver not "
-                                        "detached!", driver->name);
+                                        "while detaching driver %s: driver "
+                                        "not detached!\n", driver->name);
                                goto out_unlock;
                        }
        }
 
        /* detach any active clients. This must be done first, because
-        * it can fail; in which case we give upp. */
+        * it can fail; in which case we give up. */
        list_for_each_safe(item, _n, &adap->clients) {
                client = list_entry(item, struct i2c_client, list);
 
@@ -456,8 +456,8 @@ int i2c_detach_client(struct i2c_client *client)
                res = adapter->client_unregister(client);
                if (res) {
                        dev_err(&client->dev,
-                              "client_unregister [%s] failed, "
-                              "client not detached", client->name);
+                               "client_unregister [%s] failed, "
+                               "client not detached\n", client->name);
                        goto out;
                }
        }
@@ -611,27 +611,16 @@ int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
        struct i2c_adapter *adap=client->adapter;
        struct i2c_msg msg;
 
-       if (client->adapter->algo->master_xfer) {
-               msg.addr   = client->addr;
-               msg.flags = client->flags & I2C_M_TEN;
-               msg.len = count;
-               msg.buf = (char *)buf;
+       msg.addr = client->addr;
+       msg.flags = client->flags & I2C_M_TEN;
+       msg.len = count;
+       msg.buf = (char *)buf;
        
-               dev_dbg(&client->adapter->dev, "master_send: writing %d bytes.\n",
-                       count);
-       
-               down(&adap->bus_lock);
-               ret = adap->algo->master_xfer(adap,&msg,1);
-               up(&adap->bus_lock);
+       ret = i2c_transfer(adap, &msg, 1);
 
-               /* if everything went ok (i.e. 1 msg transmitted), return #bytes
-                * transmitted, else error code.
-                */
-               return (ret == 1 )? count : ret;
-       } else {
-               dev_err(&client->adapter->dev, "I2C level transfers not supported\n");
-               return -ENOSYS;
-       }
+       /* If everything went ok (i.e. 1 msg transmitted), return #bytes
+          transmitted, else error code. */
+       return (ret == 1) ? count : ret;
 }
 
 int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
@@ -639,31 +628,18 @@ int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
        struct i2c_adapter *adap=client->adapter;
        struct i2c_msg msg;
        int ret;
-       if (client->adapter->algo->master_xfer) {
-               msg.addr   = client->addr;
-               msg.flags = client->flags & I2C_M_TEN;
-               msg.flags |= I2C_M_RD;
-               msg.len = count;
-               msg.buf = buf;
-
-               dev_dbg(&client->adapter->dev, "master_recv: reading %d bytes.\n",
-                       count);
-       
-               down(&adap->bus_lock);
-               ret = adap->algo->master_xfer(adap,&msg,1);
-               up(&adap->bus_lock);
-       
-               dev_dbg(&client->adapter->dev, "master_recv: return:%d (count:%d, addr:0x%02x)\n",
-                       ret, count, client->addr);
-       
-               /* if everything went ok (i.e. 1 msg transmitted), return #bytes
-               * transmitted, else error code.
-               */
-               return (ret == 1 )? count : ret;
-       } else {
-               dev_err(&client->adapter->dev, "I2C level transfers not supported\n");
-               return -ENOSYS;
-       }
+
+       msg.addr = client->addr;
+       msg.flags = client->flags & I2C_M_TEN;
+       msg.flags |= I2C_M_RD;
+       msg.len = count;
+       msg.buf = buf;
+
+       ret = i2c_transfer(adap, &msg, 1);
+
+       /* If everything went ok (i.e. 1 msg transmitted), return #bytes
+          transmitted, else error code. */
+       return (ret == 1) ? count : ret;
 }
 
 
@@ -789,20 +765,15 @@ int i2c_adapter_id(struct i2c_adapter *adap)
 
 struct i2c_adapter* i2c_get_adapter(int id)
 {
-       struct list_head   *item;
        struct i2c_adapter *adapter;
        
        down(&core_lists);
-       list_for_each(item,&adapters) {
-               adapter = list_entry(item, struct i2c_adapter, list);
-               if (id == adapter->nr &&
-                   try_module_get(adapter->owner)) {
-                       up(&core_lists);
-                       return adapter;
-               }
-       }
+       adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id);
+       if (adapter && !try_module_get(adapter->owner))
+               adapter = NULL;
+
        up(&core_lists);
-       return NULL;
+       return adapter;
 }
 
 void i2c_put_adapter(struct i2c_adapter *adap)