Skip to content

Commit 16ba51b

Browse files
committed
hwmon: (lm90) Drop critical attribute support for MAX6654
Tests with a real chip and a closer look into the datasheet show that MAX6654 does not support CRIT/THERM/OVERTEMP limits, so drop support of the respective attributes for this chip. Introduce LM90_HAVE_CRIT flag and use it to instantiate critical limit attributes to solve the problem. Cc: Josh Lehan <[email protected]> Fixes: 229d495 ("hwmon: (lm90) Add max6654 support to lm90 driver") Signed-off-by: Guenter Roeck <[email protected]>
1 parent 55840b9 commit 16ba51b

File tree

1 file changed

+49
-37
lines changed

1 file changed

+49
-37
lines changed

drivers/hwmon/lm90.c

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,14 @@
3535
* explicitly as max6659, or if its address is not 0x4c.
3636
* These chips lack the remote temperature offset feature.
3737
*
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.
4546
*
4647
* This driver also supports the MAX6646, MAX6647, MAX6648, MAX6649 and
4748
* MAX6692 chips made by Maxim. These are again similar to the LM86,
@@ -188,6 +189,7 @@ enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
188189
#define LM90_HAVE_BROKEN_ALERT (1 << 7) /* Broken alert */
189190
#define LM90_HAVE_EXTENDED_TEMP (1 << 8) /* extended temperature support*/
190191
#define LM90_PAUSE_FOR_CONFIG (1 << 9) /* Pause conversion for config */
192+
#define LM90_HAVE_CRIT (1 << 10)/* Chip supports CRIT/OVERT register */
191193

192194
/* LM90 status */
193195
#define LM90_STATUS_LTHRM (1 << 0) /* local THERM limit tripped */
@@ -354,38 +356,43 @@ struct lm90_params {
354356
static const struct lm90_params lm90_params[] = {
355357
[adm1032] = {
356358
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
357-
| LM90_HAVE_BROKEN_ALERT,
359+
| LM90_HAVE_BROKEN_ALERT | LM90_HAVE_CRIT,
358360
.alert_alarms = 0x7c,
359361
.max_convrate = 10,
360362
},
361363
[adt7461] = {
362364
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
363-
| LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP,
365+
| LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP
366+
| LM90_HAVE_CRIT,
364367
.alert_alarms = 0x7c,
365368
.max_convrate = 10,
366369
},
367370
[g781] = {
368371
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
369-
| LM90_HAVE_BROKEN_ALERT,
372+
| LM90_HAVE_BROKEN_ALERT | LM90_HAVE_CRIT,
370373
.alert_alarms = 0x7c,
371374
.max_convrate = 8,
372375
},
373376
[lm86] = {
374-
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT,
377+
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
378+
| LM90_HAVE_CRIT,
375379
.alert_alarms = 0x7b,
376380
.max_convrate = 9,
377381
},
378382
[lm90] = {
379-
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT,
383+
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
384+
| LM90_HAVE_CRIT,
380385
.alert_alarms = 0x7b,
381386
.max_convrate = 9,
382387
},
383388
[lm99] = {
384-
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT,
389+
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
390+
| LM90_HAVE_CRIT,
385391
.alert_alarms = 0x7b,
386392
.max_convrate = 9,
387393
},
388394
[max6646] = {
395+
.flags = LM90_HAVE_CRIT,
389396
.alert_alarms = 0x7c,
390397
.max_convrate = 6,
391398
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
@@ -396,50 +403,50 @@ static const struct lm90_params lm90_params[] = {
396403
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
397404
},
398405
[max6657] = {
399-
.flags = LM90_PAUSE_FOR_CONFIG,
406+
.flags = LM90_PAUSE_FOR_CONFIG | LM90_HAVE_CRIT,
400407
.alert_alarms = 0x7c,
401408
.max_convrate = 8,
402409
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
403410
},
404411
[max6659] = {
405-
.flags = LM90_HAVE_EMERGENCY,
412+
.flags = LM90_HAVE_EMERGENCY | LM90_HAVE_CRIT,
406413
.alert_alarms = 0x7c,
407414
.max_convrate = 8,
408415
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
409416
},
410417
[max6680] = {
411-
.flags = LM90_HAVE_OFFSET,
418+
.flags = LM90_HAVE_OFFSET | LM90_HAVE_CRIT,
412419
.alert_alarms = 0x7c,
413420
.max_convrate = 7,
414421
},
415422
[max6696] = {
416423
.flags = LM90_HAVE_EMERGENCY
417-
| LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3,
424+
| LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3 | LM90_HAVE_CRIT,
418425
.alert_alarms = 0x1c7c,
419426
.max_convrate = 6,
420427
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
421428
},
422429
[w83l771] = {
423-
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT,
430+
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT | LM90_HAVE_CRIT,
424431
.alert_alarms = 0x7c,
425432
.max_convrate = 8,
426433
},
427434
[sa56004] = {
428-
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT,
435+
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT | LM90_HAVE_CRIT,
429436
.alert_alarms = 0x7b,
430437
.max_convrate = 9,
431438
.reg_local_ext = SA56004_REG_R_LOCAL_TEMPL,
432439
},
433440
[tmp451] = {
434441
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
435-
| LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP,
442+
| LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP | LM90_HAVE_CRIT,
436443
.alert_alarms = 0x7c,
437444
.max_convrate = 9,
438445
.reg_local_ext = TMP451_REG_R_LOCAL_TEMPL,
439446
},
440447
[tmp461] = {
441448
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
442-
| LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP,
449+
| LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP | LM90_HAVE_CRIT,
443450
.alert_alarms = 0x7c,
444451
.max_convrate = 9,
445452
.reg_local_ext = TMP451_REG_R_LOCAL_TEMPL,
@@ -668,20 +675,22 @@ static int lm90_update_limits(struct device *dev)
668675
struct i2c_client *client = data->client;
669676
int val;
670677

671-
val = lm90_read_reg(client, LM90_REG_R_LOCAL_CRIT);
672-
if (val < 0)
673-
return val;
674-
data->temp8[LOCAL_CRIT] = val;
678+
if (data->flags & LM90_HAVE_CRIT) {
679+
val = lm90_read_reg(client, LM90_REG_R_LOCAL_CRIT);
680+
if (val < 0)
681+
return val;
682+
data->temp8[LOCAL_CRIT] = val;
675683

676-
val = lm90_read_reg(client, LM90_REG_R_REMOTE_CRIT);
677-
if (val < 0)
678-
return val;
679-
data->temp8[REMOTE_CRIT] = val;
684+
val = lm90_read_reg(client, LM90_REG_R_REMOTE_CRIT);
685+
if (val < 0)
686+
return val;
687+
data->temp8[REMOTE_CRIT] = val;
680688

681-
val = lm90_read_reg(client, LM90_REG_R_TCRIT_HYST);
682-
if (val < 0)
683-
return val;
684-
data->temp_hyst = val;
689+
val = lm90_read_reg(client, LM90_REG_R_TCRIT_HYST);
690+
if (val < 0)
691+
return val;
692+
data->temp_hyst = val;
693+
}
685694

686695
val = lm90_read_reg(client, LM90_REG_R_REMOTE_LOWH);
687696
if (val < 0)
@@ -1902,11 +1911,14 @@ static int lm90_probe(struct i2c_client *client)
19021911
info->config = data->channel_config;
19031912

19041913
data->channel_config[0] = HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |
1905-
HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM |
1906-
HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM;
1914+
HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM;
19071915
data->channel_config[1] = HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |
1908-
HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM |
1909-
HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_FAULT;
1916+
HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM | HWMON_T_FAULT;
1917+
1918+
if (data->flags & LM90_HAVE_CRIT) {
1919+
data->channel_config[0] |= HWMON_T_CRIT | HWMON_T_CRIT_ALARM | HWMON_T_CRIT_HYST;
1920+
data->channel_config[1] |= HWMON_T_CRIT | HWMON_T_CRIT_ALARM | HWMON_T_CRIT_HYST;
1921+
}
19101922

19111923
if (data->flags & LM90_HAVE_OFFSET)
19121924
data->channel_config[1] |= HWMON_T_OFFSET;

0 commit comments

Comments
 (0)