diff options
Diffstat (limited to 'drivers/i2c/chips/max6875.c')
-rw-r--r-- | drivers/i2c/chips/max6875.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/drivers/i2c/chips/max6875.c b/drivers/i2c/chips/max6875.c index 88d2ddee4490..76645c142977 100644 --- a/drivers/i2c/chips/max6875.c +++ b/drivers/i2c/chips/max6875.c | |||
@@ -199,8 +199,7 @@ static int max6875_detect(struct i2c_adapter *adapter, int address, int kind) | |||
199 | mutex_init(&data->update_lock); | 199 | mutex_init(&data->update_lock); |
200 | 200 | ||
201 | /* Init fake client data */ | 201 | /* Init fake client data */ |
202 | /* set the client data to the i2c_client so that it will get freed */ | 202 | i2c_set_clientdata(fake_client, NULL); |
203 | i2c_set_clientdata(fake_client, fake_client); | ||
204 | fake_client->addr = address | 1; | 203 | fake_client->addr = address | 1; |
205 | fake_client->adapter = adapter; | 204 | fake_client->adapter = adapter; |
206 | fake_client->driver = &max6875_driver; | 205 | fake_client->driver = &max6875_driver; |
@@ -214,13 +213,17 @@ static int max6875_detect(struct i2c_adapter *adapter, int address, int kind) | |||
214 | goto exit_kfree2; | 213 | goto exit_kfree2; |
215 | 214 | ||
216 | if ((err = i2c_attach_client(fake_client)) != 0) | 215 | if ((err = i2c_attach_client(fake_client)) != 0) |
217 | goto exit_detach; | 216 | goto exit_detach1; |
218 | 217 | ||
219 | sysfs_create_bin_file(&real_client->dev.kobj, &user_eeprom_attr); | 218 | err = sysfs_create_bin_file(&real_client->dev.kobj, &user_eeprom_attr); |
219 | if (err) | ||
220 | goto exit_detach2; | ||
220 | 221 | ||
221 | return 0; | 222 | return 0; |
222 | 223 | ||
223 | exit_detach: | 224 | exit_detach2: |
225 | i2c_detach_client(fake_client); | ||
226 | exit_detach1: | ||
224 | i2c_detach_client(real_client); | 227 | i2c_detach_client(real_client); |
225 | exit_kfree2: | 228 | exit_kfree2: |
226 | kfree(fake_client); | 229 | kfree(fake_client); |
@@ -229,14 +232,24 @@ exit_kfree1: | |||
229 | return err; | 232 | return err; |
230 | } | 233 | } |
231 | 234 | ||
235 | /* Will be called for both the real client and the fake client */ | ||
232 | static int max6875_detach_client(struct i2c_client *client) | 236 | static int max6875_detach_client(struct i2c_client *client) |
233 | { | 237 | { |
234 | int err; | 238 | int err; |
239 | struct max6875_data *data = i2c_get_clientdata(client); | ||
240 | |||
241 | /* data is NULL for the fake client */ | ||
242 | if (data) | ||
243 | sysfs_remove_bin_file(&client->dev.kobj, &user_eeprom_attr); | ||
235 | 244 | ||
236 | err = i2c_detach_client(client); | 245 | err = i2c_detach_client(client); |
237 | if (err) | 246 | if (err) |
238 | return err; | 247 | return err; |
239 | kfree(i2c_get_clientdata(client)); | 248 | |
249 | if (data) /* real client */ | ||
250 | kfree(data); | ||
251 | else /* fake client */ | ||
252 | kfree(client); | ||
240 | return 0; | 253 | return 0; |
241 | } | 254 | } |
242 | 255 | ||