diff options
author | Guenter Roeck <linux@roeck-us.net> | 2015-04-05 16:16:54 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2016-04-19 09:32:37 -0400 |
commit | f1bbe618604a4aa833a4af0b1ecdfb47a25455c6 (patch) | |
tree | d09f10fc0e7c6dd7b6bdf43a329dbedfaf2003d2 /drivers/hwmon/it87.c | |
parent | c962024e306ed598600853854a067b521bf5b530 (diff) |
hwmon: (it87) Support disabling fan control for all pwm control and chips
On/Off mode is only supported for pwm controls 0-2, and not supported at all for
IT8603E/IT8623E. For pwm controls 3-6 and for IT8603E/IT8623E, SmartGuardian mode
is always enabled. Use it and set the pwm value to the maximum if fan control
is disabled.
Tested-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon/it87.c')
-rw-r--r-- | drivers/hwmon/it87.c | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 515c5cd1890b..f40d81a0a9fc 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c | |||
@@ -1030,18 +1030,19 @@ static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO | S_IWUSR, show_temp_type, | |||
1030 | static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR, show_temp_type, | 1030 | static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR, show_temp_type, |
1031 | set_temp_type, 2); | 1031 | set_temp_type, 2); |
1032 | 1032 | ||
1033 | /* 3 Fans */ | 1033 | /* 6 Fans */ |
1034 | 1034 | ||
1035 | static int pwm_mode(const struct it87_data *data, int nr) | 1035 | static int pwm_mode(const struct it87_data *data, int nr) |
1036 | { | 1036 | { |
1037 | int ctrl = data->fan_main_ctrl & BIT(nr); | 1037 | if (data->type != it8603 && nr < 3 && !(data->fan_main_ctrl & BIT(nr))) |
1038 | return 0; /* Full speed */ | ||
1039 | if (data->pwm_ctrl[nr] & 0x80) | ||
1040 | return 2; /* Automatic mode */ | ||
1041 | if ((data->type == it8603 || nr >= 3) && | ||
1042 | data->pwm_duty[nr] == pwm_to_reg(data, 0xff)) | ||
1043 | return 0; /* Full speed */ | ||
1038 | 1044 | ||
1039 | if (ctrl == 0 && data->type != it8603) /* Full speed */ | 1045 | return 1; /* Manual mode */ |
1040 | return 0; | ||
1041 | if (data->pwm_ctrl[nr] & 0x80) /* Automatic mode */ | ||
1042 | return 2; | ||
1043 | else /* Manual mode */ | ||
1044 | return 1; | ||
1045 | } | 1046 | } |
1046 | 1047 | ||
1047 | static ssize_t show_fan(struct device *dev, struct device_attribute *attr, | 1048 | static ssize_t show_fan(struct device *dev, struct device_attribute *attr, |
@@ -1242,21 +1243,30 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr, | |||
1242 | return -EINVAL; | 1243 | return -EINVAL; |
1243 | } | 1244 | } |
1244 | 1245 | ||
1245 | /* IT8603E does not have on/off mode */ | ||
1246 | if (val == 0 && data->type == it8603) | ||
1247 | return -EINVAL; | ||
1248 | |||
1249 | mutex_lock(&data->update_lock); | 1246 | mutex_lock(&data->update_lock); |
1250 | 1247 | ||
1251 | if (val == 0) { | 1248 | if (val == 0) { |
1252 | int tmp; | 1249 | if (nr < 3 && data->type != it8603) { |
1253 | /* make sure the fan is on when in on/off mode */ | 1250 | int tmp; |
1254 | tmp = it87_read_value(data, IT87_REG_FAN_CTL); | 1251 | /* make sure the fan is on when in on/off mode */ |
1255 | it87_write_value(data, IT87_REG_FAN_CTL, tmp | BIT(nr)); | 1252 | tmp = it87_read_value(data, IT87_REG_FAN_CTL); |
1256 | /* set on/off mode */ | 1253 | it87_write_value(data, IT87_REG_FAN_CTL, tmp | BIT(nr)); |
1257 | data->fan_main_ctrl &= ~BIT(nr); | 1254 | /* set on/off mode */ |
1258 | it87_write_value(data, IT87_REG_FAN_MAIN_CTRL, | 1255 | data->fan_main_ctrl &= ~BIT(nr); |
1259 | data->fan_main_ctrl); | 1256 | it87_write_value(data, IT87_REG_FAN_MAIN_CTRL, |
1257 | data->fan_main_ctrl); | ||
1258 | } else { | ||
1259 | /* No on/off mode, set maximum pwm value */ | ||
1260 | data->pwm_duty[nr] = pwm_to_reg(data, 0xff); | ||
1261 | it87_write_value(data, IT87_REG_PWM_DUTY[nr], | ||
1262 | data->pwm_duty[nr]); | ||
1263 | /* and set manual mode */ | ||
1264 | data->pwm_ctrl[nr] = has_newer_autopwm(data) ? | ||
1265 | data->pwm_temp_map[nr] : | ||
1266 | data->pwm_duty[nr]; | ||
1267 | it87_write_value(data, IT87_REG_PWM[nr], | ||
1268 | data->pwm_ctrl[nr]); | ||
1269 | } | ||
1260 | } else { | 1270 | } else { |
1261 | if (val == 1) /* Manual mode */ | 1271 | if (val == 1) /* Manual mode */ |
1262 | data->pwm_ctrl[nr] = has_newer_autopwm(data) ? | 1272 | data->pwm_ctrl[nr] = has_newer_autopwm(data) ? |
@@ -1266,7 +1276,7 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *attr, | |||
1266 | data->pwm_ctrl[nr] = 0x80 | data->pwm_temp_map[nr]; | 1276 | data->pwm_ctrl[nr] = 0x80 | data->pwm_temp_map[nr]; |
1267 | it87_write_value(data, IT87_REG_PWM[nr], data->pwm_ctrl[nr]); | 1277 | it87_write_value(data, IT87_REG_PWM[nr], data->pwm_ctrl[nr]); |
1268 | 1278 | ||
1269 | if (data->type != it8603) { | 1279 | if (data->type != it8603 && nr < 3) { |
1270 | /* set SmartGuardian mode */ | 1280 | /* set SmartGuardian mode */ |
1271 | data->fan_main_ctrl |= BIT(nr); | 1281 | data->fan_main_ctrl |= BIT(nr); |
1272 | it87_write_value(data, IT87_REG_FAN_MAIN_CTRL, | 1282 | it87_write_value(data, IT87_REG_FAN_MAIN_CTRL, |