summaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/pmbus
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2015-06-08 13:14:00 -0400
committerGuenter Roeck <linux@roeck-us.net>2015-08-12 15:29:12 -0400
commit836954dadcb351d65cf96584f22c9e437169bd49 (patch)
tree71606fb800a1208b19dbadc0c00bff8a224a8212 /drivers/hwmon/pmbus
parent33836ee98533fd27baa89dabca48f8d4e69dd438 (diff)
hwmon: (ltc2978) Move code to read chip ID into separate function
Verifying the chip type is getting more complicated with new chips, since not all chips support the same mechanism to read the chip type. Move the code into a separate function to simplify adding support for those chips. Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon/pmbus')
-rw-r--r--drivers/hwmon/pmbus/ltc2978.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/drivers/hwmon/pmbus/ltc2978.c b/drivers/hwmon/pmbus/ltc2978.c
index 33081d1d1c5a..7e10fbf8e133 100644
--- a/drivers/hwmon/pmbus/ltc2978.c
+++ b/drivers/hwmon/pmbus/ltc2978.c
@@ -388,10 +388,36 @@ static const struct regulator_desc ltc2978_reg_desc[] = {
388}; 388};
389#endif /* CONFIG_SENSORS_LTC2978_REGULATOR */ 389#endif /* CONFIG_SENSORS_LTC2978_REGULATOR */
390 390
391static int ltc2978_get_id(struct i2c_client *client)
392{
393 int chip_id;
394
395 chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID);
396 if (chip_id < 0)
397 return chip_id;
398
399 if (chip_id == LTC2974_ID_REV1 || chip_id == LTC2974_ID_REV2)
400 return ltc2974;
401 else if (chip_id == LTC2977_ID)
402 return ltc2977;
403 else if (chip_id == LTC2978_ID_REV1 || chip_id == LTC2978_ID_REV2 ||
404 chip_id == LTC2978A_ID)
405 return ltc2978;
406 else if ((chip_id & LTC3880_ID_MASK) == LTC3880_ID)
407 return ltc3880;
408 else if ((chip_id & LTC3883_ID_MASK) == LTC3883_ID)
409 return ltc3883;
410 else if ((chip_id & LTM4676_ID_MASK) == LTM4676_ID)
411 return ltm4676;
412
413 dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id);
414 return -ENODEV;
415}
416
391static int ltc2978_probe(struct i2c_client *client, 417static int ltc2978_probe(struct i2c_client *client,
392 const struct i2c_device_id *id) 418 const struct i2c_device_id *id)
393{ 419{
394 int chip_id, i; 420 int i, chip_id;
395 struct ltc2978_data *data; 421 struct ltc2978_data *data;
396 struct pmbus_driver_info *info; 422 struct pmbus_driver_info *info;
397 423
@@ -404,27 +430,11 @@ static int ltc2978_probe(struct i2c_client *client,
404 if (!data) 430 if (!data)
405 return -ENOMEM; 431 return -ENOMEM;
406 432
407 chip_id = i2c_smbus_read_word_data(client, LTC2978_MFR_SPECIAL_ID); 433 chip_id = ltc2978_get_id(client);
408 if (chip_id < 0) 434 if (chip_id < 0)
409 return chip_id; 435 return chip_id;
410 436
411 if (chip_id == LTC2974_ID_REV1 || chip_id == LTC2974_ID_REV2) { 437 data->id = chip_id;
412 data->id = ltc2974;
413 } else if (chip_id == LTC2977_ID) {
414 data->id = ltc2977;
415 } else if (chip_id == LTC2978_ID_REV1 || chip_id == LTC2978_ID_REV2 ||
416 chip_id == LTC2978A_ID) {
417 data->id = ltc2978;
418 } else if ((chip_id & LTC3880_ID_MASK) == LTC3880_ID) {
419 data->id = ltc3880;
420 } else if ((chip_id & LTC3883_ID_MASK) == LTC3883_ID) {
421 data->id = ltc3883;
422 } else if ((chip_id & LTM4676_ID_MASK) == LTM4676_ID) {
423 data->id = ltm4676;
424 } else {
425 dev_err(&client->dev, "Unsupported chip ID 0x%x\n", chip_id);
426 return -ENODEV;
427 }
428 if (data->id != id->driver_data) 438 if (data->id != id->driver_data)
429 dev_warn(&client->dev, 439 dev_warn(&client->dev,
430 "Device mismatch: Configured %s, detected %s\n", 440 "Device mismatch: Configured %s, detected %s\n",