Commit 8acf07c5 authored by Jean Delvare's avatar Jean Delvare

hwmon: (it87) Properly handle wrong sensor type requests

Currently, if someone tries to set the thermal sensor type to an
unsupported value, subsequent accesses to the chip may temporarily
show the sensor in question as disabled. Use a temporary variable
and only update the cached value on success, to prevent such
confusion.
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
parent a00afb97
...@@ -539,15 +539,14 @@ static ssize_t set_sensor(struct device *dev, struct device_attribute *attr, ...@@ -539,15 +539,14 @@ static ssize_t set_sensor(struct device *dev, struct device_attribute *attr,
struct it87_data *data = dev_get_drvdata(dev); struct it87_data *data = dev_get_drvdata(dev);
long val; long val;
u8 reg;
if (strict_strtol(buf, 10, &val) < 0) if (strict_strtol(buf, 10, &val) < 0)
return -EINVAL; return -EINVAL;
mutex_lock(&data->update_lock); reg = it87_read_value(data, IT87_REG_TEMP_ENABLE);
reg &= ~(1 << nr);
data->sensor = it87_read_value(data, IT87_REG_TEMP_ENABLE); reg &= ~(8 << nr);
data->sensor &= ~(1 << nr);
data->sensor &= ~(8 << nr);
if (val == 2) { /* backwards compatibility */ if (val == 2) { /* backwards compatibility */
dev_warn(dev, "Sensor type 2 is deprecated, please use 4 " dev_warn(dev, "Sensor type 2 is deprecated, please use 4 "
"instead\n"); "instead\n");
...@@ -555,13 +554,14 @@ static ssize_t set_sensor(struct device *dev, struct device_attribute *attr, ...@@ -555,13 +554,14 @@ static ssize_t set_sensor(struct device *dev, struct device_attribute *attr,
} }
/* 3 = thermal diode; 4 = thermistor; 0 = disabled */ /* 3 = thermal diode; 4 = thermistor; 0 = disabled */
if (val == 3) if (val == 3)
data->sensor |= 1 << nr; reg |= 1 << nr;
else if (val == 4) else if (val == 4)
data->sensor |= 8 << nr; reg |= 8 << nr;
else if (val != 0) { else if (val != 0)
mutex_unlock(&data->update_lock);
return -EINVAL; return -EINVAL;
}
mutex_lock(&data->update_lock);
data->sensor = reg;
it87_write_value(data, IT87_REG_TEMP_ENABLE, data->sensor); it87_write_value(data, IT87_REG_TEMP_ENABLE, data->sensor);
mutex_unlock(&data->update_lock); mutex_unlock(&data->update_lock);
return count; return count;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment