hwmon: pmbus: mpq8785: Add support for MPM82504

[ Upstream commit c27291468e ]

Add support for the Monolithic Power Systems MPM82504 digital voltage
regulator. MPM82504 uses PMBus direct format for voltage output.

Tested with device tree based matching.

Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
Link: https://lore.kernel.org/r/20250511035701.2607947-5-paweldembicki@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Stable-dep-of: 9e33c1dba2 ("hwmon: (pmbus/mpq8785) fix VOUT_MODE mismatch during identification")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Pawel Dembicki
2025-05-11 05:55:47 +02:00
committed by Sasha Levin
parent 8c311c726f
commit 369d2ed2da
2 changed files with 43 additions and 6 deletions

View File

@@ -5,6 +5,7 @@ Kernel driver mpq8785
Supported chips:
* MPS MPM82504
* MPS MPQ8785
Prefix: 'mpq8785'
@@ -14,6 +15,14 @@ Author: Charles Hsu <ythsu0511@gmail.com>
Description
-----------
The MPM82504 is a quad 25A, scalable, fully integrated power module with a PMBus
interface. The device offers a complete power solution that achieves up to 25A
per output channel. The MPM82504 has four output channels that can be paralleled
to provide 50A, 75A, or 100A of output current for flexible configurations.
The device can also operate in parallel with the MPM3695-100 and additional
MPM82504 devices to provide a higher output current. The MPM82504 operates
at high efficiency across a wide load range.
The MPQ8785 is a fully integrated, PMBus-compatible, high-frequency, synchronous
buck converter. The MPQ8785 offers a very compact solution that achieves up to
40A output current per phase, with excellent load and line regulation over a
@@ -23,18 +32,19 @@ output current load range.
The PMBus interface provides converter configurations and key parameters
monitoring.
The MPQ8785 adopts MPS's proprietary multi-phase digital constant-on-time (MCOT)
The devices adopts MPS's proprietary multi-phase digital constant-on-time (MCOT)
control, which provides fast transient response and eases loop stabilization.
The MCOT scheme also allows multiple MPQ8785 devices to be connected in parallel
with excellent current sharing and phase interleaving for high-current
The MCOT scheme also allows multiple devices or channels to be connected in
parallel with excellent current sharing and phase interleaving for high-current
applications.
Fully integrated protection features include over-current protection (OCP),
over-voltage protection (OVP), under-voltage protection (UVP), and
over-temperature protection (OTP).
The MPQ8785 requires a minimal number of readily available, standard external
components, and is available in a TLGA (5mmx6mm) package.
All supported modules require a minimal number of readily available, standard
external components. The MPM82504 is available in a BGA (15mmx30mmx5.18mm)
package and the MPQ8785 is available in a TLGA (5mmx6mm) package.
Device compliant with:

View File

@@ -4,14 +4,18 @@
*/
#include <linux/i2c.h>
#include <linux/bitops.h>
#include <linux/module.h>
#include <linux/property.h>
#include <linux/of_device.h>
#include "pmbus.h"
enum chips { mpq8785 };
#define MPM82504_READ_TEMPERATURE_1_SIGN_POS 9
enum chips { mpm82504, mpq8785 };
static u16 voltage_scale_loop_max_val[] = {
[mpm82504] = GENMASK(9, 0),
[mpq8785] = GENMASK(10, 0),
};
@@ -41,6 +45,20 @@ static int mpq8785_identify(struct i2c_client *client,
return 0;
};
static int mpm82504_read_word_data(struct i2c_client *client, int page,
int phase, int reg)
{
int ret;
ret = pmbus_read_word_data(client, page, phase, reg);
if (ret < 0 || reg != PMBUS_READ_TEMPERATURE_1)
return ret;
/* Fix PMBUS_READ_TEMPERATURE_1 signedness */
return sign_extend32(ret, MPM82504_READ_TEMPERATURE_1_SIGN_POS) & 0xffff;
}
static struct pmbus_driver_info mpq8785_info = {
.pages = 1,
.format[PSC_VOLTAGE_IN] = direct,
@@ -63,12 +81,14 @@ static struct pmbus_driver_info mpq8785_info = {
};
static const struct i2c_device_id mpq8785_id[] = {
{ "mpm82504", mpm82504 },
{ "mpq8785", mpq8785 },
{ },
};
MODULE_DEVICE_TABLE(i2c, mpq8785_id);
static const struct of_device_id __maybe_unused mpq8785_of_match[] = {
{ .compatible = "mps,mpm82504", .data = (void *)mpm82504 },
{ .compatible = "mps,mpq8785", .data = (void *)mpq8785 },
{}
};
@@ -92,6 +112,13 @@ static int mpq8785_probe(struct i2c_client *client)
chip_id = (kernel_ulong_t)i2c_get_match_data(client);
switch (chip_id) {
case mpm82504:
info->format[PSC_VOLTAGE_OUT] = direct;
info->m[PSC_VOLTAGE_OUT] = 8;
info->b[PSC_VOLTAGE_OUT] = 0;
info->R[PSC_VOLTAGE_OUT] = 2;
info->read_word_data = mpm82504_read_word_data;
break;
case mpq8785:
info->identify = mpq8785_identify;
break;