]> err.no Git - linux-2.6/blobdiff - drivers/i2c/i2c-core.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/hwmon-2.6
[linux-2.6] / drivers / i2c / i2c-core.c
index 88dd803174a1b446668e193b07669a5a102fe8de..7ca81f42d14bfd7c1ab5834b2a6cb853587259a9 100644 (file)
@@ -420,14 +420,6 @@ int i2c_attach_client(struct i2c_client *client)
        }
        list_add_tail(&client->list,&adapter->clients);
        
-       if (adapter->client_register)  {
-               if (adapter->client_register(client))  {
-                       dev_dbg(&adapter->dev, "client_register "
-                               "failed for client [%s] at 0x%02x\n",
-                               client->name, client->addr);
-               }
-       }
-
        client->usage_count = 0;
 
        client->dev.parent = &client->adapter->dev;
@@ -445,10 +437,17 @@ int i2c_attach_client(struct i2c_client *client)
        res = device_create_file(&client->dev, &dev_attr_client_name);
        if (res)
                goto out_unregister;
-
-out_unlock:
        mutex_unlock(&adapter->clist_lock);
-       return res;
+
+       if (adapter->client_register)  {
+               if (adapter->client_register(client)) {
+                       dev_dbg(&adapter->dev, "client_register "
+                               "failed for client [%s] at 0x%02x\n",
+                               client->name, client->addr);
+               }
+       }
+
+       return 0;
 
 out_unregister:
        init_completion(&client->released); /* Needed? */
@@ -458,7 +457,9 @@ out_list:
        list_del(&client->list);
        dev_err(&adapter->dev, "Failed to attach i2c client %s at 0x%02x "
                "(%d)\n", client->name, client->addr, res);
-       goto out_unlock;
+out_unlock:
+       mutex_unlock(&adapter->clist_lock);
+       return res;
 }
 
 
@@ -707,11 +708,16 @@ static int i2c_probe_address(struct i2c_adapter *adapter, int addr, int kind,
 
        /* Finally call the custom detection function */
        err = found_proc(adapter, addr, kind);
-
        /* -ENODEV can be returned if there is a chip at the given address
           but it isn't supported by this chip driver. We catch it here as
           this isn't an error. */
-       return (err == -ENODEV) ? 0 : err;
+       if (err == -ENODEV)
+               err = 0;
+
+       if (err)
+               dev_warn(&adapter->dev, "Client creation failed at 0x%x (%d)\n",
+                        addr, err);
+       return err;
 }
 
 int i2c_probe(struct i2c_adapter *adapter,