diff options
| author | Jean Delvare <khali@linux-fr.org> | 2010-03-05 16:17:14 -0500 |
|---|---|---|
| committer | Jean Delvare <khali@linux-fr.org> | 2010-03-05 16:17:14 -0500 |
| commit | 95238364167edaf93ce2890e5f55326b63194851 (patch) | |
| tree | 21a1c398b9102c74d38a61d22d34089e5697ccd1 | |
| parent | 6771ea1fff988651593f78c122bc02e80f5100a0 (diff) | |
hwmon: (lm90) Restore configuration on exit
Restore the chip configuration when unloading the driver. This ensures
we don't leave the chip running if it was initially stopped.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
| -rw-r--r-- | drivers/hwmon/lm90.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c index ddf617f3a713..4cbbf1563de6 100644 --- a/drivers/hwmon/lm90.c +++ b/drivers/hwmon/lm90.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * lm90.c - Part of lm_sensors, Linux kernel modules for hardware | 2 | * lm90.c - Part of lm_sensors, Linux kernel modules for hardware |
| 3 | * monitoring | 3 | * monitoring |
| 4 | * Copyright (C) 2003-2009 Jean Delvare <khali@linux-fr.org> | 4 | * Copyright (C) 2003-2010 Jean Delvare <khali@linux-fr.org> |
| 5 | * | 5 | * |
| 6 | * Based on the lm83 driver. The LM90 is a sensor chip made by National | 6 | * Based on the lm83 driver. The LM90 is a sensor chip made by National |
| 7 | * Semiconductor. It reports up to two temperatures (its own plus up to | 7 | * Semiconductor. It reports up to two temperatures (its own plus up to |
| @@ -203,6 +203,8 @@ struct lm90_data { | |||
| 203 | int kind; | 203 | int kind; |
| 204 | int flags; | 204 | int flags; |
| 205 | 205 | ||
| 206 | u8 config_orig; /* Original configuration register value */ | ||
| 207 | |||
| 206 | /* registers values */ | 208 | /* registers values */ |
| 207 | s8 temp8[4]; /* 0: local low limit | 209 | s8 temp8[4]; /* 0: local low limit |
| 208 | 1: local high limit | 210 | 1: local high limit |
| @@ -840,7 +842,7 @@ exit: | |||
| 840 | 842 | ||
| 841 | static void lm90_init_client(struct i2c_client *client) | 843 | static void lm90_init_client(struct i2c_client *client) |
| 842 | { | 844 | { |
| 843 | u8 config, config_orig; | 845 | u8 config; |
| 844 | struct lm90_data *data = i2c_get_clientdata(client); | 846 | struct lm90_data *data = i2c_get_clientdata(client); |
| 845 | 847 | ||
| 846 | /* | 848 | /* |
| @@ -852,7 +854,7 @@ static void lm90_init_client(struct i2c_client *client) | |||
| 852 | dev_warn(&client->dev, "Initialization failed!\n"); | 854 | dev_warn(&client->dev, "Initialization failed!\n"); |
| 853 | return; | 855 | return; |
| 854 | } | 856 | } |
| 855 | config_orig = config; | 857 | data->config_orig = config; |
| 856 | 858 | ||
| 857 | /* Check Temperature Range Select */ | 859 | /* Check Temperature Range Select */ |
| 858 | if (data->kind == adt7461) { | 860 | if (data->kind == adt7461) { |
| @@ -870,7 +872,7 @@ static void lm90_init_client(struct i2c_client *client) | |||
| 870 | } | 872 | } |
| 871 | 873 | ||
| 872 | config &= 0xBF; /* run */ | 874 | config &= 0xBF; /* run */ |
| 873 | if (config != config_orig) /* Only write if changed */ | 875 | if (config != data->config_orig) /* Only write if changed */ |
| 874 | i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1, config); | 876 | i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1, config); |
| 875 | } | 877 | } |
| 876 | 878 | ||
| @@ -885,6 +887,10 @@ static int lm90_remove(struct i2c_client *client) | |||
| 885 | device_remove_file(&client->dev, | 887 | device_remove_file(&client->dev, |
| 886 | &sensor_dev_attr_temp2_offset.dev_attr); | 888 | &sensor_dev_attr_temp2_offset.dev_attr); |
| 887 | 889 | ||
| 890 | /* Restore initial configuration */ | ||
| 891 | i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1, | ||
| 892 | data->config_orig); | ||
| 893 | |||
| 888 | kfree(data); | 894 | kfree(data); |
| 889 | return 0; | 895 | return 0; |
| 890 | } | 896 | } |
