Skip to content

Commit

Permalink
hwmon: (lm90) Restore original configuration if probe function fails
Browse files Browse the repository at this point in the history
The lm90 driver restores the original chip configuration in its exit function.
However, the chip configuration is not restored if the probe function fails.
Restore it there as well.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
  • Loading branch information
Guenter Roeck authored and Jean Delvare committed Mar 23, 2012
1 parent ae544f6 commit f7001bb
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions drivers/hwmon/lm90.c
Original file line number Diff line number Diff line change
Expand Up @@ -1336,6 +1336,15 @@ static void lm90_remove_files(struct i2c_client *client, struct lm90_data *data)
sysfs_remove_group(&dev->kobj, &lm90_group);
}

static void lm90_restore_conf(struct i2c_client *client, struct lm90_data *data)
{
/* Restore initial configuration */
i2c_smbus_write_byte_data(client, LM90_REG_W_CONVRATE,
data->convrate_orig);
i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
data->config_orig);
}

static void lm90_init_client(struct i2c_client *client)
{
u8 config, convrate;
Expand Down Expand Up @@ -1424,7 +1433,7 @@ static int lm90_probe(struct i2c_client *client,
/* Register sysfs hooks */
err = sysfs_create_group(&dev->kobj, &lm90_group);
if (err)
goto exit_free;
goto exit_restore;
if (client->flags & I2C_CLIENT_PEC) {
err = device_create_file(dev, &dev_attr_pec);
if (err)
Expand Down Expand Up @@ -1463,7 +1472,8 @@ static int lm90_probe(struct i2c_client *client,

exit_remove_files:
lm90_remove_files(client, data);
exit_free:
exit_restore:
lm90_restore_conf(client, data);
kfree(data);
exit:
return err;
Expand All @@ -1475,12 +1485,7 @@ static int lm90_remove(struct i2c_client *client)

hwmon_device_unregister(data->hwmon_dev);
lm90_remove_files(client, data);

/* Restore initial configuration */
i2c_smbus_write_byte_data(client, LM90_REG_W_CONVRATE,
data->convrate_orig);
i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
data->config_orig);
lm90_restore_conf(client, data);

kfree(data);
return 0;
Expand Down

0 comments on commit f7001bb

Please sign in to comment.