| From c024044d4da2c9c3b32933b4235df1e409293b84 Mon Sep 17 00:00:00 2001 |
| From: Axel Lin <axel.lin@ingics.com> |
| Date: Thu, 3 Jul 2014 22:45:45 +0800 |
| Subject: hwmon: (adm1021) Fix cache problem when writing temperature limits |
| |
| From: Axel Lin <axel.lin@ingics.com> |
| |
| commit c024044d4da2c9c3b32933b4235df1e409293b84 upstream. |
| |
| The module test script for the adm1021 driver exposes a cache problem |
| when writing temperature limits. temp_min and temp_max are expected |
| to be stored in milli-degrees C but are stored in degrees C. |
| |
| Reported-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Axel Lin <axel.lin@ingics.com> |
| Signed-off-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/hwmon/adm1021.c | 14 ++++++++------ |
| 1 file changed, 8 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/hwmon/adm1021.c |
| +++ b/drivers/hwmon/adm1021.c |
| @@ -185,7 +185,7 @@ static ssize_t set_temp_max(struct devic |
| struct i2c_client *client = to_i2c_client(dev); |
| struct adm1021_data *data = i2c_get_clientdata(client); |
| long temp; |
| - int err; |
| + int reg_val, err; |
| |
| err = kstrtol(buf, 10, &temp); |
| if (err) |
| @@ -193,10 +193,11 @@ static ssize_t set_temp_max(struct devic |
| temp /= 1000; |
| |
| mutex_lock(&data->update_lock); |
| - data->temp_max[index] = clamp_val(temp, -128, 127); |
| + reg_val = clamp_val(temp, -128, 127); |
| + data->temp_max[index] = reg_val * 1000; |
| if (!read_only) |
| i2c_smbus_write_byte_data(client, ADM1021_REG_TOS_W(index), |
| - data->temp_max[index]); |
| + reg_val); |
| mutex_unlock(&data->update_lock); |
| |
| return count; |
| @@ -210,7 +211,7 @@ static ssize_t set_temp_min(struct devic |
| struct i2c_client *client = to_i2c_client(dev); |
| struct adm1021_data *data = i2c_get_clientdata(client); |
| long temp; |
| - int err; |
| + int reg_val, err; |
| |
| err = kstrtol(buf, 10, &temp); |
| if (err) |
| @@ -218,10 +219,11 @@ static ssize_t set_temp_min(struct devic |
| temp /= 1000; |
| |
| mutex_lock(&data->update_lock); |
| - data->temp_min[index] = clamp_val(temp, -128, 127); |
| + reg_val = clamp_val(temp, -128, 127); |
| + data->temp_min[index] = reg_val * 1000; |
| if (!read_only) |
| i2c_smbus_write_byte_data(client, ADM1021_REG_THYST_W(index), |
| - data->temp_min[index]); |
| + reg_val); |
| mutex_unlock(&data->update_lock); |
| |
| return count; |