diff options
-rw-r--r-- | Documentation/hwmon/adm1275 | 32 | ||||
-rw-r--r-- | drivers/hwmon/pmbus/Kconfig | 5 | ||||
-rw-r--r-- | drivers/hwmon/pmbus/adm1275.c | 59 |
3 files changed, 72 insertions, 24 deletions
diff --git a/Documentation/hwmon/adm1275 b/Documentation/hwmon/adm1275 index c438c98bdbc8..ab70d96d2dfd 100644 --- a/Documentation/hwmon/adm1275 +++ b/Documentation/hwmon/adm1275 | |||
@@ -6,6 +6,10 @@ Supported chips: | |||
6 | Prefix: 'adm1275' | 6 | Prefix: 'adm1275' |
7 | Addresses scanned: - | 7 | Addresses scanned: - |
8 | Datasheet: www.analog.com/static/imported-files/data_sheets/ADM1275.pdf | 8 | Datasheet: www.analog.com/static/imported-files/data_sheets/ADM1275.pdf |
9 | * Analog Devices ADM1276 | ||
10 | Prefix: 'adm1276' | ||
11 | Addresses scanned: - | ||
12 | Datasheet: www.analog.com/static/imported-files/data_sheets/ADM1276.pdf | ||
9 | 13 | ||
10 | Author: Guenter Roeck <guenter.roeck@ericsson.com> | 14 | Author: Guenter Roeck <guenter.roeck@ericsson.com> |
11 | 15 | ||
@@ -13,13 +17,13 @@ Author: Guenter Roeck <guenter.roeck@ericsson.com> | |||
13 | Description | 17 | Description |
14 | ----------- | 18 | ----------- |
15 | 19 | ||
16 | This driver supports hardware montoring for Analog Devices ADM1275 Hot-Swap | 20 | This driver supports hardware montoring for Analog Devices ADM1275 and ADM1276 |
17 | Controller and Digital Power Monitor. | 21 | Hot-Swap Controller and Digital Power Monitor. |
18 | 22 | ||
19 | The ADM1275 is a hot-swap controller that allows a circuit board to be removed | 23 | ADM1275 and ADM1276 are hot-swap controllers that allow a circuit board to be |
20 | from or inserted into a live backplane. It also features current and voltage | 24 | removed from or inserted into a live backplane. They also feature current and |
21 | readback via an integrated 12-bit analog-to-digital converter (ADC), accessed | 25 | voltage readback via an integrated 12-bit analog-to-digital converter (ADC), |
22 | using a PMBus. interface. | 26 | accessed using a PMBus interface. |
23 | 27 | ||
24 | The driver is a client driver to the core PMBus driver. Please see | 28 | The driver is a client driver to the core PMBus driver. Please see |
25 | Documentation/hwmon/pmbus for details on PMBus client drivers. | 29 | Documentation/hwmon/pmbus for details on PMBus client drivers. |
@@ -48,18 +52,18 @@ attributes are write-only, all other attributes are read-only. | |||
48 | 52 | ||
49 | in1_label "vin1" or "vout1" depending on chip variant and | 53 | in1_label "vin1" or "vout1" depending on chip variant and |
50 | configuration. | 54 | configuration. |
51 | in1_input Measured voltage. From READ_VOUT register. | 55 | in1_input Measured voltage. |
52 | in1_min Minumum Voltage. From VOUT_UV_WARN_LIMIT register. | 56 | in1_min Minumum Voltage. |
53 | in1_max Maximum voltage. From VOUT_OV_WARN_LIMIT register. | 57 | in1_max Maximum voltage. |
54 | in1_min_alarm Voltage low alarm. From VOLTAGE_UV_WARNING status. | 58 | in1_min_alarm Voltage low alarm. |
55 | in1_max_alarm Voltage high alarm. From VOLTAGE_OV_WARNING status. | 59 | in1_max_alarm Voltage high alarm. |
56 | in1_highest Historical maximum voltage. | 60 | in1_highest Historical maximum voltage. |
57 | in1_reset_history Write any value to reset history. | 61 | in1_reset_history Write any value to reset history. |
58 | 62 | ||
59 | curr1_label "iout1" | 63 | curr1_label "iout1" |
60 | curr1_input Measured current. From READ_IOUT register. | 64 | curr1_input Measured current. |
61 | curr1_max Maximum current. From IOUT_OC_WARN_LIMIT register. | 65 | curr1_max Maximum current. |
62 | curr1_max_alarm Current high alarm. From IOUT_OC_WARN_LIMIT register. | 66 | curr1_max_alarm Current high alarm. |
63 | curr1_lcrit Critical minimum current. Depending on the chip | 67 | curr1_lcrit Critical minimum current. Depending on the chip |
64 | configuration, either curr1_lcrit or curr1_crit is | 68 | configuration, either curr1_lcrit or curr1_crit is |
65 | supported, but not both. | 69 | supported, but not both. |
diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig index c9237b9dcff2..37575582e51a 100644 --- a/drivers/hwmon/pmbus/Kconfig +++ b/drivers/hwmon/pmbus/Kconfig | |||
@@ -26,11 +26,12 @@ config SENSORS_PMBUS | |||
26 | be called pmbus. | 26 | be called pmbus. |
27 | 27 | ||
28 | config SENSORS_ADM1275 | 28 | config SENSORS_ADM1275 |
29 | tristate "Analog Devices ADM1275" | 29 | tristate "Analog Devices ADM1275 and compatibles" |
30 | default n | 30 | default n |
31 | help | 31 | help |
32 | If you say yes here you get hardware monitoring support for Analog | 32 | If you say yes here you get hardware monitoring support for Analog |
33 | Devices ADM1275 Hot-Swap Controller and Digital Power Monitor. | 33 | Devices ADM1275 and ADM1276 Hot-Swap Controller and Digital Power |
34 | Monitor. | ||
34 | 35 | ||
35 | This driver can also be built as a module. If so, the module will | 36 | This driver can also be built as a module. If so, the module will |
36 | be called adm1275. | 37 | be called adm1275. |
diff --git a/drivers/hwmon/pmbus/adm1275.c b/drivers/hwmon/pmbus/adm1275.c index 7a9f2d9dbba4..fa1811274c27 100644 --- a/drivers/hwmon/pmbus/adm1275.c +++ b/drivers/hwmon/pmbus/adm1275.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #include <linux/i2c.h> | 23 | #include <linux/i2c.h> |
24 | #include "pmbus.h" | 24 | #include "pmbus.h" |
25 | 25 | ||
26 | enum chips { adm1275, adm1276 }; | ||
27 | |||
26 | #define ADM1275_PEAK_IOUT 0xd0 | 28 | #define ADM1275_PEAK_IOUT 0xd0 |
27 | #define ADM1275_PEAK_VIN 0xd1 | 29 | #define ADM1275_PEAK_VIN 0xd1 |
28 | #define ADM1275_PEAK_VOUT 0xd2 | 30 | #define ADM1275_PEAK_VOUT 0xd2 |
@@ -36,9 +38,12 @@ | |||
36 | 38 | ||
37 | #define ADM1275_IOUT_WARN2_SELECT (1 << 4) | 39 | #define ADM1275_IOUT_WARN2_SELECT (1 << 4) |
38 | 40 | ||
41 | #define ADM1276_PEAK_PIN 0xda | ||
42 | |||
39 | #define ADM1275_MFR_STATUS_IOUT_WARN2 (1 << 0) | 43 | #define ADM1275_MFR_STATUS_IOUT_WARN2 (1 << 0) |
40 | 44 | ||
41 | struct adm1275_data { | 45 | struct adm1275_data { |
46 | int id; | ||
42 | bool have_oc_fault; | 47 | bool have_oc_fault; |
43 | struct pmbus_driver_info info; | 48 | struct pmbus_driver_info info; |
44 | }; | 49 | }; |
@@ -49,7 +54,7 @@ static int adm1275_read_word_data(struct i2c_client *client, int page, int reg) | |||
49 | { | 54 | { |
50 | const struct pmbus_driver_info *info = pmbus_get_driver_info(client); | 55 | const struct pmbus_driver_info *info = pmbus_get_driver_info(client); |
51 | const struct adm1275_data *data = to_adm1275_data(info); | 56 | const struct adm1275_data *data = to_adm1275_data(info); |
52 | int ret; | 57 | int ret = 0; |
53 | 58 | ||
54 | if (page) | 59 | if (page) |
55 | return -ENXIO; | 60 | return -ENXIO; |
@@ -78,10 +83,20 @@ static int adm1275_read_word_data(struct i2c_client *client, int page, int reg) | |||
78 | case PMBUS_VIRT_READ_VIN_MAX: | 83 | case PMBUS_VIRT_READ_VIN_MAX: |
79 | ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VIN); | 84 | ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VIN); |
80 | break; | 85 | break; |
86 | case PMBUS_VIRT_READ_PIN_MAX: | ||
87 | if (data->id != adm1276) { | ||
88 | ret = -ENXIO; | ||
89 | break; | ||
90 | } | ||
91 | ret = pmbus_read_word_data(client, 0, ADM1276_PEAK_PIN); | ||
92 | break; | ||
81 | case PMBUS_VIRT_RESET_IOUT_HISTORY: | 93 | case PMBUS_VIRT_RESET_IOUT_HISTORY: |
82 | case PMBUS_VIRT_RESET_VOUT_HISTORY: | 94 | case PMBUS_VIRT_RESET_VOUT_HISTORY: |
83 | case PMBUS_VIRT_RESET_VIN_HISTORY: | 95 | case PMBUS_VIRT_RESET_VIN_HISTORY: |
84 | ret = 0; | 96 | break; |
97 | case PMBUS_VIRT_RESET_PIN_HISTORY: | ||
98 | if (data->id != adm1276) | ||
99 | ret = -ENXIO; | ||
85 | break; | 100 | break; |
86 | default: | 101 | default: |
87 | ret = -ENODATA; | 102 | ret = -ENODATA; |
@@ -113,6 +128,9 @@ static int adm1275_write_word_data(struct i2c_client *client, int page, int reg, | |||
113 | case PMBUS_VIRT_RESET_VIN_HISTORY: | 128 | case PMBUS_VIRT_RESET_VIN_HISTORY: |
114 | ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_VIN, 0); | 129 | ret = pmbus_write_word_data(client, 0, ADM1275_PEAK_VIN, 0); |
115 | break; | 130 | break; |
131 | case PMBUS_VIRT_RESET_PIN_HISTORY: | ||
132 | ret = pmbus_write_word_data(client, 0, ADM1276_PEAK_PIN, 0); | ||
133 | break; | ||
116 | default: | 134 | default: |
117 | ret = -ENODATA; | 135 | ret = -ENODATA; |
118 | break; | 136 | break; |
@@ -180,6 +198,7 @@ static int adm1275_probe(struct i2c_client *client, | |||
180 | goto err_mem; | 198 | goto err_mem; |
181 | } | 199 | } |
182 | 200 | ||
201 | data->id = id->driver_data; | ||
183 | info = &data->info; | 202 | info = &data->info; |
184 | 203 | ||
185 | info->pages = 1; | 204 | info->pages = 1; |
@@ -214,10 +233,33 @@ static int adm1275_probe(struct i2c_client *client, | |||
214 | if (device_config & ADM1275_IOUT_WARN2_SELECT) | 233 | if (device_config & ADM1275_IOUT_WARN2_SELECT) |
215 | data->have_oc_fault = true; | 234 | data->have_oc_fault = true; |
216 | 235 | ||
217 | if (config & ADM1275_VIN_VOUT_SELECT) | 236 | switch (id->driver_data) { |
218 | info->func[0] |= PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; | 237 | case adm1275: |
219 | else | 238 | if (config & ADM1275_VIN_VOUT_SELECT) |
220 | info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT; | 239 | info->func[0] |= |
240 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; | ||
241 | else | ||
242 | info->func[0] |= | ||
243 | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT; | ||
244 | break; | ||
245 | case adm1276: | ||
246 | info->format[PSC_POWER] = direct; | ||
247 | info->func[0] |= PMBUS_HAVE_VIN | PMBUS_HAVE_PIN | ||
248 | | PMBUS_HAVE_STATUS_INPUT; | ||
249 | if (config & ADM1275_VIN_VOUT_SELECT) | ||
250 | info->func[0] |= | ||
251 | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT; | ||
252 | if (config & ADM1275_VRANGE) { | ||
253 | info->m[PSC_POWER] = 6043; | ||
254 | info->b[PSC_POWER] = 0; | ||
255 | info->R[PSC_POWER] = -2; | ||
256 | } else { | ||
257 | info->m[PSC_POWER] = 2115; | ||
258 | info->b[PSC_POWER] = 0; | ||
259 | info->R[PSC_POWER] = -1; | ||
260 | } | ||
261 | break; | ||
262 | } | ||
221 | 263 | ||
222 | ret = pmbus_do_probe(client, id, info); | 264 | ret = pmbus_do_probe(client, id, info); |
223 | if (ret) | 265 | if (ret) |
@@ -240,7 +282,8 @@ static int adm1275_remove(struct i2c_client *client) | |||
240 | } | 282 | } |
241 | 283 | ||
242 | static const struct i2c_device_id adm1275_id[] = { | 284 | static const struct i2c_device_id adm1275_id[] = { |
243 | {"adm1275", 0}, | 285 | { "adm1275", adm1275 }, |
286 | { "adm1276", adm1276 }, | ||
244 | { } | 287 | { } |
245 | }; | 288 | }; |
246 | MODULE_DEVICE_TABLE(i2c, adm1275_id); | 289 | MODULE_DEVICE_TABLE(i2c, adm1275_id); |
@@ -265,7 +308,7 @@ static void __exit adm1275_exit(void) | |||
265 | } | 308 | } |
266 | 309 | ||
267 | MODULE_AUTHOR("Guenter Roeck"); | 310 | MODULE_AUTHOR("Guenter Roeck"); |
268 | MODULE_DESCRIPTION("PMBus driver for Analog Devices ADM1275"); | 311 | MODULE_DESCRIPTION("PMBus driver for Analog Devices ADM1275 and compatibles"); |
269 | MODULE_LICENSE("GPL"); | 312 | MODULE_LICENSE("GPL"); |
270 | module_init(adm1275_init); | 313 | module_init(adm1275_init); |
271 | module_exit(adm1275_exit); | 314 | module_exit(adm1275_exit); |