aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon')
-rw-r--r--drivers/hwmon/w83627ehf.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c
index df6e50260e01..460292bad74a 100644
--- a/drivers/hwmon/w83627ehf.c
+++ b/drivers/hwmon/w83627ehf.c
@@ -452,7 +452,7 @@ struct w83627ehf_data {
452 u8 in[10]; /* Register value */ 452 u8 in[10]; /* Register value */
453 u8 in_max[10]; /* Register value */ 453 u8 in_max[10]; /* Register value */
454 u8 in_min[10]; /* Register value */ 454 u8 in_min[10]; /* Register value */
455 u16 fan[5]; 455 unsigned int rpm[5];
456 u16 fan_min[5]; 456 u16 fan_min[5];
457 u8 fan_div[5]; 457 u8 fan_div[5];
458 u8 has_fan; /* some fan inputs can be disabled */ 458 u8 has_fan; /* some fan inputs can be disabled */
@@ -775,11 +775,14 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
775 775
776 /* Measured fan speeds and limits */ 776 /* Measured fan speeds and limits */
777 for (i = 0; i < 5; i++) { 777 for (i = 0; i < 5; i++) {
778 u16 reg;
779
778 if (!(data->has_fan & (1 << i))) 780 if (!(data->has_fan & (1 << i)))
779 continue; 781 continue;
780 782
781 data->fan[i] = w83627ehf_read_value(data, 783 reg = w83627ehf_read_value(data, data->REG_FAN[i]);
782 data->REG_FAN[i]); 784 data->rpm[i] = data->fan_from_reg(reg,
785 data->fan_div[i]);
783 786
784 if (data->has_fan_min & (1 << i)) 787 if (data->has_fan_min & (1 << i))
785 data->fan_min[i] = w83627ehf_read_value(data, 788 data->fan_min[i] = w83627ehf_read_value(data,
@@ -789,9 +792,8 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
789 divider can be increased, let's try that for next 792 divider can be increased, let's try that for next
790 time */ 793 time */
791 if (data->has_fan_div 794 if (data->has_fan_div
792 && (data->fan[i] >= 0xff 795 && (reg >= 0xff || (sio_data->kind == nct6775
793 || (sio_data->kind == nct6775 796 && reg == 0x00))
794 && data->fan[i] == 0x00))
795 && data->fan_div[i] < 0x07) { 797 && data->fan_div[i] < 0x07) {
796 dev_dbg(dev, "Increasing fan%d " 798 dev_dbg(dev, "Increasing fan%d "
797 "clock divider from %u to %u\n", 799 "clock divider from %u to %u\n",
@@ -984,8 +986,7 @@ show_fan(struct device *dev, struct device_attribute *attr, char *buf)
984 struct w83627ehf_data *data = w83627ehf_update_device(dev); 986 struct w83627ehf_data *data = w83627ehf_update_device(dev);
985 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 987 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
986 int nr = sensor_attr->index; 988 int nr = sensor_attr->index;
987 return sprintf(buf, "%d\n", 989 return sprintf(buf, "%d\n", data->rpm[nr]);
988 data->fan_from_reg(data->fan[nr], data->fan_div[nr]));
989} 990}
990 991
991static ssize_t 992static ssize_t
@@ -1078,16 +1079,6 @@ store_fan_min(struct device *dev, struct device_attribute *attr,
1078 /* Write both the fan clock divider (if it changed) and the new 1079 /* Write both the fan clock divider (if it changed) and the new
1079 fan min (unconditionally) */ 1080 fan min (unconditionally) */
1080 if (new_div != data->fan_div[nr]) { 1081 if (new_div != data->fan_div[nr]) {
1081 /* Preserve the fan speed reading */
1082 if (data->fan[nr] != 0xff) {
1083 if (new_div > data->fan_div[nr])
1084 data->fan[nr] >>= new_div - data->fan_div[nr];
1085 else if (data->fan[nr] & 0x80)
1086 data->fan[nr] = 0xff;
1087 else
1088 data->fan[nr] <<= data->fan_div[nr] - new_div;
1089 }
1090
1091 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n", 1082 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
1092 nr + 1, div_from_reg(data->fan_div[nr]), 1083 nr + 1, div_from_reg(data->fan_div[nr]),
1093 div_from_reg(new_div)); 1084 div_from_reg(new_div));