hwmon: (pmbus/max34440): add support adpm12200

ADPM12200 is a quarter brick DC/DC Power Module. It is a high power
non-isolated converter capable of delivering regulated 12V with
continuous power level of 2000W. Uses PMBus.

Signed-off-by: Alexis Czezar Torreno <alexisczezar.torreno@analog.com>
Link: https://lore.kernel.org/r/20251001-hwmon-next-v1-2-f8ca6a648203@analog.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Alexis Czezar Torreno 2025-10-01 08:37:08 +08:00 committed by Guenter Roeck
parent 03897f9baf
commit 2e0b52f1ae
3 changed files with 60 additions and 10 deletions

View File

@ -11,6 +11,14 @@ Supported chips:
Datasheet: - Datasheet: -
* ADI ADPM12200
Prefixes: 'adpm12200'
Addresses scanned: -
Datasheet: -
* Maxim MAX34440 * Maxim MAX34440
Prefixes: 'max34440' Prefixes: 'max34440'
@ -79,10 +87,11 @@ This driver supports multiple devices: hardware monitoring for Maxim MAX34440
PMBus 6-Channel Power-Supply Manager, MAX34441 PMBus 5-Channel Power-Supply PMBus 6-Channel Power-Supply Manager, MAX34441 PMBus 5-Channel Power-Supply
Manager and Intelligent Fan Controller, and MAX34446 PMBus Power-Supply Data Manager and Intelligent Fan Controller, and MAX34446 PMBus Power-Supply Data
Logger; PMBus Voltage Monitor and Sequencers for MAX34451, MAX34460, and Logger; PMBus Voltage Monitor and Sequencers for MAX34451, MAX34460, and
MAX34461; PMBus DC/DC Power Module ADPM12160. The MAX34451 supports monitoring MAX34461; PMBus DC/DC Power Module ADPM12160, and ADPM12200. The MAX34451
voltage or current of 12 channels based on GIN pins. The MAX34460 supports 12 supports monitoring voltage or current of 12 channels based on GIN pins. The
voltage channels, and the MAX34461 supports 16 voltage channels. The ADPM1260 MAX34460 supports 12 voltage channels, and the MAX34461 supports 16 voltage
also monitors both input and output of voltage and current. channels. The ADPM12160, and ADPM12200 also monitors both input and output
of voltage and current.
The driver is a client driver to the core PMBus driver. Please see The driver is a client driver to the core PMBus driver. Please see
Documentation/hwmon/pmbus.rst for details on PMBus client drivers. Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
@ -140,7 +149,8 @@ in[1-6]_reset_history Write any value to reset history.
.. note:: .. note::
- MAX34446 only supports in[1-4]. - MAX34446 only supports in[1-4].
- ADPM12160 only supports in[1-2]. Label is "vin1" and "vout1" respectively. - ADPM12160, and ADPM12200 only supports in[1-2]. Label is "vin1"
and "vout1" respectively.
Curr Curr
~~~~ ~~~~
@ -162,7 +172,8 @@ curr[1-6]_reset_history Write any value to reset history.
- in6 and curr6 attributes only exist for MAX34440. - in6 and curr6 attributes only exist for MAX34440.
- MAX34446 only supports curr[1-4]. - MAX34446 only supports curr[1-4].
- For ADPM12160, curr[1] is "iin1" and curr[2-6] are "iout[1-5]. - For ADPM12160, and ADPM12200, curr[1] is "iin1" and curr[2-6]
are "iout[1-5]".
Power Power
~~~~~ ~~~~~
@ -198,7 +209,7 @@ temp[1-8]_reset_history Write any value to reset history.
.. note:: .. note::
- temp7 and temp8 attributes only exist for MAX34440. - temp7 and temp8 attributes only exist for MAX34440.
- MAX34446 only supports temp[1-3]. - MAX34446 only supports temp[1-3].
- ADPM12160 only supports temp[1]. - ADPM12160, and ADPM12200 only supports temp[1].
.. note:: .. note::

View File

@ -361,6 +361,7 @@ config SENSORS_MAX34440
help help
If you say yes here you get hardware monitoring support for Maxim If you say yes here you get hardware monitoring support for Maxim
MAX34440, MAX34441, MAX34446, MAX34451, MAX34460, and MAX34461. MAX34440, MAX34441, MAX34446, MAX34451, MAX34460, and MAX34461.
Other compatible are ADPM12160, and ADPM12200.
This driver can also be built as a module. If so, the module will This driver can also be built as a module. If so, the module will
be called max34440. be called max34440.

View File

@ -17,6 +17,7 @@
enum chips { enum chips {
adpm12160, adpm12160,
adpm12200,
max34440, max34440,
max34441, max34441,
max34446, max34446,
@ -98,7 +99,7 @@ static int max34440_read_word_data(struct i2c_client *client, int page,
break; break;
case PMBUS_VIRT_READ_IOUT_AVG: case PMBUS_VIRT_READ_IOUT_AVG:
if (data->id != max34446 && data->id != max34451 && if (data->id != max34446 && data->id != max34451 &&
data->id != adpm12160) data->id != adpm12160 && data->id != adpm12200)
return -ENXIO; return -ENXIO;
ret = pmbus_read_word_data(client, page, phase, ret = pmbus_read_word_data(client, page, phase,
MAX34446_MFR_IOUT_AVG); MAX34446_MFR_IOUT_AVG);
@ -183,7 +184,7 @@ static int max34440_write_word_data(struct i2c_client *client, int page,
ret = pmbus_write_word_data(client, page, ret = pmbus_write_word_data(client, page,
MAX34440_MFR_IOUT_PEAK, 0); MAX34440_MFR_IOUT_PEAK, 0);
if (!ret && (data->id == max34446 || data->id == max34451 || if (!ret && (data->id == max34446 || data->id == max34451 ||
data->id == adpm12160)) data->id == adpm12160 || data->id == adpm12200))
ret = pmbus_write_word_data(client, page, ret = pmbus_write_word_data(client, page,
MAX34446_MFR_IOUT_AVG, 0); MAX34446_MFR_IOUT_AVG, 0);
@ -364,6 +365,42 @@ static struct pmbus_driver_info max34440_info[] = {
.read_word_data = max34440_read_word_data, .read_word_data = max34440_read_word_data,
.write_word_data = max34440_write_word_data, .write_word_data = max34440_write_word_data,
}, },
[adpm12200] = {
.pages = 19,
.format[PSC_VOLTAGE_IN] = direct,
.format[PSC_VOLTAGE_OUT] = direct,
.format[PSC_CURRENT_IN] = direct,
.format[PSC_CURRENT_OUT] = direct,
.format[PSC_TEMPERATURE] = direct,
.m[PSC_VOLTAGE_IN] = 125,
.b[PSC_VOLTAGE_IN] = 0,
.R[PSC_VOLTAGE_IN] = 0,
.m[PSC_VOLTAGE_OUT] = 125,
.b[PSC_VOLTAGE_OUT] = 0,
.R[PSC_VOLTAGE_OUT] = 0,
.m[PSC_CURRENT_IN] = 250,
.b[PSC_CURRENT_IN] = 0,
.R[PSC_CURRENT_IN] = -1,
.m[PSC_CURRENT_OUT] = 250,
.b[PSC_CURRENT_OUT] = 0,
.R[PSC_CURRENT_OUT] = -1,
.m[PSC_TEMPERATURE] = 1,
.b[PSC_TEMPERATURE] = 0,
.R[PSC_TEMPERATURE] = 2,
/* absent func below [18] are not for monitoring */
.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
.func[4] = PMBUS_HAVE_STATUS_IOUT,
.func[5] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
.func[6] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
.func[7] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
.func[8] = PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,
.func[9] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT,
.func[10] = PMBUS_HAVE_IIN | PMBUS_HAVE_STATUS_INPUT,
.func[14] = PMBUS_HAVE_IOUT,
.func[18] = PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
.read_word_data = max34440_read_word_data,
.write_word_data = max34440_write_word_data,
},
[max34440] = { [max34440] = {
.pages = 14, .pages = 14,
.format[PSC_VOLTAGE_IN] = direct, .format[PSC_VOLTAGE_IN] = direct,
@ -600,7 +637,7 @@ static int max34440_probe(struct i2c_client *client)
rv = max34451_set_supported_funcs(client, data); rv = max34451_set_supported_funcs(client, data);
if (rv) if (rv)
return rv; return rv;
} else if (data->id == adpm12160) { } else if (data->id == adpm12160 || data->id == adpm12200) {
data->iout_oc_fault_limit = PMBUS_IOUT_OC_FAULT_LIMIT; data->iout_oc_fault_limit = PMBUS_IOUT_OC_FAULT_LIMIT;
data->iout_oc_warn_limit = PMBUS_IOUT_OC_WARN_LIMIT; data->iout_oc_warn_limit = PMBUS_IOUT_OC_WARN_LIMIT;
} }
@ -610,6 +647,7 @@ static int max34440_probe(struct i2c_client *client)
static const struct i2c_device_id max34440_id[] = { static const struct i2c_device_id max34440_id[] = {
{"adpm12160", adpm12160}, {"adpm12160", adpm12160},
{"adpm12200", adpm12200},
{"max34440", max34440}, {"max34440", max34440},
{"max34441", max34441}, {"max34441", max34441},
{"max34446", max34446}, {"max34446", max34446},