aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2010-03-05 16:17:21 -0500
committerJean Delvare <khali@linux-fr.org>2010-03-05 16:17:21 -0500
commitcccfc9c4bb3c7888f8249b36e08d6e115238c613 (patch)
treeacff09833d8e7fd1b87efb27394860ea398dcaa9 /drivers/hwmon
parent4f3f51bc21d434f8d91a79438a1957ec0baa9e30 (diff)
hwmon: (it87) Validate auto pwm settings
Before switching to automatic fan control mode, make sure that all the trip points make sense. Otherwise, the control loop could lead to weird fan behavior. Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/it87.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
index bbb0c7443b9b..1002befd87d5 100644
--- a/drivers/hwmon/it87.c
+++ b/drivers/hwmon/it87.c
@@ -719,6 +719,32 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
719 mutex_unlock(&data->update_lock); 719 mutex_unlock(&data->update_lock);
720 return count; 720 return count;
721} 721}
722
723/* Returns 0 if OK, -EINVAL otherwise */
724static int check_trip_points(struct device *dev, int nr)
725{
726 const struct it87_data *data = dev_get_drvdata(dev);
727 int i, err = 0;
728
729 if (has_old_autopwm(data)) {
730 for (i = 0; i < 3; i++) {
731 if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1])
732 err = -EINVAL;
733 }
734 for (i = 0; i < 2; i++) {
735 if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1])
736 err = -EINVAL;
737 }
738 }
739
740 if (err) {
741 dev_err(dev, "Inconsistent trip points, not switching to "
742 "automatic mode\n");
743 dev_err(dev, "Adjust the trip points and try again\n");
744 }
745 return err;
746}
747
722static ssize_t set_pwm_enable(struct device *dev, 748static ssize_t set_pwm_enable(struct device *dev,
723 struct device_attribute *attr, const char *buf, size_t count) 749 struct device_attribute *attr, const char *buf, size_t count)
724{ 750{
@@ -731,6 +757,12 @@ static ssize_t set_pwm_enable(struct device *dev,
731 if (strict_strtol(buf, 10, &val) < 0 || val < 0 || val > 2) 757 if (strict_strtol(buf, 10, &val) < 0 || val < 0 || val > 2)
732 return -EINVAL; 758 return -EINVAL;
733 759
760 /* Check trip points before switching to automatic mode */
761 if (val == 2) {
762 if (check_trip_points(dev, nr) < 0)
763 return -EINVAL;
764 }
765
734 mutex_lock(&data->update_lock); 766 mutex_lock(&data->update_lock);
735 767
736 if (val == 0) { 768 if (val == 0) {