Merge tag 'hwmon-for-v5.16-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging

Pull hwmon fixes from Guenter Roeck:
"A couple of lm90 driver fixes. None of them are critical, but they
should nevertheless be fixed"

* tag 'hwmon-for-v5.16-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
hwmon: (lm90) Do not report 'busy' status bit as alarm
hwmom: (lm90) Fix citical alarm status for MAX6680/MAX6681
hwmon: (lm90) Drop critical attribute support for MAX6654
hwmon: (lm90) Prevent integer overflow/underflow in hysteresis calculations
hwmon: (lm90) Fix usage of CONFIG2 register in detect function

Changed files
+62 -44
drivers
hwmon
+62 -44
drivers/hwmon/lm90.c
··· 35 35 * explicitly as max6659, or if its address is not 0x4c. 36 36 * These chips lack the remote temperature offset feature. 37 37 * 38 - * This driver also supports the MAX6654 chip made by Maxim. This chip can 39 - * be at 9 different addresses, similar to MAX6680/MAX6681. The MAX6654 is 40 - * otherwise similar to MAX6657/MAX6658/MAX6659. Extended range is available 41 - * by setting the configuration register accordingly, and is done during 42 - * initialization. Extended precision is only available at conversion rates 43 - * of 1 Hz and slower. Note that extended precision is not enabled by 44 - * default, as this driver initializes all chips to 2 Hz by design. 38 + * This driver also supports the MAX6654 chip made by Maxim. This chip can be 39 + * at 9 different addresses, similar to MAX6680/MAX6681. The MAX6654 is similar 40 + * to MAX6657/MAX6658/MAX6659, but does not support critical temperature 41 + * limits. Extended range is available by setting the configuration register 42 + * accordingly, and is done during initialization. Extended precision is only 43 + * available at conversion rates of 1 Hz and slower. Note that extended 44 + * precision is not enabled by default, as this driver initializes all chips 45 + * to 2 Hz by design. 45 46 * 46 47 * This driver also supports the MAX6646, MAX6647, MAX6648, MAX6649 and 47 48 * MAX6692 chips made by Maxim. These are again similar to the LM86, ··· 189 188 #define LM90_HAVE_BROKEN_ALERT (1 << 7) /* Broken alert */ 190 189 #define LM90_HAVE_EXTENDED_TEMP (1 << 8) /* extended temperature support*/ 191 190 #define LM90_PAUSE_FOR_CONFIG (1 << 9) /* Pause conversion for config */ 191 + #define LM90_HAVE_CRIT (1 << 10)/* Chip supports CRIT/OVERT register */ 192 + #define LM90_HAVE_CRIT_ALRM_SWP (1 << 11)/* critical alarm bits swapped */ 192 193 193 194 /* LM90 status */ 194 195 #define LM90_STATUS_LTHRM (1 << 0) /* local THERM limit tripped */ ··· 200 197 #define LM90_STATUS_RHIGH (1 << 4) /* remote high temp limit tripped */ 201 198 #define LM90_STATUS_LLOW (1 << 5) /* local low temp limit tripped */ 202 199 #define LM90_STATUS_LHIGH (1 << 6) /* local high temp limit tripped */ 200 + #define LM90_STATUS_BUSY (1 << 7) /* conversion is ongoing */ 203 201 204 202 #define MAX6696_STATUS2_R2THRM (1 << 1) /* remote2 THERM limit tripped */ 205 203 #define MAX6696_STATUS2_R2OPEN (1 << 2) /* remote2 is an open circuit */ ··· 358 354 static const struct lm90_params lm90_params[] = { 359 355 [adm1032] = { 360 356 .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 361 - | LM90_HAVE_BROKEN_ALERT, 357 + | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_CRIT, 362 358 .alert_alarms = 0x7c, 363 359 .max_convrate = 10, 364 360 }, 365 361 [adt7461] = { 366 362 .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 367 - | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP, 363 + | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP 364 + | LM90_HAVE_CRIT, 368 365 .alert_alarms = 0x7c, 369 366 .max_convrate = 10, 370 367 }, 371 368 [g781] = { 372 369 .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 373 - | LM90_HAVE_BROKEN_ALERT, 370 + | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_CRIT, 374 371 .alert_alarms = 0x7c, 375 372 .max_convrate = 8, 376 373 }, 377 374 [lm86] = { 378 - .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT, 375 + .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 376 + | LM90_HAVE_CRIT, 379 377 .alert_alarms = 0x7b, 380 378 .max_convrate = 9, 381 379 }, 382 380 [lm90] = { 383 - .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT, 381 + .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 382 + | LM90_HAVE_CRIT, 384 383 .alert_alarms = 0x7b, 385 384 .max_convrate = 9, 386 385 }, 387 386 [lm99] = { 388 - .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT, 387 + .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 388 + | LM90_HAVE_CRIT, 389 389 .alert_alarms = 0x7b, 390 390 .max_convrate = 9, 391 391 }, 392 392 [max6646] = { 393 + .flags = LM90_HAVE_CRIT, 393 394 .alert_alarms = 0x7c, 394 395 .max_convrate = 6, 395 396 .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL, ··· 405 396 .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL, 406 397 }, 407 398 [max6657] = { 408 - .flags = LM90_PAUSE_FOR_CONFIG, 399 + .flags = LM90_PAUSE_FOR_CONFIG | LM90_HAVE_CRIT, 409 400 .alert_alarms = 0x7c, 410 401 .max_convrate = 8, 411 402 .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL, 412 403 }, 413 404 [max6659] = { 414 - .flags = LM90_HAVE_EMERGENCY, 405 + .flags = LM90_HAVE_EMERGENCY | LM90_HAVE_CRIT, 415 406 .alert_alarms = 0x7c, 416 407 .max_convrate = 8, 417 408 .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL, 418 409 }, 419 410 [max6680] = { 420 - .flags = LM90_HAVE_OFFSET, 411 + .flags = LM90_HAVE_OFFSET | LM90_HAVE_CRIT 412 + | LM90_HAVE_CRIT_ALRM_SWP, 421 413 .alert_alarms = 0x7c, 422 414 .max_convrate = 7, 423 415 }, 424 416 [max6696] = { 425 417 .flags = LM90_HAVE_EMERGENCY 426 - | LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3, 418 + | LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3 | LM90_HAVE_CRIT, 427 419 .alert_alarms = 0x1c7c, 428 420 .max_convrate = 6, 429 421 .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL, 430 422 }, 431 423 [w83l771] = { 432 - .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT, 424 + .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT | LM90_HAVE_CRIT, 433 425 .alert_alarms = 0x7c, 434 426 .max_convrate = 8, 435 427 }, 436 428 [sa56004] = { 437 - .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT, 429 + .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT | LM90_HAVE_CRIT, 438 430 .alert_alarms = 0x7b, 439 431 .max_convrate = 9, 440 432 .reg_local_ext = SA56004_REG_R_LOCAL_TEMPL, 441 433 }, 442 434 [tmp451] = { 443 435 .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 444 - | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP, 436 + | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP | LM90_HAVE_CRIT, 445 437 .alert_alarms = 0x7c, 446 438 .max_convrate = 9, 447 439 .reg_local_ext = TMP451_REG_R_LOCAL_TEMPL, 448 440 }, 449 441 [tmp461] = { 450 442 .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 451 - | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP, 443 + | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP | LM90_HAVE_CRIT, 452 444 .alert_alarms = 0x7c, 453 445 .max_convrate = 9, 454 446 .reg_local_ext = TMP451_REG_R_LOCAL_TEMPL, ··· 678 668 struct i2c_client *client = data->client; 679 669 int val; 680 670 681 - val = lm90_read_reg(client, LM90_REG_R_LOCAL_CRIT); 682 - if (val < 0) 683 - return val; 684 - data->temp8[LOCAL_CRIT] = val; 671 + if (data->flags & LM90_HAVE_CRIT) { 672 + val = lm90_read_reg(client, LM90_REG_R_LOCAL_CRIT); 673 + if (val < 0) 674 + return val; 675 + data->temp8[LOCAL_CRIT] = val; 685 676 686 - val = lm90_read_reg(client, LM90_REG_R_REMOTE_CRIT); 687 - if (val < 0) 688 - return val; 689 - data->temp8[REMOTE_CRIT] = val; 677 + val = lm90_read_reg(client, LM90_REG_R_REMOTE_CRIT); 678 + if (val < 0) 679 + return val; 680 + data->temp8[REMOTE_CRIT] = val; 690 681 691 - val = lm90_read_reg(client, LM90_REG_R_TCRIT_HYST); 692 - if (val < 0) 693 - return val; 694 - data->temp_hyst = val; 682 + val = lm90_read_reg(client, LM90_REG_R_TCRIT_HYST); 683 + if (val < 0) 684 + return val; 685 + data->temp_hyst = val; 686 + } 695 687 696 688 val = lm90_read_reg(client, LM90_REG_R_REMOTE_LOWH); 697 689 if (val < 0) ··· 821 809 val = lm90_read_reg(client, LM90_REG_R_STATUS); 822 810 if (val < 0) 823 811 return val; 824 - data->alarms = val; /* lower 8 bit of alarms */ 812 + data->alarms = val & ~LM90_STATUS_BUSY; 825 813 826 814 if (data->kind == max6696) { 827 815 val = lm90_select_remote_channel(data, 1); ··· 1172 1160 else 1173 1161 temp = temp_from_s8(data->temp8[LOCAL_CRIT]); 1174 1162 1175 - /* prevent integer underflow */ 1176 - val = max(val, -128000l); 1163 + /* prevent integer overflow/underflow */ 1164 + val = clamp_val(val, -128000l, 255000l); 1177 1165 1178 1166 data->temp_hyst = hyst_to_reg(temp - val); 1179 1167 err = i2c_smbus_write_byte_data(client, LM90_REG_W_TCRIT_HYST, ··· 1204 1192 static const u8 lm90_min_alarm_bits[3] = { 5, 3, 11 }; 1205 1193 static const u8 lm90_max_alarm_bits[3] = { 6, 4, 12 }; 1206 1194 static const u8 lm90_crit_alarm_bits[3] = { 0, 1, 9 }; 1195 + static const u8 lm90_crit_alarm_bits_swapped[3] = { 1, 0, 9 }; 1207 1196 static const u8 lm90_emergency_alarm_bits[3] = { 15, 13, 14 }; 1208 1197 static const u8 lm90_fault_bits[3] = { 0, 2, 10 }; 1209 1198 ··· 1230 1217 *val = (data->alarms >> lm90_max_alarm_bits[channel]) & 1; 1231 1218 break; 1232 1219 case hwmon_temp_crit_alarm: 1233 - *val = (data->alarms >> lm90_crit_alarm_bits[channel]) & 1; 1220 + if (data->flags & LM90_HAVE_CRIT_ALRM_SWP) 1221 + *val = (data->alarms >> lm90_crit_alarm_bits_swapped[channel]) & 1; 1222 + else 1223 + *val = (data->alarms >> lm90_crit_alarm_bits[channel]) & 1; 1234 1224 break; 1235 1225 case hwmon_temp_emergency_alarm: 1236 1226 *val = (data->alarms >> lm90_emergency_alarm_bits[channel]) & 1; ··· 1481 1465 if (man_id < 0 || chip_id < 0 || config1 < 0 || convrate < 0) 1482 1466 return -ENODEV; 1483 1467 1484 - if (man_id == 0x01 || man_id == 0x5C || man_id == 0x41) { 1468 + if (man_id == 0x01 || man_id == 0x5C || man_id == 0xA1) { 1485 1469 config2 = i2c_smbus_read_byte_data(client, LM90_REG_R_CONFIG2); 1486 1470 if (config2 < 0) 1487 1471 return -ENODEV; 1488 - } else 1489 - config2 = 0; /* Make compiler happy */ 1472 + } 1490 1473 1491 1474 if ((address == 0x4C || address == 0x4D) 1492 1475 && man_id == 0x01) { /* National Semiconductor */ ··· 1918 1903 info->config = data->channel_config; 1919 1904 1920 1905 data->channel_config[0] = HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX | 1921 - HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM | 1922 - HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM; 1906 + HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM; 1923 1907 data->channel_config[1] = HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX | 1924 - HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM | 1925 - HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_FAULT; 1908 + HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM | HWMON_T_FAULT; 1909 + 1910 + if (data->flags & LM90_HAVE_CRIT) { 1911 + data->channel_config[0] |= HWMON_T_CRIT | HWMON_T_CRIT_ALARM | HWMON_T_CRIT_HYST; 1912 + data->channel_config[1] |= HWMON_T_CRIT | HWMON_T_CRIT_ALARM | HWMON_T_CRIT_HYST; 1913 + } 1926 1914 1927 1915 if (data->flags & LM90_HAVE_OFFSET) 1928 1916 data->channel_config[1] |= HWMON_T_OFFSET;