Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hwmon/w83793: Ignore disabled temperature channels

Ignore the temperature readings when its channel is disabled,
ignore AMDSI readings.

Signed-off-by: Gong Jun <jgong@winbond.com>
Signed-off-by: Rudolf Marek <r.marek@assembler.cz>
Signed-off-by: Jean Delvare <khali@linux-fr.org>

authored by

Gong Jun and committed by
Jean Delvare
46bed4df 9fab2d8b

+56 -15
+2 -6
Documentation/hwmon/w83793
··· 45 45 temp5-6 have a 1 degree Celsiis resolution. 46 46 47 47 * Temperature sensor types 48 - Temp1-4 have 3 possible types. It can be read from (and written to) 48 + Temp1-4 have 2 possible types. It can be read from (and written to) 49 49 temp[1-4]_type. 50 - - If the value of 0, the related temperature channel stops 51 - monitoring. 52 50 - If the value is 3, it starts monitoring using a remote termal diode 53 51 (default). 54 - - If the value is 5, it starts monitoring using the temperature sensor 55 - in AMD CPU and get result by AMDSI. 56 52 - If the value is 6, it starts monitoring using the temperature sensor 57 53 in Intel CPU and get result by PECI. 58 54 Temp5-6 can be connected to external thermistors (value of 59 - temp[5-6]_type is 4). They can also be disabled (value is 0). 55 + temp[5-6]_type is 4). 60 56 61 57 * Alarm mechanism 62 58 For voltage sensors, an alarm triggers if the measured value is below
+54 -9
drivers/hwmon/w83793.c
··· 204 204 u8 temp_fan_map[6]; /* Temp controls which pwm fan, bit field */ 205 205 206 206 u8 has_pwm; 207 + u8 has_temp; 207 208 u8 pwm_enable; /* Register value, each Temp has 1 bit */ 208 209 u8 pwm_uptime; /* Register value */ 209 210 u8 pwm_downtime; /* Register value */ ··· 555 554 if ((val == 6) && (index < 4)) { 556 555 val -= 3; 557 556 } else if ((val == 3 && index < 4) 558 - || (val == 4 && index >= 4) 559 - || val == 0) { 557 + || (val == 4 && index >= 4)) { 560 558 /* transform diode or thermistor into internal enable */ 561 559 val = !!val; 562 560 } else { ··· 986 986 SENSOR_ATTR_IN(7), 987 987 SENSOR_ATTR_IN(8), 988 988 SENSOR_ATTR_IN(9), 989 - SENSOR_ATTR_TEMP(1), 990 - SENSOR_ATTR_TEMP(2), 991 - SENSOR_ATTR_TEMP(3), 992 - SENSOR_ATTR_TEMP(4), 993 - SENSOR_ATTR_TEMP(5), 994 - SENSOR_ATTR_TEMP(6), 995 989 SENSOR_ATTR_FAN(1), 996 990 SENSOR_ATTR_FAN(2), 997 991 SENSOR_ATTR_FAN(3), ··· 994 1000 SENSOR_ATTR_PWM(1), 995 1001 SENSOR_ATTR_PWM(2), 996 1002 SENSOR_ATTR_PWM(3), 1003 + }; 1004 + 1005 + static struct sensor_device_attribute_2 w83793_temp[] = { 1006 + SENSOR_ATTR_TEMP(1), 1007 + SENSOR_ATTR_TEMP(2), 1008 + SENSOR_ATTR_TEMP(3), 1009 + SENSOR_ATTR_TEMP(4), 1010 + SENSOR_ATTR_TEMP(5), 1011 + SENSOR_ATTR_TEMP(6), 997 1012 }; 998 1013 999 1014 /* Fan6-Fan12 */ ··· 1085 1082 1086 1083 for (i = 0; i < ARRAY_SIZE(w83793_left_pwm); i++) 1087 1084 device_remove_file(dev, &w83793_left_pwm[i].dev_attr); 1085 + 1086 + for (i = 0; i < ARRAY_SIZE(w83793_temp); i++) 1087 + device_remove_file(dev, &w83793_temp[i].dev_attr); 1088 1088 } 1089 1089 1090 1090 if ((err = i2c_detach_client(client))) ··· 1200 1194 struct w83793_data *data; 1201 1195 int files_fan = ARRAY_SIZE(w83793_left_fan) / 7; 1202 1196 int files_pwm = ARRAY_SIZE(w83793_left_pwm) / 5; 1197 + int files_temp = ARRAY_SIZE(w83793_temp) / 6; 1203 1198 int err = 0; 1204 1199 1205 1200 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { ··· 1327 1320 data->has_pwm |= 0x80; 1328 1321 } 1329 1322 1323 + /* check the temp1-6 mode, ignore former AMDSI selected inputs */ 1324 + tmp = w83793_read_value(client,W83793_REG_TEMP_MODE[0]); 1325 + if (tmp & 0x01) 1326 + data->has_temp |= 0x01; 1327 + if (tmp & 0x04) 1328 + data->has_temp |= 0x02; 1329 + if (tmp & 0x10) 1330 + data->has_temp |= 0x04; 1331 + if (tmp & 0x40) 1332 + data->has_temp |= 0x08; 1333 + 1334 + tmp = w83793_read_value(client,W83793_REG_TEMP_MODE[1]); 1335 + if (tmp & 0x01) 1336 + data->has_temp |= 0x10; 1337 + if (tmp & 0x02) 1338 + data->has_temp |= 0x20; 1339 + 1330 1340 /* Register sysfs hooks */ 1331 1341 for (i = 0; i < ARRAY_SIZE(w83793_sensor_attr_2); i++) { 1332 1342 err = device_create_file(dev, ··· 1357 1333 if (err) 1358 1334 goto exit_remove; 1359 1335 1336 + } 1337 + 1338 + for (i = 0; i < 6; i++) { 1339 + int j; 1340 + if (!(data->has_temp & (1 << i))) 1341 + continue; 1342 + for (j = 0; j < files_temp; j++) { 1343 + err = device_create_file(dev, 1344 + &w83793_temp[(i) * files_temp 1345 + + j].dev_attr); 1346 + if (err) 1347 + goto exit_remove; 1348 + } 1360 1349 } 1361 1350 1362 1351 for (i = 5; i < 12; i++) { ··· 1420 1383 1421 1384 for (i = 0; i < ARRAY_SIZE(w83793_left_pwm); i++) 1422 1385 device_remove_file(dev, &w83793_left_pwm[i].dev_attr); 1386 + 1387 + for (i = 0; i < ARRAY_SIZE(w83793_temp); i++) 1388 + device_remove_file(dev, &w83793_temp[i].dev_attr); 1423 1389 1424 1390 if (data->lm75[0] != NULL) { 1425 1391 i2c_detach_client(data->lm75[0]); ··· 1475 1435 } 1476 1436 1477 1437 for (i = 0; i < ARRAY_SIZE(data->temp_fan_map); i++) { 1438 + if (!(data->has_temp & (1 << i))) 1439 + continue; 1478 1440 data->temp_fan_map[i] = 1479 1441 w83793_read_value(client, W83793_REG_TEMP_FAN_MAP(i)); 1480 1442 for (j = 1; j < 5; j++) { ··· 1559 1517 w83793_read_value(client, W83793_REG_FAN(i) + 1); 1560 1518 } 1561 1519 1562 - for (i = 0; i < ARRAY_SIZE(data->temp); i++) 1520 + for (i = 0; i < ARRAY_SIZE(data->temp); i++) { 1521 + if (!(data->has_temp & (1 << i))) 1522 + continue; 1563 1523 data->temp[i][TEMP_READ] = 1564 1524 w83793_read_value(client, W83793_REG_TEMP[i][TEMP_READ]); 1525 + } 1565 1526 1566 1527 data->temp_low_bits = 1567 1528 w83793_read_value(client, W83793_REG_TEMP_LOW_BITS);