@@ -111,7 +111,6 @@ struct lm75_data {
111
111
struct regmap * regmap ;
112
112
struct regulator * vs ;
113
113
u16 orig_conf ;
114
- u16 current_conf ;
115
114
u8 resolution ; /* In bits, 9 to 16 */
116
115
unsigned int sample_time ; /* In ms */
117
116
enum lm75_type kind ;
@@ -284,6 +283,7 @@ static const struct lm75_params device_params[] = {
284
283
.default_sample_time = 125 ,
285
284
.num_sample_times = 4 ,
286
285
.sample_times = (unsigned int []){ 125 , 250 , 1000 , 4000 },
286
+ .alarm = true,
287
287
},
288
288
[tmp175 ] = {
289
289
.set_mask = 3 << 5 , /* 12-bit mode */
@@ -343,40 +343,16 @@ static inline long lm75_reg_to_mc(s16 temp, u8 resolution)
343
343
static int lm75_write_config (struct lm75_data * data , u16 set_mask ,
344
344
u16 clr_mask )
345
345
{
346
- unsigned int value ;
346
+ int err ;
347
347
348
- clr_mask |= LM75_SHUTDOWN << (8 * data -> params -> config_reg_16bits );
349
- value = data -> current_conf & ~clr_mask ;
350
- value |= set_mask ;
348
+ err = regmap_update_bits (data -> regmap , LM75_REG_CONF ,
349
+ clr_mask | LM75_SHUTDOWN , set_mask );
350
+ if (err )
351
+ return err ;
351
352
352
- if (data -> current_conf != value ) {
353
- s32 err ;
354
- if (data -> params -> config_reg_16bits )
355
- err = regmap_write (data -> regmap , LM75_REG_CONF , value );
356
- else
357
- err = i2c_smbus_write_byte_data (data -> client ,
358
- LM75_REG_CONF ,
359
- value );
360
- if (err )
361
- return err ;
362
- data -> current_conf = value ;
363
- }
364
353
return 0 ;
365
354
}
366
355
367
- static int lm75_read_config (struct lm75_data * data )
368
- {
369
- int ret ;
370
- unsigned int status ;
371
-
372
- if (data -> params -> config_reg_16bits ) {
373
- ret = regmap_read (data -> regmap , LM75_REG_CONF , & status );
374
- return ret ? ret : status ;
375
- }
376
-
377
- return i2c_smbus_read_byte_data (data -> client , LM75_REG_CONF );
378
- }
379
-
380
356
static irqreturn_t lm75_alarm_handler (int irq , void * private )
381
357
{
382
358
struct device * hwmon_dev = private ;
@@ -426,7 +402,8 @@ static int lm75_read(struct device *dev, enum hwmon_sensor_types type,
426
402
if (attr == hwmon_temp_alarm ) {
427
403
switch (data -> kind ) {
428
404
case as6200 :
429
- * val = (regval >> 5 ) & 0x1 ;
405
+ case tmp112 :
406
+ * val = (regval >> 13 ) & 0x1 ;
430
407
break ;
431
408
default :
432
409
return - EINVAL ;
@@ -477,7 +454,6 @@ static int lm75_write_temp(struct device *dev, u32 attr, long temp)
477
454
static int lm75_update_interval (struct device * dev , long val )
478
455
{
479
456
struct lm75_data * data = dev_get_drvdata (dev );
480
- unsigned int reg ;
481
457
u8 index ;
482
458
s32 err ;
483
459
@@ -497,19 +473,14 @@ static int lm75_update_interval(struct device *dev, long val)
497
473
break ;
498
474
case tmp112 :
499
475
case as6200 :
500
- err = regmap_read (data -> regmap , LM75_REG_CONF , & reg );
501
- if (err < 0 )
502
- return err ;
503
- reg &= ~0x00c0 ;
504
- reg |= (3 - index ) << 6 ;
505
- err = regmap_write (data -> regmap , LM75_REG_CONF , reg );
476
+ err = regmap_update_bits (data -> regmap , LM75_REG_CONF ,
477
+ 0xc000 , (3 - index ) << 14 );
506
478
if (err < 0 )
507
479
return err ;
508
480
data -> sample_time = data -> params -> sample_times [index ];
509
481
break ;
510
482
case pct2075 :
511
- err = i2c_smbus_write_byte_data (data -> client , PCT2075_REG_IDLE ,
512
- index + 1 );
483
+ err = regmap_write (data -> regmap , PCT2075_REG_IDLE , index + 1 );
513
484
if (err )
514
485
return err ;
515
486
data -> sample_time = data -> params -> sample_times [index ];
@@ -606,6 +577,39 @@ static bool lm75_is_volatile_reg(struct device *dev, unsigned int reg)
606
577
return reg == LM75_REG_TEMP || reg == LM75_REG_CONF ;
607
578
}
608
579
580
+ static int lm75_i2c_reg_read (void * context , unsigned int reg , unsigned int * val )
581
+ {
582
+ struct lm75_data * data = context ;
583
+ struct i2c_client * client = data -> client ;
584
+ int ret ;
585
+
586
+ if (reg == LM75_REG_CONF ) {
587
+ if (!data -> params -> config_reg_16bits )
588
+ ret = i2c_smbus_read_byte_data (client , LM75_REG_CONF );
589
+ else
590
+ ret = i2c_smbus_read_word_data (client , LM75_REG_CONF );
591
+ } else {
592
+ ret = i2c_smbus_read_word_swapped (client , reg );
593
+ }
594
+ if (ret < 0 )
595
+ return ret ;
596
+ * val = ret ;
597
+ return 0 ;
598
+ }
599
+
600
+ static int lm75_i2c_reg_write (void * context , unsigned int reg , unsigned int val )
601
+ {
602
+ struct lm75_data * data = context ;
603
+ struct i2c_client * client = data -> client ;
604
+
605
+ if (reg == PCT2075_REG_IDLE ||
606
+ (reg == LM75_REG_CONF && !data -> params -> config_reg_16bits ))
607
+ return i2c_smbus_write_byte_data (client , reg , val );
608
+ else if (reg == LM75_REG_CONF )
609
+ return i2c_smbus_write_word_data (client , reg , val );
610
+ return i2c_smbus_write_word_swapped (client , reg , val );
611
+ }
612
+
609
613
static const struct regmap_config lm75_regmap_config = {
610
614
.reg_bits = 8 ,
611
615
.val_bits = 16 ,
@@ -618,6 +622,11 @@ static const struct regmap_config lm75_regmap_config = {
618
622
.use_single_write = true,
619
623
};
620
624
625
+ static const struct regmap_bus lm75_i2c_regmap_bus = {
626
+ .reg_read = lm75_i2c_reg_read ,
627
+ .reg_write = lm75_i2c_reg_write ,
628
+ };
629
+
621
630
static void lm75_disable_regulator (void * data )
622
631
{
623
632
struct lm75_data * lm75 = data ;
@@ -628,9 +637,8 @@ static void lm75_disable_regulator(void *data)
628
637
static void lm75_remove (void * data )
629
638
{
630
639
struct lm75_data * lm75 = data ;
631
- struct i2c_client * client = lm75 -> client ;
632
640
633
- i2c_smbus_write_byte_data ( client , LM75_REG_CONF , lm75 -> orig_conf );
641
+ regmap_write ( lm75 -> regmap , LM75_REG_CONF , lm75 -> orig_conf );
634
642
}
635
643
636
644
static int lm75_probe (struct i2c_client * client )
@@ -648,14 +656,18 @@ static int lm75_probe(struct i2c_client *client)
648
656
if (!data )
649
657
return - ENOMEM ;
650
658
659
+ /* needed by custom regmap callbacks */
660
+ dev_set_drvdata (dev , data );
661
+
651
662
data -> client = client ;
652
663
data -> kind = (uintptr_t )i2c_get_match_data (client );
653
664
654
665
data -> vs = devm_regulator_get (dev , "vs" );
655
666
if (IS_ERR (data -> vs ))
656
667
return PTR_ERR (data -> vs );
657
668
658
- data -> regmap = devm_regmap_init_i2c (client , & lm75_regmap_config );
669
+ data -> regmap = devm_regmap_init (dev , & lm75_i2c_regmap_bus , data ,
670
+ & lm75_regmap_config );
659
671
if (IS_ERR (data -> regmap ))
660
672
return PTR_ERR (data -> regmap );
661
673
@@ -681,13 +693,10 @@ static int lm75_probe(struct i2c_client *client)
681
693
return err ;
682
694
683
695
/* Cache original configuration */
684
- status = lm75_read_config (data );
685
- if (status < 0 ) {
686
- dev_dbg (dev , "Can't read config? %d\n" , status );
687
- return status ;
688
- }
696
+ err = regmap_read (data -> regmap , LM75_REG_CONF , & status );
697
+ if (err )
698
+ return err ;
689
699
data -> orig_conf = status ;
690
- data -> current_conf = status ;
691
700
692
701
err = lm75_write_config (data , data -> params -> set_mask ,
693
702
data -> params -> clr_mask );
@@ -985,32 +994,16 @@ static int lm75_detect(struct i2c_client *new_client,
985
994
#ifdef CONFIG_PM
986
995
static int lm75_suspend (struct device * dev )
987
996
{
988
- int status ;
989
- struct i2c_client * client = to_i2c_client (dev );
997
+ struct lm75_data * data = dev_get_drvdata (dev );
990
998
991
- status = i2c_smbus_read_byte_data (client , LM75_REG_CONF );
992
- if (status < 0 ) {
993
- dev_dbg (& client -> dev , "Can't read config? %d\n" , status );
994
- return status ;
995
- }
996
- status = status | LM75_SHUTDOWN ;
997
- i2c_smbus_write_byte_data (client , LM75_REG_CONF , status );
998
- return 0 ;
999
+ return regmap_update_bits (data -> regmap , LM75_REG_CONF , LM75_SHUTDOWN , LM75_SHUTDOWN );
999
1000
}
1000
1001
1001
1002
static int lm75_resume (struct device * dev )
1002
1003
{
1003
- int status ;
1004
- struct i2c_client * client = to_i2c_client (dev );
1004
+ struct lm75_data * data = dev_get_drvdata (dev );
1005
1005
1006
- status = i2c_smbus_read_byte_data (client , LM75_REG_CONF );
1007
- if (status < 0 ) {
1008
- dev_dbg (& client -> dev , "Can't read config? %d\n" , status );
1009
- return status ;
1010
- }
1011
- status = status & ~LM75_SHUTDOWN ;
1012
- i2c_smbus_write_byte_data (client , LM75_REG_CONF , status );
1013
- return 0 ;
1006
+ return regmap_update_bits (data -> regmap , LM75_REG_CONF , LM75_SHUTDOWN , 0 );
1014
1007
}
1015
1008
1016
1009
static const struct dev_pm_ops lm75_dev_pm_ops = {
0 commit comments