summaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/pmbus
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2015-08-17 10:21:43 -0400
committerGuenter Roeck <linux@roeck-us.net>2015-08-17 19:36:00 -0400
commit228b687d9e20f367e4d5ea8723e3abbf0892db61 (patch)
tree60b86be18f02776b10abb1cb71db3414aa25bbfa /drivers/hwmon/pmbus
parent52aae6af71e0e78e25c64e13266917bb323984d5 (diff)
hwmon: (ltc2978) Add support for LTC3886
LTC3886 is a is a dual PolyPhase DC/DC synchronous step-down switching regulator controller. It is mostly command compatible to LTC3883, but supports two phases instead of one. Suggested-by: Michael Jones <mike@proclivis.com> Tested-by: Michael Jones <mike@proclivis.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon/pmbus')
-rw-r--r--drivers/hwmon/pmbus/Kconfig2
-rw-r--r--drivers/hwmon/pmbus/ltc2978.c24
2 files changed, 23 insertions, 3 deletions
diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
index af778aed4033..5ebc36255c88 100644
--- a/drivers/hwmon/pmbus/Kconfig
+++ b/drivers/hwmon/pmbus/Kconfig
@@ -53,7 +53,7 @@ config SENSORS_LTC2978
53 help 53 help
54 If you say yes here you get hardware monitoring support for Linear 54 If you say yes here you get hardware monitoring support for Linear
55 Technology LTC2974, LTC2975, LTC2977, LTC2978, LTC2980, LTC3880, 55 Technology LTC2974, LTC2975, LTC2977, LTC2978, LTC2980, LTC3880,
56 LTC3883, LTC3887, LTCM2987, and LTM4676. 56 LTC3883, LTC3886, LTC3887, LTCM2987, and LTM4676.
57 57
58 This driver can also be built as a module. If so, the module will 58 This driver can also be built as a module. If so, the module will
59 be called ltc2978. 59 be called ltc2978.
diff --git a/drivers/hwmon/pmbus/ltc2978.c b/drivers/hwmon/pmbus/ltc2978.c
index 48dcde0bc740..60fe8f9839d3 100644
--- a/drivers/hwmon/pmbus/ltc2978.c
+++ b/drivers/hwmon/pmbus/ltc2978.c
@@ -25,7 +25,7 @@
25#include "pmbus.h" 25#include "pmbus.h"
26 26
27enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc2980, ltc3880, ltc3882, 27enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc2980, ltc3880, ltc3882,
28 ltc3883, ltc3887, ltm2987, ltm4676 }; 28 ltc3883, ltc3886, ltc3887, ltm2987, ltm4676 };
29 29
30/* Common for all chips */ 30/* Common for all chips */
31#define LTC2978_MFR_VOUT_PEAK 0xdd 31#define LTC2978_MFR_VOUT_PEAK 0xdd
@@ -47,7 +47,7 @@ enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc2980, ltc3880, ltc3882,
47#define LTC3880_MFR_CLEAR_PEAKS 0xe3 47#define LTC3880_MFR_CLEAR_PEAKS 0xe3
48#define LTC3880_MFR_TEMPERATURE2_PEAK 0xf4 48#define LTC3880_MFR_TEMPERATURE2_PEAK 0xf4
49 49
50/* LTC3883 only */ 50/* LTC3883 and LTC3886 only */
51#define LTC3883_MFR_IIN_PEAK 0xe1 51#define LTC3883_MFR_IIN_PEAK 0xe1
52 52
53/* LTC2975 only */ 53/* LTC2975 only */
@@ -69,6 +69,7 @@ enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc2980, ltc3880, ltc3882,
69#define LTC3882_ID 0x4200 69#define LTC3882_ID 0x4200
70#define LTC3882_ID_D1 0x4240 /* Dash 1 */ 70#define LTC3882_ID_D1 0x4240 /* Dash 1 */
71#define LTC3883_ID 0x4300 71#define LTC3883_ID 0x4300
72#define LTC3886_ID 0x4600
72#define LTC3887_ID 0x4700 73#define LTC3887_ID 0x4700
73#define LTM2987_ID_A 0x8010 /* A/B for two die IDs */ 74#define LTM2987_ID_A 0x8010 /* A/B for two die IDs */
74#define LTM2987_ID_B 0x8020 75#define LTM2987_ID_B 0x8020
@@ -417,6 +418,7 @@ static const struct i2c_device_id ltc2978_id[] = {
417 {"ltc3880", ltc3880}, 418 {"ltc3880", ltc3880},
418 {"ltc3882", ltc3882}, 419 {"ltc3882", ltc3882},
419 {"ltc3883", ltc3883}, 420 {"ltc3883", ltc3883},
421 {"ltc3886", ltc3886},
420 {"ltc3887", ltc3887}, 422 {"ltc3887", ltc3887},
421 {"ltm2987", ltm2987}, 423 {"ltm2987", ltm2987},
422 {"ltm4676", ltm4676}, 424 {"ltm4676", ltm4676},
@@ -485,6 +487,8 @@ static int ltc2978_get_id(struct i2c_client *client)
485 return ltc3882; 487 return ltc3882;
486 else if (chip_id == LTC3883_ID) 488 else if (chip_id == LTC3883_ID)
487 return ltc3883; 489 return ltc3883;
490 else if (chip_id == LTC3886_ID)
491 return ltc3886;
488 else if (chip_id == LTC3887_ID) 492 else if (chip_id == LTC3887_ID)
489 return ltc3887; 493 return ltc3887;
490 else if (chip_id == LTM2987_ID_A || chip_id == LTM2987_ID_B) 494 else if (chip_id == LTM2987_ID_A || chip_id == LTM2987_ID_B)
@@ -624,6 +628,21 @@ static int ltc2978_probe(struct i2c_client *client,
624 | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP 628 | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
625 | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP; 629 | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
626 break; 630 break;
631 case ltc3886:
632 data->features |= FEAT_CLEAR_PEAKS;
633 info->read_word_data = ltc3883_read_word_data;
634 info->pages = LTC3880_NUM_PAGES;
635 info->func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN
636 | PMBUS_HAVE_STATUS_INPUT
637 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
638 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
639 | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | PMBUS_HAVE_TEMP
640 | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_STATUS_TEMP;
641 info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
642 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
643 | PMBUS_HAVE_POUT
644 | PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
645 break;
627 default: 646 default:
628 return -ENODEV; 647 return -ENODEV;
629 } 648 }
@@ -650,6 +669,7 @@ static const struct of_device_id ltc2978_of_match[] = {
650 { .compatible = "lltc,ltc3880" }, 669 { .compatible = "lltc,ltc3880" },
651 { .compatible = "lltc,ltc3882" }, 670 { .compatible = "lltc,ltc3882" },
652 { .compatible = "lltc,ltc3883" }, 671 { .compatible = "lltc,ltc3883" },
672 { .compatible = "lltc,ltc3886" },
653 { .compatible = "lltc,ltc3887" }, 673 { .compatible = "lltc,ltc3887" },
654 { .compatible = "lltc,ltm2987" }, 674 { .compatible = "lltc,ltm2987" },
655 { .compatible = "lltc,ltm4676" }, 675 { .compatible = "lltc,ltm4676" },