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 {
354356static 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