hwmon: (pmbus/max34440): add support adpm12250

ADPM12250 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 2500W. Uses PMBus.

Signed-off-by: Alexis Czezar Torreno <alexisczezar.torreno@analog.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20260610-dev-adpm12250-v1-1-422760bb80da@analog.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Alexis Czezar Torreno
2026-06-10 09:12:10 +08:00
committed by Guenter Roeck
parent b47f4a72c6
commit 479bfeba2e
2 changed files with 60 additions and 12 deletions

View File

@@ -19,6 +19,14 @@ Supported chips:
Datasheet: - Datasheet: -
* ADI ADPM12250
Prefixes: 'adpm12250'
Addresses scanned: -
Datasheet: -
* Maxim MAX34440 * Maxim MAX34440
Prefixes: 'max34440' Prefixes: 'max34440'
@@ -87,11 +95,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, and ADPM12200. The MAX34451 MAX34461; PMBus DC/DC Power Module ADPM12160, ADPM12200, and ADPM12250. The
supports monitoring voltage or current of 12 channels based on GIN pins. The MAX34451 supports monitoring voltage or current of 12 channels based on GIN
MAX34460 supports 12 voltage channels, and the MAX34461 supports 16 voltage pins. The MAX34460 supports 12 voltage channels, and the MAX34461 supports 16
channels. The ADPM12160, and ADPM12200 also monitors both input and output voltage channels. The ADPM12160, ADPM12200, and ADPM12250 also monitors both
of voltage and current. 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.
@@ -149,7 +157,7 @@ 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, and ADPM12200 only supports in[1-2]. Label is "vin1" - ADPM12160, ADPM12200, and ADPM12250 only supports in[1-2]. Label is "vin1"
and "vout1" respectively. and "vout1" respectively.
Curr Curr
@@ -172,8 +180,9 @@ 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, and ADPM12200, curr[1] is "iin1" and curr[2-6] - For ADPM12160, ADPM12200, and ADPM12250, curr[1] is "iin1"
are "iout[1-5]". - For ADPM12160, and ADPM12200 curr[2-6] are "iout[1-5]".
- For ADPM12250, curr[2-4] are "iout[1-3]".
Power Power
~~~~~ ~~~~~
@@ -209,7 +218,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, and ADPM12200 only supports temp[1]. - ADPM12160, ADPM12200, and ADPM12250 only supports temp[1].
.. note:: .. note::

View File

@@ -18,6 +18,7 @@
enum chips { enum chips {
adpm12160, adpm12160,
adpm12200, adpm12200,
adpm12250,
max34440, max34440,
max34441, max34441,
max34446, max34446,
@@ -97,7 +98,8 @@ 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 != adpm12200) data->id != adpm12160 && data->id != adpm12200 &&
data->id != adpm12250)
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);
@@ -182,7 +184,8 @@ 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 == adpm12200)) data->id == adpm12160 || data->id == adpm12200 ||
data->id == adpm12250))
ret = pmbus_write_word_data(client, page, ret = pmbus_write_word_data(client, page,
MAX34446_MFR_IOUT_AVG, 0); MAX34446_MFR_IOUT_AVG, 0);
@@ -399,6 +402,40 @@ 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,
}, },
[adpm12250] = {
.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[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,
@@ -635,7 +672,8 @@ 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 || data->id == adpm12200) { } else if (data->id == adpm12160 || data->id == adpm12200 ||
data->id == adpm12250) {
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;
} }
@@ -646,6 +684,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[] = {
{ .name = "adpm12160", .driver_data = adpm12160 }, { .name = "adpm12160", .driver_data = adpm12160 },
{ .name = "adpm12200", .driver_data = adpm12200 }, { .name = "adpm12200", .driver_data = adpm12200 },
{ .name = "adpm12250", .driver_data = adpm12250 },
{ .name = "max34440", .driver_data = max34440 }, { .name = "max34440", .driver_data = max34440 },
{ .name = "max34441", .driver_data = max34441 }, { .name = "max34441", .driver_data = max34441 },
{ .name = "max34446", .driver_data = max34446 }, { .name = "max34446", .driver_data = max34446 },