25
25
#define THERMAL_SMSC_ID_REG 0xfe
26
26
#define THERMAL_REVISION_REG 0xff
27
27
28
- enum emc1403_chip { emc1402 , emc1403 , emc1404 };
28
+ enum emc1403_chip { emc1402 , emc1403 , emc1404 , emc1428 };
29
29
30
30
struct thermal_data {
31
31
enum emc1403_chip chip ;
@@ -100,6 +100,12 @@ static int emc1403_detect(struct i2c_client *client,
100
100
case 0x27 :
101
101
strscpy (info -> type , "emc1424" , I2C_NAME_SIZE );
102
102
break ;
103
+ case 0x29 :
104
+ strscpy (info -> type , "emc1428" , I2C_NAME_SIZE );
105
+ break ;
106
+ case 0x59 :
107
+ strscpy (info -> type , "emc1438" , I2C_NAME_SIZE );
108
+ break ;
103
109
case 0x60 :
104
110
strscpy (info -> type , "emc1442" , I2C_NAME_SIZE );
105
111
break ;
@@ -130,6 +136,14 @@ static bool emc1403_regmap_is_volatile(struct device *dev, unsigned int reg)
130
136
case 0x35 : /* high limit status */
131
137
case 0x36 : /* low limit status */
132
138
case 0x37 : /* therm limit status */
139
+ case 0x41 : /* external diode 4 high byte */
140
+ case 0x42 : /* external diode 4 low byte */
141
+ case 0x43 : /* external diode 5 high byte */
142
+ case 0x44 : /* external diode 5 low byte */
143
+ case 0x45 : /* external diode 6 high byte */
144
+ case 0x46 : /* external diode 6 low byte */
145
+ case 0x47 : /* external diode 7 high byte */
146
+ case 0x48 : /* external diode 7 low byte */
133
147
return true;
134
148
default :
135
149
return false;
@@ -177,6 +191,30 @@ static u8 emc1403_temp_regs[][4] = {
177
191
[temp_crit ] = 0x30 ,
178
192
[temp_input ] = 0x2a ,
179
193
},
194
+ [4 ] = {
195
+ [temp_min ] = 0x51 ,
196
+ [temp_max ] = 0x50 ,
197
+ [temp_crit ] = 0x64 ,
198
+ [temp_input ] = 0x41 ,
199
+ },
200
+ [5 ] = {
201
+ [temp_min ] = 0x55 ,
202
+ [temp_max ] = 0x54 ,
203
+ [temp_crit ] = 0x65 ,
204
+ [temp_input ] = 0x43
205
+ },
206
+ [6 ] = {
207
+ [temp_min ] = 0x59 ,
208
+ [temp_max ] = 0x58 ,
209
+ [temp_crit ] = 0x66 ,
210
+ [temp_input ] = 0x45 ,
211
+ },
212
+ [7 ] = {
213
+ [temp_min ] = 0x5d ,
214
+ [temp_max ] = 0x5c ,
215
+ [temp_crit ] = 0x67 ,
216
+ [temp_input ] = 0x47 ,
217
+ },
180
218
};
181
219
182
220
static s8 emc1403_temp_regs_low [][4 ] = {
@@ -204,27 +242,56 @@ static s8 emc1403_temp_regs_low[][4] = {
204
242
[temp_crit ] = -1 ,
205
243
[temp_input ] = 0x2b ,
206
244
},
245
+ [4 ] = {
246
+ [temp_min ] = 0x53 ,
247
+ [temp_max ] = 0x52 ,
248
+ [temp_crit ] = -1 ,
249
+ [temp_input ] = 0x42 ,
250
+ },
251
+ [5 ] = {
252
+ [temp_min ] = 0x57 ,
253
+ [temp_max ] = 0x56 ,
254
+ [temp_crit ] = -1 ,
255
+ [temp_input ] = 0x44 ,
256
+ },
257
+ [6 ] = {
258
+ [temp_min ] = 0x5b ,
259
+ [temp_max ] = 0x5a ,
260
+ [temp_crit ] = -1 ,
261
+ [temp_input ] = 0x46 ,
262
+ },
263
+ [7 ] = {
264
+ [temp_min ] = 0x5f ,
265
+ [temp_max ] = 0x5e ,
266
+ [temp_crit ] = -1 ,
267
+ [temp_input ] = 0x48 ,
268
+ },
207
269
};
208
270
209
271
static int __emc1403_get_temp (struct thermal_data * data , int channel ,
210
272
enum emc1403_reg_map map , long * val )
211
273
{
212
- unsigned int regval ;
274
+ unsigned int regvalh ;
275
+ unsigned int regvall = 0 ;
213
276
int ret ;
214
277
s8 reg ;
215
278
216
- ret = regmap_read (data -> regmap , emc1403_temp_regs [channel ][map ], & regval );
279
+ ret = regmap_read (data -> regmap , emc1403_temp_regs [channel ][map ], & regvalh );
217
280
if (ret < 0 )
218
281
return ret ;
219
- * val = regval * 1000 ;
220
282
221
283
reg = emc1403_temp_regs_low [channel ][map ];
222
284
if (reg >= 0 ) {
223
- ret = regmap_read (data -> regmap , reg , & regval );
285
+ ret = regmap_read (data -> regmap , reg , & regvall );
224
286
if (ret < 0 )
225
287
return ret ;
226
- * val += (regval >> 5 ) * 125 ;
227
288
}
289
+
290
+ if (data -> chip == emc1428 )
291
+ * val = sign_extend32 ((regvalh << 3 ) | (regvall >> 5 ), 10 ) * 125 ;
292
+ else
293
+ * val = ((regvalh << 3 ) | (regvall >> 5 )) * 125 ;
294
+
228
295
return 0 ;
229
296
}
230
297
@@ -379,15 +446,21 @@ static int emc1403_set_hyst(struct thermal_data *data, long val)
379
446
int hyst , ret ;
380
447
long limit ;
381
448
382
- val = clamp_val (val , 0 , 255000 );
449
+ if (data -> chip == emc1428 )
450
+ val = clamp_val (val , -128000 , 127000 );
451
+ else
452
+ val = clamp_val (val , 0 , 255000 );
383
453
384
454
mutex_lock (& data -> mutex );
385
455
ret = __emc1403_get_temp (data , 0 , temp_crit , & limit );
386
456
if (ret < 0 )
387
457
goto unlock ;
388
458
389
459
hyst = limit - val ;
390
- hyst = clamp_val (DIV_ROUND_CLOSEST (hyst , 1000 ), 0 , 255 );
460
+ if (data -> chip == emc1428 )
461
+ hyst = clamp_val (DIV_ROUND_CLOSEST (hyst , 1000 ), 0 , 127 );
462
+ else
463
+ hyst = clamp_val (DIV_ROUND_CLOSEST (hyst , 1000 ), 0 , 255 );
391
464
ret = regmap_write (data -> regmap , 0x21 , hyst );
392
465
unlock :
393
466
mutex_unlock (& data -> mutex );
@@ -407,14 +480,20 @@ static int emc1403_set_temp(struct thermal_data *data, int channel,
407
480
408
481
mutex_lock (& data -> mutex );
409
482
if (regl >= 0 ) {
410
- val = clamp_val (val , 0 , 255875 );
483
+ if (data -> chip == emc1428 )
484
+ val = clamp_val (val , -128000 , 127875 );
485
+ else
486
+ val = clamp_val (val , 0 , 255875 );
411
487
regval = DIV_ROUND_CLOSEST (val , 125 );
412
- ret = regmap_write (data -> regmap , regh , regval >> 3 );
488
+ ret = regmap_write (data -> regmap , regh , ( regval >> 3 ) & 0xff );
413
489
if (ret < 0 )
414
490
goto unlock ;
415
491
ret = regmap_write (data -> regmap , regl , (regval & 0x07 ) << 5 );
416
492
} else {
417
- val = clamp_val (val , 0 , 255000 );
493
+ if (data -> chip == emc1428 )
494
+ val = clamp_val (val , -128000 , 127000 );
495
+ else
496
+ val = clamp_val (val , 0 , 255000 );
418
497
regval = DIV_ROUND_CLOSEST (val , 1000 );
419
498
ret = regmap_write (data -> regmap , regh , regval );
420
499
}
@@ -484,6 +563,8 @@ static umode_t emc1403_temp_is_visible(const void *_data, u32 attr, int channel)
484
563
return 0 ;
485
564
if (data -> chip == emc1403 && channel > 2 )
486
565
return 0 ;
566
+ if (data -> chip != emc1428 && channel > 3 )
567
+ return 0 ;
487
568
488
569
switch (attr ) {
489
570
case hwmon_temp_input :
@@ -548,6 +629,22 @@ static const struct hwmon_channel_info * const emc1403_info[] = {
548
629
HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |
549
630
HWMON_T_CRIT | HWMON_T_MIN_HYST | HWMON_T_MAX_HYST |
550
631
HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM |
632
+ HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_FAULT ,
633
+ HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |
634
+ HWMON_T_CRIT | HWMON_T_MIN_HYST | HWMON_T_MAX_HYST |
635
+ HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM |
636
+ HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_FAULT ,
637
+ HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |
638
+ HWMON_T_CRIT | HWMON_T_MIN_HYST | HWMON_T_MAX_HYST |
639
+ HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM |
640
+ HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_FAULT ,
641
+ HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |
642
+ HWMON_T_CRIT | HWMON_T_MIN_HYST | HWMON_T_MAX_HYST |
643
+ HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM |
644
+ HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_FAULT ,
645
+ HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |
646
+ HWMON_T_CRIT | HWMON_T_MIN_HYST | HWMON_T_MAX_HYST |
647
+ HWMON_T_CRIT_HYST | HWMON_T_MIN_ALARM |
551
648
HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM | HWMON_T_FAULT
552
649
),
553
650
NULL
@@ -575,6 +672,8 @@ static const struct i2c_device_id emc1403_idtable[] = {
575
672
{ "emc1422" , emc1402 },
576
673
{ "emc1423" , emc1403 },
577
674
{ "emc1424" , emc1404 },
675
+ { "emc1428" , emc1428 },
676
+ { "emc1438" , emc1428 },
578
677
{ "emc1442" , emc1402 },
579
678
{ }
580
679
};
0 commit comments