@@ -57,6 +57,8 @@ static const u8 MAX6697_REG_CRIT[] = {
57
57
#define MAX6581_REG_IDEALITY_SELECT 0x4c
58
58
#define MAX6581_REG_OFFSET 0x4d
59
59
#define MAX6581_REG_OFFSET_SELECT 0x4e
60
+ #define MAX6581_OFFSET_MIN -31750
61
+ #define MAX6581_OFFSET_MAX 31750
60
62
61
63
#define MAX6697_CONV_TIME 156 /* ms per channel, worst case */
62
64
@@ -172,6 +174,11 @@ static const struct max6697_chip_data max6697_chip_data[] = {
172
174
},
173
175
};
174
176
177
+ static inline int max6581_offset_to_millic (int val )
178
+ {
179
+ return sign_extend32 (val , 7 ) * 250 ;
180
+ }
181
+
175
182
static struct max6697_data * max6697_update_device (struct device * dev )
176
183
{
177
184
struct max6697_data * data = dev_get_drvdata (dev );
@@ -317,6 +324,70 @@ static ssize_t temp_store(struct device *dev,
317
324
return ret < 0 ? ret : count ;
318
325
}
319
326
327
+ static ssize_t offset_store (struct device * dev , struct device_attribute * devattr , const char * buf ,
328
+ size_t count )
329
+ {
330
+ int val , ret , index , select ;
331
+ struct max6697_data * data ;
332
+ bool channel_enabled ;
333
+ long temp ;
334
+
335
+ index = to_sensor_dev_attr (devattr )-> index ;
336
+ data = dev_get_drvdata (dev );
337
+ ret = kstrtol (buf , 10 , & temp );
338
+ if (ret < 0 )
339
+ return ret ;
340
+
341
+ mutex_lock (& data -> update_lock );
342
+ select = i2c_smbus_read_byte_data (data -> client , MAX6581_REG_OFFSET_SELECT );
343
+ if (select < 0 ) {
344
+ ret = select ;
345
+ goto abort ;
346
+ }
347
+ channel_enabled = (select & (1 << (index - 1 )));
348
+ temp = clamp_val (temp , MAX6581_OFFSET_MIN , MAX6581_OFFSET_MAX );
349
+ val = DIV_ROUND_CLOSEST (temp , 250 );
350
+ /* disable the offset for channel if the new offset is 0 */
351
+ if (val == 0 ) {
352
+ if (channel_enabled )
353
+ ret = i2c_smbus_write_byte_data (data -> client , MAX6581_REG_OFFSET_SELECT ,
354
+ select & ~(1 << (index - 1 )));
355
+ ret = ret < 0 ? ret : count ;
356
+ goto abort ;
357
+ }
358
+ if (!channel_enabled ) {
359
+ ret = i2c_smbus_write_byte_data (data -> client , MAX6581_REG_OFFSET_SELECT ,
360
+ select | (1 << (index - 1 )));
361
+ if (ret < 0 )
362
+ goto abort ;
363
+ }
364
+ ret = i2c_smbus_write_byte_data (data -> client , MAX6581_REG_OFFSET , val );
365
+ ret = ret < 0 ? ret : count ;
366
+
367
+ abort :
368
+ mutex_unlock (& data -> update_lock );
369
+ return ret ;
370
+ }
371
+
372
+ static ssize_t offset_show (struct device * dev , struct device_attribute * devattr , char * buf )
373
+ {
374
+ struct max6697_data * data ;
375
+ int select , ret , index ;
376
+
377
+ index = to_sensor_dev_attr (devattr )-> index ;
378
+ data = dev_get_drvdata (dev );
379
+ mutex_lock (& data -> update_lock );
380
+ select = i2c_smbus_read_byte_data (data -> client , MAX6581_REG_OFFSET_SELECT );
381
+ if (select < 0 )
382
+ ret = select ;
383
+ else if (select & (1 << (index - 1 )))
384
+ ret = i2c_smbus_read_byte_data (data -> client , MAX6581_REG_OFFSET );
385
+ else
386
+ ret = 0 ;
387
+ mutex_unlock (& data -> update_lock );
388
+ return ret < 0 ? ret : sprintf (buf , "%d\n" , max6581_offset_to_millic (ret ));
389
+ }
390
+
320
391
static SENSOR_DEVICE_ATTR_RO (temp1_input , temp_input , 0 ) ;
321
392
static SENSOR_DEVICE_ATTR_2_RW (temp1_max , temp , 0 , MAX6697_TEMP_MAX ) ;
322
393
static SENSOR_DEVICE_ATTR_2_RW (temp1_crit , temp , 0 , MAX6697_TEMP_CRIT ) ;
@@ -375,6 +446,15 @@ static SENSOR_DEVICE_ATTR_RO(temp6_fault, alarm, 5);
375
446
static SENSOR_DEVICE_ATTR_RO (temp7_fault , alarm , 6 ) ;
376
447
static SENSOR_DEVICE_ATTR_RO (temp8_fault , alarm , 7 ) ;
377
448
449
+ /* There is no offset for local temperature so starting from temp2 */
450
+ static SENSOR_DEVICE_ATTR_RW (temp2_offset , offset , 1 ) ;
451
+ static SENSOR_DEVICE_ATTR_RW (temp3_offset , offset , 2 ) ;
452
+ static SENSOR_DEVICE_ATTR_RW (temp4_offset , offset , 3 ) ;
453
+ static SENSOR_DEVICE_ATTR_RW (temp5_offset , offset , 4 ) ;
454
+ static SENSOR_DEVICE_ATTR_RW (temp6_offset , offset , 5 ) ;
455
+ static SENSOR_DEVICE_ATTR_RW (temp7_offset , offset , 6 ) ;
456
+ static SENSOR_DEVICE_ATTR_RW (temp8_offset , offset , 7 ) ;
457
+
378
458
static DEVICE_ATTR (dummy , 0 , NULL, NULL) ;
379
459
380
460
static umode_t max6697_is_visible (struct kobject * kobj , struct attribute * attr ,
@@ -383,8 +463,8 @@ static umode_t max6697_is_visible(struct kobject *kobj, struct attribute *attr,
383
463
struct device * dev = container_of (kobj , struct device , kobj );
384
464
struct max6697_data * data = dev_get_drvdata (dev );
385
465
const struct max6697_chip_data * chip = data -> chip ;
386
- int channel = index / 6 ; /* channel number */
387
- int nr = index % 6 ; /* attribute index within channel */
466
+ int channel = index / 7 ; /* channel number */
467
+ int nr = index % 7 ; /* attribute index within channel */
388
468
389
469
if (channel >= chip -> channels )
390
470
return 0 ;
@@ -393,6 +473,10 @@ static umode_t max6697_is_visible(struct kobject *kobj, struct attribute *attr,
393
473
return 0 ;
394
474
if (nr == 5 && !(chip -> have_fault & (1 << channel )))
395
475
return 0 ;
476
+ /* offset reg is only supported on max6581 remote channels */
477
+ if (nr == 6 )
478
+ if (data -> type != max6581 || channel == 0 )
479
+ return 0 ;
396
480
397
481
return attr -> mode ;
398
482
}
@@ -409,55 +493,63 @@ static struct attribute *max6697_attributes[] = {
409
493
& sensor_dev_attr_temp1_crit .dev_attr .attr ,
410
494
& sensor_dev_attr_temp1_crit_alarm .dev_attr .attr ,
411
495
& dev_attr_dummy .attr ,
496
+ & dev_attr_dummy .attr ,
412
497
413
498
& sensor_dev_attr_temp2_input .dev_attr .attr ,
414
499
& sensor_dev_attr_temp2_max .dev_attr .attr ,
415
500
& sensor_dev_attr_temp2_max_alarm .dev_attr .attr ,
416
501
& sensor_dev_attr_temp2_crit .dev_attr .attr ,
417
502
& sensor_dev_attr_temp2_crit_alarm .dev_attr .attr ,
418
503
& sensor_dev_attr_temp2_fault .dev_attr .attr ,
504
+ & sensor_dev_attr_temp2_offset .dev_attr .attr ,
419
505
420
506
& sensor_dev_attr_temp3_input .dev_attr .attr ,
421
507
& sensor_dev_attr_temp3_max .dev_attr .attr ,
422
508
& sensor_dev_attr_temp3_max_alarm .dev_attr .attr ,
423
509
& sensor_dev_attr_temp3_crit .dev_attr .attr ,
424
510
& sensor_dev_attr_temp3_crit_alarm .dev_attr .attr ,
425
511
& sensor_dev_attr_temp3_fault .dev_attr .attr ,
512
+ & sensor_dev_attr_temp3_offset .dev_attr .attr ,
426
513
427
514
& sensor_dev_attr_temp4_input .dev_attr .attr ,
428
515
& sensor_dev_attr_temp4_max .dev_attr .attr ,
429
516
& sensor_dev_attr_temp4_max_alarm .dev_attr .attr ,
430
517
& sensor_dev_attr_temp4_crit .dev_attr .attr ,
431
518
& sensor_dev_attr_temp4_crit_alarm .dev_attr .attr ,
432
519
& sensor_dev_attr_temp4_fault .dev_attr .attr ,
520
+ & sensor_dev_attr_temp4_offset .dev_attr .attr ,
433
521
434
522
& sensor_dev_attr_temp5_input .dev_attr .attr ,
435
523
& sensor_dev_attr_temp5_max .dev_attr .attr ,
436
524
& sensor_dev_attr_temp5_max_alarm .dev_attr .attr ,
437
525
& sensor_dev_attr_temp5_crit .dev_attr .attr ,
438
526
& sensor_dev_attr_temp5_crit_alarm .dev_attr .attr ,
439
527
& sensor_dev_attr_temp5_fault .dev_attr .attr ,
528
+ & sensor_dev_attr_temp5_offset .dev_attr .attr ,
440
529
441
530
& sensor_dev_attr_temp6_input .dev_attr .attr ,
442
531
& sensor_dev_attr_temp6_max .dev_attr .attr ,
443
532
& sensor_dev_attr_temp6_max_alarm .dev_attr .attr ,
444
533
& sensor_dev_attr_temp6_crit .dev_attr .attr ,
445
534
& sensor_dev_attr_temp6_crit_alarm .dev_attr .attr ,
446
535
& sensor_dev_attr_temp6_fault .dev_attr .attr ,
536
+ & sensor_dev_attr_temp6_offset .dev_attr .attr ,
447
537
448
538
& sensor_dev_attr_temp7_input .dev_attr .attr ,
449
539
& sensor_dev_attr_temp7_max .dev_attr .attr ,
450
540
& sensor_dev_attr_temp7_max_alarm .dev_attr .attr ,
451
541
& sensor_dev_attr_temp7_crit .dev_attr .attr ,
452
542
& sensor_dev_attr_temp7_crit_alarm .dev_attr .attr ,
453
543
& sensor_dev_attr_temp7_fault .dev_attr .attr ,
544
+ & sensor_dev_attr_temp7_offset .dev_attr .attr ,
454
545
455
546
& sensor_dev_attr_temp8_input .dev_attr .attr ,
456
547
& sensor_dev_attr_temp8_max .dev_attr .attr ,
457
548
& sensor_dev_attr_temp8_max_alarm .dev_attr .attr ,
458
549
& sensor_dev_attr_temp8_crit .dev_attr .attr ,
459
550
& sensor_dev_attr_temp8_crit_alarm .dev_attr .attr ,
460
551
& sensor_dev_attr_temp8_fault .dev_attr .attr ,
552
+ & sensor_dev_attr_temp8_offset .dev_attr .attr ,
461
553
NULL
462
554
};
463
555
0 commit comments