aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/chips/pca9539.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/i2c/chips/pca9539.c')
-rw-r--r--drivers/i2c/chips/pca9539.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/i2c/chips/pca9539.c b/drivers/i2c/chips/pca9539.c
index 54b6e6a4beed..f43c4e79b55e 100644
--- a/drivers/i2c/chips/pca9539.c
+++ b/drivers/i2c/chips/pca9539.c
@@ -134,11 +134,13 @@ static int pca9539_detect(struct i2c_adapter *adapter, int address, int kind)
134 new_client->driver = &pca9539_driver; 134 new_client->driver = &pca9539_driver;
135 new_client->flags = 0; 135 new_client->flags = 0;
136 136
137 /* Detection: the pca9539 only has 8 registers (0-7). 137 if (kind < 0) {
138 A read of 7 should succeed, but a read of 8 should fail. */ 138 /* Detection: the pca9539 only has 8 registers (0-7).
139 if ((i2c_smbus_read_byte_data(new_client, 7) < 0) || 139 A read of 7 should succeed, but a read of 8 should fail. */
140 (i2c_smbus_read_byte_data(new_client, 8) >= 0)) 140 if ((i2c_smbus_read_byte_data(new_client, 7) < 0) ||
141 goto exit_kfree; 141 (i2c_smbus_read_byte_data(new_client, 8) >= 0))
142 goto exit_kfree;
143 }
142 144
143 strlcpy(new_client->name, "pca9539", I2C_NAME_SIZE); 145 strlcpy(new_client->name, "pca9539", I2C_NAME_SIZE);
144 146
@@ -146,11 +148,16 @@ static int pca9539_detect(struct i2c_adapter *adapter, int address, int kind)
146 if ((err = i2c_attach_client(new_client))) 148 if ((err = i2c_attach_client(new_client)))
147 goto exit_kfree; 149 goto exit_kfree;
148 150
149 /* Register sysfs hooks (don't care about failure) */ 151 /* Register sysfs hooks */
150 sysfs_create_group(&new_client->dev.kobj, &pca9539_defattr_group); 152 err = sysfs_create_group(&new_client->dev.kobj,
153 &pca9539_defattr_group);
154 if (err)
155 goto exit_detach;
151 156
152 return 0; 157 return 0;
153 158
159exit_detach:
160 i2c_detach_client(new_client);
154exit_kfree: 161exit_kfree:
155 kfree(data); 162 kfree(data);
156exit: 163exit:
@@ -161,6 +168,8 @@ static int pca9539_detach_client(struct i2c_client *client)
161{ 168{
162 int err; 169 int err;
163 170
171 sysfs_remove_group(&client->dev.kobj, &pca9539_defattr_group);
172
164 if ((err = i2c_detach_client(client))) 173 if ((err = i2c_detach_client(client)))
165 return err; 174 return err;
166 175