Skip to content

Commit bc96dc1

Browse files
Wolfram Sanggroeck
authored andcommitted
hwmon: (lm75) separate probe into common and I2C parts
Put generic probe functionality into a separate function and let the I2C driver call it. This is a preparation for adding I3C support which will also use the generic probe function. Signed-off-by: Wolfram Sang <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Guenter Roeck <[email protected]>
1 parent 7a5c24d commit bc96dc1

File tree

1 file changed

+38
-30
lines changed

1 file changed

+38
-30
lines changed

drivers/hwmon/lm75.c

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
604609
static 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-
621621
static 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

745753
static 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

10051013
MODULE_AUTHOR("Frodo Looijaard <[email protected]>");
10061014
MODULE_DESCRIPTION("LM75 driver");

0 commit comments

Comments
 (0)