mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-04-03 12:05:13 +02:00
hwmon: pmbus: mpq8785: Add support for MPM82504
[ Upstream commitc27291468e] 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:
committed by
Sasha Levin
parent
8c311c726f
commit
369d2ed2da
@@ -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:
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user