summaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/it87.c
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2015-04-05 16:16:54 -0400
committerGuenter Roeck <linux@roeck-us.net>2016-04-19 09:32:37 -0400
commitf1bbe618604a4aa833a4af0b1ecdfb47a25455c6 (patch)
treed09f10fc0e7c6dd7b6bdf43a329dbedfaf2003d2 /drivers/hwmon/it87.c
parentc962024e306ed598600853854a067b521bf5b530 (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.c52
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,
1030static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR, show_temp_type, 1030static 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
1035static int pwm_mode(const struct it87_data *data, int nr) 1035static 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
1047static ssize_t show_fan(struct device *dev, struct device_attribute *attr, 1048static 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,