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: Jean Delvare <khali@linux-fr.org>
This commit is contained in:
parent
a00afb97e2
commit
8acf07c5a7
@ -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,
|
|||||||
}
|
}
|
||||||
/* 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;
|
||||||
|
Loading…
Reference in New Issue
Block a user