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,
@@ -188,6 +189,8 @@ enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
188
189
#define LM90_HAVE_BROKEN_ALERT (1 << 7) /* Broken alert */
189
190
#define LM90_HAVE_EXTENDED_TEMP (1 << 8) /* extended temperature support*/
190
191
#define LM90_PAUSE_FOR_CONFIG (1 << 9) /* Pause conversion for config */
192
+ #define LM90_HAVE_CRIT (1 << 10)/* Chip supports CRIT/OVERT register */
193
+ #define LM90_HAVE_CRIT_ALRM_SWP (1 << 11)/* critical alarm bits swapped */
191
194
192
195
/* LM90 status */
193
196
#define LM90_STATUS_LTHRM (1 << 0) /* local THERM limit tripped */
@@ -197,6 +200,7 @@ enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
197
200
#define LM90_STATUS_RHIGH (1 << 4) /* remote high temp limit tripped */
198
201
#define LM90_STATUS_LLOW (1 << 5) /* local low temp limit tripped */
199
202
#define LM90_STATUS_LHIGH (1 << 6) /* local high temp limit tripped */
203
+ #define LM90_STATUS_BUSY (1 << 7) /* conversion is ongoing */
200
204
201
205
#define MAX6696_STATUS2_R2THRM (1 << 1) /* remote2 THERM limit tripped */
202
206
#define MAX6696_STATUS2_R2OPEN (1 << 2) /* remote2 is an open circuit */
@@ -354,38 +358,43 @@ struct lm90_params {
354
358
static const struct lm90_params lm90_params [] = {
355
359
[adm1032 ] = {
356
360
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
357
- | LM90_HAVE_BROKEN_ALERT ,
361
+ | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_CRIT ,
358
362
.alert_alarms = 0x7c ,
359
363
.max_convrate = 10 ,
360
364
},
361
365
[adt7461 ] = {
362
366
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
363
- | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP ,
367
+ | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP
368
+ | LM90_HAVE_CRIT ,
364
369
.alert_alarms = 0x7c ,
365
370
.max_convrate = 10 ,
366
371
},
367
372
[g781 ] = {
368
373
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
369
- | LM90_HAVE_BROKEN_ALERT ,
374
+ | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_CRIT ,
370
375
.alert_alarms = 0x7c ,
371
376
.max_convrate = 8 ,
372
377
},
373
378
[lm86 ] = {
374
- .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT ,
379
+ .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
380
+ | LM90_HAVE_CRIT ,
375
381
.alert_alarms = 0x7b ,
376
382
.max_convrate = 9 ,
377
383
},
378
384
[lm90 ] = {
379
- .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT ,
385
+ .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
386
+ | LM90_HAVE_CRIT ,
380
387
.alert_alarms = 0x7b ,
381
388
.max_convrate = 9 ,
382
389
},
383
390
[lm99 ] = {
384
- .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT ,
391
+ .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
392
+ | LM90_HAVE_CRIT ,
385
393
.alert_alarms = 0x7b ,
386
394
.max_convrate = 9 ,
387
395
},
388
396
[max6646 ] = {
397
+ .flags = LM90_HAVE_CRIT ,
389
398
.alert_alarms = 0x7c ,
390
399
.max_convrate = 6 ,
391
400
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL ,
@@ -396,50 +405,51 @@ static const struct lm90_params lm90_params[] = {
396
405
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL ,
397
406
},
398
407
[max6657 ] = {
399
- .flags = LM90_PAUSE_FOR_CONFIG ,
408
+ .flags = LM90_PAUSE_FOR_CONFIG | LM90_HAVE_CRIT ,
400
409
.alert_alarms = 0x7c ,
401
410
.max_convrate = 8 ,
402
411
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL ,
403
412
},
404
413
[max6659 ] = {
405
- .flags = LM90_HAVE_EMERGENCY ,
414
+ .flags = LM90_HAVE_EMERGENCY | LM90_HAVE_CRIT ,
406
415
.alert_alarms = 0x7c ,
407
416
.max_convrate = 8 ,
408
417
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL ,
409
418
},
410
419
[max6680 ] = {
411
- .flags = LM90_HAVE_OFFSET ,
420
+ .flags = LM90_HAVE_OFFSET | LM90_HAVE_CRIT
421
+ | LM90_HAVE_CRIT_ALRM_SWP ,
412
422
.alert_alarms = 0x7c ,
413
423
.max_convrate = 7 ,
414
424
},
415
425
[max6696 ] = {
416
426
.flags = LM90_HAVE_EMERGENCY
417
- | LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3 ,
427
+ | LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3 | LM90_HAVE_CRIT ,
418
428
.alert_alarms = 0x1c7c ,
419
429
.max_convrate = 6 ,
420
430
.reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL ,
421
431
},
422
432
[w83l771 ] = {
423
- .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT ,
433
+ .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT | LM90_HAVE_CRIT ,
424
434
.alert_alarms = 0x7c ,
425
435
.max_convrate = 8 ,
426
436
},
427
437
[sa56004 ] = {
428
- .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT ,
438
+ .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT | LM90_HAVE_CRIT ,
429
439
.alert_alarms = 0x7b ,
430
440
.max_convrate = 9 ,
431
441
.reg_local_ext = SA56004_REG_R_LOCAL_TEMPL ,
432
442
},
433
443
[tmp451 ] = {
434
444
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
435
- | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP ,
445
+ | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP | LM90_HAVE_CRIT ,
436
446
.alert_alarms = 0x7c ,
437
447
.max_convrate = 9 ,
438
448
.reg_local_ext = TMP451_REG_R_LOCAL_TEMPL ,
439
449
},
440
450
[tmp461 ] = {
441
451
.flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
442
- | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP ,
452
+ | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP | LM90_HAVE_CRIT ,
443
453
.alert_alarms = 0x7c ,
444
454
.max_convrate = 9 ,
445
455
.reg_local_ext = TMP451_REG_R_LOCAL_TEMPL ,
@@ -668,20 +678,22 @@ static int lm90_update_limits(struct device *dev)
668
678
struct i2c_client * client = data -> client ;
669
679
int val ;
670
680
671
- val = lm90_read_reg (client , LM90_REG_R_LOCAL_CRIT );
672
- if (val < 0 )
673
- return val ;
674
- data -> temp8 [LOCAL_CRIT ] = val ;
681
+ if (data -> flags & LM90_HAVE_CRIT ) {
682
+ val = lm90_read_reg (client , LM90_REG_R_LOCAL_CRIT );
683
+ if (val < 0 )
684
+ return val ;
685
+ data -> temp8 [LOCAL_CRIT ] = val ;
675
686
676
- val = lm90_read_reg (client , LM90_REG_R_REMOTE_CRIT );
677
- if (val < 0 )
678
- return val ;
679
- data -> temp8 [REMOTE_CRIT ] = val ;
687
+ val = lm90_read_reg (client , LM90_REG_R_REMOTE_CRIT );
688
+ if (val < 0 )
689
+ return val ;
690
+ data -> temp8 [REMOTE_CRIT ] = val ;
680
691
681
- val = lm90_read_reg (client , LM90_REG_R_TCRIT_HYST );
682
- if (val < 0 )
683
- return val ;
684
- data -> temp_hyst = val ;
692
+ val = lm90_read_reg (client , LM90_REG_R_TCRIT_HYST );
693
+ if (val < 0 )
694
+ return val ;
695
+ data -> temp_hyst = val ;
696
+ }
685
697
686
698
val = lm90_read_reg (client , LM90_REG_R_REMOTE_LOWH );
687
699
if (val < 0 )
@@ -809,7 +821,7 @@ static int lm90_update_device(struct device *dev)
809
821
val = lm90_read_reg (client , LM90_REG_R_STATUS );
810
822
if (val < 0 )
811
823
return val ;
812
- data -> alarms = val ; /* lower 8 bit of alarms */
824
+ data -> alarms = val & ~ LM90_STATUS_BUSY ;
813
825
814
826
if (data -> kind == max6696 ) {
815
827
val = lm90_select_remote_channel (data , 1 );
@@ -1160,8 +1172,8 @@ static int lm90_set_temphyst(struct lm90_data *data, long val)
1160
1172
else
1161
1173
temp = temp_from_s8 (data -> temp8 [LOCAL_CRIT ]);
1162
1174
1163
- /* prevent integer underflow */
1164
- val = max (val , -128000l );
1175
+ /* prevent integer overflow/ underflow */
1176
+ val = clamp_val (val , -128000l , 255000l );
1165
1177
1166
1178
data -> temp_hyst = hyst_to_reg (temp - val );
1167
1179
err = i2c_smbus_write_byte_data (client , LM90_REG_W_TCRIT_HYST ,
@@ -1192,6 +1204,7 @@ static const u8 lm90_temp_emerg_index[3] = {
1192
1204
static const u8 lm90_min_alarm_bits [3 ] = { 5 , 3 , 11 };
1193
1205
static const u8 lm90_max_alarm_bits [3 ] = { 6 , 4 , 12 };
1194
1206
static const u8 lm90_crit_alarm_bits [3 ] = { 0 , 1 , 9 };
1207
+ static const u8 lm90_crit_alarm_bits_swapped [3 ] = { 1 , 0 , 9 };
1195
1208
static const u8 lm90_emergency_alarm_bits [3 ] = { 15 , 13 , 14 };
1196
1209
static const u8 lm90_fault_bits [3 ] = { 0 , 2 , 10 };
1197
1210
@@ -1217,7 +1230,10 @@ static int lm90_temp_read(struct device *dev, u32 attr, int channel, long *val)
1217
1230
* val = (data -> alarms >> lm90_max_alarm_bits [channel ]) & 1 ;
1218
1231
break ;
1219
1232
case hwmon_temp_crit_alarm :
1220
- * val = (data -> alarms >> lm90_crit_alarm_bits [channel ]) & 1 ;
1233
+ if (data -> flags & LM90_HAVE_CRIT_ALRM_SWP )
1234
+ * val = (data -> alarms >> lm90_crit_alarm_bits_swapped [channel ]) & 1 ;
1235
+ else
1236
+ * val = (data -> alarms >> lm90_crit_alarm_bits [channel ]) & 1 ;
1221
1237
break ;
1222
1238
case hwmon_temp_emergency_alarm :
1223
1239
* val = (data -> alarms >> lm90_emergency_alarm_bits [channel ]) & 1 ;
@@ -1465,12 +1481,11 @@ static int lm90_detect(struct i2c_client *client,
1465
1481
if (man_id < 0 || chip_id < 0 || config1 < 0 || convrate < 0 )
1466
1482
return - ENODEV ;
1467
1483
1468
- if (man_id == 0x01 || man_id == 0x5C || man_id == 0x41 ) {
1484
+ if (man_id == 0x01 || man_id == 0x5C || man_id == 0xA1 ) {
1469
1485
config2 = i2c_smbus_read_byte_data (client , LM90_REG_R_CONFIG2 );
1470
1486
if (config2 < 0 )
1471
1487
return - ENODEV ;
1472
- } else
1473
- config2 = 0 ; /* Make compiler happy */
1488
+ }
1474
1489
1475
1490
if ((address == 0x4C || address == 0x4D )
1476
1491
&& man_id == 0x01 ) { /* National Semiconductor */
@@ -1903,11 +1918,14 @@ static int lm90_probe(struct i2c_client *client)
1903
1918
info -> config = data -> channel_config ;
1904
1919
1905
1920
data -> channel_config [0 ] = HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |
1906
- HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM |
1907
- HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM ;
1921
+ HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM ;
1908
1922
data -> channel_config [1 ] = HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |
1909
- HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM |
1910
- HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_FAULT ;
1923
+ HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM | HWMON_T_FAULT ;
1924
+
1925
+ if (data -> flags & LM90_HAVE_CRIT ) {
1926
+ data -> channel_config [0 ] |= HWMON_T_CRIT | HWMON_T_CRIT_ALARM | HWMON_T_CRIT_HYST ;
1927
+ data -> channel_config [1 ] |= HWMON_T_CRIT | HWMON_T_CRIT_ALARM | HWMON_T_CRIT_HYST ;
1928
+ }
1911
1929
1912
1930
if (data -> flags & LM90_HAVE_OFFSET )
1913
1931
data -> channel_config [1 ] |= HWMON_T_OFFSET ;
0 commit comments