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

Configure Feed

Select the types of activity you want to include in your feed.

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

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