@@ -601,6 +601,11 @@ static int lm75_i2c_reg_write(void *context, unsigned int reg, unsigned int val)
601601 return i2c_smbus_write_word_swapped (client , reg , val );
602602}
603603
604+ static const struct regmap_bus lm75_i2c_regmap_bus = {
605+ .reg_read = lm75_i2c_reg_read ,
606+ .reg_write = lm75_i2c_reg_write ,
607+ };
608+
604609static const struct regmap_config lm75_regmap_config = {
605610 .reg_bits = 8 ,
606611 .val_bits = 16 ,
@@ -613,47 +618,34 @@ static const struct regmap_config lm75_regmap_config = {
613618 .use_single_write = true,
614619};
615620
616- static const struct regmap_bus lm75_i2c_regmap_bus = {
617- .reg_read = lm75_i2c_reg_read ,
618- .reg_write = lm75_i2c_reg_write ,
619- };
620-
621621static void lm75_remove (void * data )
622622{
623623 struct lm75_data * lm75 = data ;
624624
625625 regmap_write (lm75 -> regmap , LM75_REG_CONF , lm75 -> orig_conf );
626626}
627627
628- static int lm75_probe (struct i2c_client * client )
628+ static int lm75_generic_probe (struct device * dev , const char * name ,
629+ const void * kind_ptr , int irq , struct regmap * regmap )
629630{
630- struct device * dev = & client -> dev ;
631631 struct device * hwmon_dev ;
632632 struct lm75_data * data ;
633633 int status , err ;
634634
635- if (!i2c_check_functionality (client -> adapter ,
636- I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA ))
637- return - EIO ;
638-
639635 data = devm_kzalloc (dev , sizeof (struct lm75_data ), GFP_KERNEL );
640636 if (!data )
641637 return - ENOMEM ;
642638
643639 /* needed by custom regmap callbacks */
644640 dev_set_drvdata (dev , data );
645641
646- data -> kind = (uintptr_t )i2c_get_match_data (client );
642+ data -> kind = (uintptr_t )kind_ptr ;
643+ data -> regmap = regmap ;
647644
648645 err = devm_regulator_get_enable (dev , "vs" );
649646 if (err )
650647 return err ;
651648
652- data -> regmap = devm_regmap_init (dev , & lm75_i2c_regmap_bus , client ,
653- & lm75_regmap_config );
654- if (IS_ERR (data -> regmap ))
655- return PTR_ERR (data -> regmap );
656-
657649 /* Set to LM75 resolution (9 bits, 1/2 degree C) and range.
658650 * Then tweak to be more precise when appropriate.
659651 */
@@ -679,20 +671,19 @@ static int lm75_probe(struct i2c_client *client)
679671 if (err )
680672 return err ;
681673
682- hwmon_dev = devm_hwmon_device_register_with_info (dev , client -> name ,
683- data , & lm75_chip_info ,
684- NULL );
674+ hwmon_dev = devm_hwmon_device_register_with_info (dev , name , data ,
675+ & lm75_chip_info , NULL );
685676 if (IS_ERR (hwmon_dev ))
686677 return PTR_ERR (hwmon_dev );
687678
688- if (client -> irq ) {
679+ if (irq ) {
689680 if (data -> params -> alarm ) {
690681 err = devm_request_threaded_irq (dev ,
691- client -> irq ,
682+ irq ,
692683 NULL ,
693684 & lm75_alarm_handler ,
694685 IRQF_ONESHOT ,
695- client -> name ,
686+ name ,
696687 hwmon_dev );
697688 if (err )
698689 return err ;
@@ -702,12 +693,29 @@ static int lm75_probe(struct i2c_client *client)
702693 }
703694 }
704695
705- dev_info (dev , "%s: sensor '%s'\n" , dev_name (hwmon_dev ), client -> name );
696+ dev_info (dev , "%s: sensor '%s'\n" , dev_name (hwmon_dev ), name );
706697
707698 return 0 ;
708699}
709700
710- static const struct i2c_device_id lm75_ids [] = {
701+ static int lm75_i2c_probe (struct i2c_client * client )
702+ {
703+ struct device * dev = & client -> dev ;
704+ struct regmap * regmap ;
705+
706+ if (!i2c_check_functionality (client -> adapter ,
707+ I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA ))
708+ return - EOPNOTSUPP ;
709+
710+ regmap = devm_regmap_init (dev , & lm75_i2c_regmap_bus , client , & lm75_regmap_config );
711+ if (IS_ERR (regmap ))
712+ return PTR_ERR (regmap );
713+
714+ return lm75_generic_probe (dev , client -> name , i2c_get_match_data (client ),
715+ client -> irq , regmap );
716+ }
717+
718+ static const struct i2c_device_id lm75_i2c_ids [] = {
711719 { "adt75" , adt75 , },
712720 { "as6200" , as6200 , },
713721 { "at30ts74" , at30ts74 , },
@@ -740,7 +748,7 @@ static const struct i2c_device_id lm75_ids[] = {
740748 { "tmp1075" , tmp1075 , },
741749 { /* LIST END */ }
742750};
743- MODULE_DEVICE_TABLE (i2c , lm75_ids );
751+ MODULE_DEVICE_TABLE (i2c , lm75_i2c_ids );
744752
745753static const struct of_device_id __maybe_unused lm75_of_match [] = {
746754 {
@@ -987,20 +995,20 @@ static const struct dev_pm_ops lm75_dev_pm_ops = {
987995#define LM75_DEV_PM_OPS NULL
988996#endif /* CONFIG_PM */
989997
990- static struct i2c_driver lm75_driver = {
998+ static struct i2c_driver lm75_i2c_driver = {
991999 .class = I2C_CLASS_HWMON ,
9921000 .driver = {
9931001 .name = "lm75" ,
9941002 .of_match_table = of_match_ptr (lm75_of_match ),
9951003 .pm = LM75_DEV_PM_OPS ,
9961004 },
997- .probe = lm75_probe ,
998- .id_table = lm75_ids ,
1005+ .probe = lm75_i2c_probe ,
1006+ .id_table = lm75_i2c_ids ,
9991007 .detect = lm75_detect ,
10001008 .address_list = normal_i2c ,
10011009};
10021010
1003- module_i2c_driver (lm75_driver );
1011+ module_i2c_driver (lm75_i2c_driver );
10041012
10051013MODULE_AUTHOR (
"Frodo Looijaard <[email protected] >" );
10061014MODULE_DESCRIPTION ("LM75 driver" );
0 commit comments