Commit f20b4a93 authored by Charles Hsu's avatar Charles Hsu Committed by Guenter Roeck
Browse files

hwmon: Add driver for MPS MPQ8785 Synchronous Step-Down Converter



Add support for mpq8785 device from Monolithic Power Systems, Inc.
(MPS) vendor. This is synchronous step-down controller.

Signed-off-by: default avatarCharles Hsu <ythsu0511@gmail.com>
Link: https://lore.kernel.org/r/20240131074822.2962078-2-ythsu0511@gmail.com


[groeck: probe_new --> probe; add MODULE_IMPORT_NS(PMBUS)]
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 7e6707f7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -164,6 +164,7 @@ Hardware Monitoring Kernel Drivers
   mp2975
   mp5023
   mp5990
   mpq8785
   nct6683
   nct6775
   nct7802
+94 −0
Original line number Diff line number Diff line
.. SPDX-License-Identifier: GPL-2.0-only

Kernel driver mpq8785
=======================

Supported chips:

  * MPS MPQ8785

    Prefix: 'mpq8785'

Author: Charles Hsu <ythsu0511@gmail.com>

Description
-----------

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
wide input supply range. The MPQ8785 operates at high efficiency over a wide
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)
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
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.

Device compliant with:

- PMBus rev 1.3 interface.

The driver exports the following attributes via the 'sysfs' files
for input voltage:

**in1_input**

**in1_label**

**in1_max**

**in1_max_alarm**

**in1_min**

**in1_min_alarm**

**in1_crit**

**in1_crit_alarm**

The driver provides the following attributes for output voltage:

**in2_input**

**in2_label**

**in2_alarm**

The driver provides the following attributes for output current:

**curr1_input**

**curr1_label**

**curr1_max**

**curr1_max_alarm**

**curr1_crit**

**curr1_crit_alarm**

The driver provides the following attributes for temperature:

**temp1_input**

**temp1_max**

**temp1_max_alarm**

**temp1_crit**

**temp1_crit_alarm**
+9 −0
Original line number Diff line number Diff line
@@ -377,6 +377,15 @@ config SENSORS_MPQ7932
	  This driver can also be built as a module. If so, the module will
	  be called mpq7932.

config SENSORS_MPQ8785
	tristate "MPS MPQ8785"
	help
	  If you say yes here you get hardware monitoring functionality support
	  for power management IC MPS MPQ8785.

	  This driver can also be built as a module. If so, the module will
	  be called mpq8785.

config SENSORS_PIM4328
	tristate "Flex PIM4328 and compatibles"
	help
+1 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ obj-$(CONFIG_SENSORS_MP2975) += mp2975.o
obj-$(CONFIG_SENSORS_MP5023)	+= mp5023.o
obj-$(CONFIG_SENSORS_MP5990)	+= mp5990.o
obj-$(CONFIG_SENSORS_MPQ7932)	+= mpq7932.o
obj-$(CONFIG_SENSORS_MPQ8785)	+= mpq8785.o
obj-$(CONFIG_SENSORS_PLI1209BC)	+= pli1209bc.o
obj-$(CONFIG_SENSORS_PM6764TR)	+= pm6764tr.o
obj-$(CONFIG_SENSORS_PXE1610)	+= pxe1610.o
+90 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Driver for MPS MPQ8785 Step-Down Converter
 */

#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include "pmbus.h"

static int mpq8785_identify(struct i2c_client *client,
			    struct pmbus_driver_info *info)
{
	int vout_mode;

	vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
	if (vout_mode < 0 || vout_mode == 0xff)
		return vout_mode < 0 ? vout_mode : -ENODEV;
	switch (vout_mode >> 5) {
	case 0:
		info->format[PSC_VOLTAGE_OUT] = linear;
		break;
	case 1:
	case 2:
		info->format[PSC_VOLTAGE_OUT] = direct,
		info->m[PSC_VOLTAGE_OUT] = 64;
		info->b[PSC_VOLTAGE_OUT] = 0;
		info->R[PSC_VOLTAGE_OUT] = 1;
		break;
	default:
		return -ENODEV;
	}

	return 0;
};

static struct pmbus_driver_info mpq8785_info = {
	.pages = 1,
	.format[PSC_VOLTAGE_IN] = direct,
	.format[PSC_CURRENT_OUT] = direct,
	.format[PSC_TEMPERATURE] = direct,
	.m[PSC_VOLTAGE_IN] = 4,
	.b[PSC_VOLTAGE_IN] = 0,
	.R[PSC_VOLTAGE_IN] = 1,
	.m[PSC_CURRENT_OUT] = 16,
	.b[PSC_CURRENT_OUT] = 0,
	.R[PSC_CURRENT_OUT] = 0,
	.m[PSC_TEMPERATURE] = 1,
	.b[PSC_TEMPERATURE] = 0,
	.R[PSC_TEMPERATURE] = 0,
	.func[0] =
		PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT |
		PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
		PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
		PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
	.identify = mpq8785_identify,
};

static int mpq8785_probe(struct i2c_client *client)
{
	return pmbus_do_probe(client, &mpq8785_info);
};

static const struct i2c_device_id mpq8785_id[] = {
	{ "mpq8785", 0 },
	{ },
};
MODULE_DEVICE_TABLE(i2c, mpq8785_id);

static const struct of_device_id __maybe_unused mpq8785_of_match[] = {
	{ .compatible = "mps,mpq8785" },
	{}
};
MODULE_DEVICE_TABLE(of, mpq8785_of_match);

static struct i2c_driver mpq8785_driver = {
	.driver = {
		   .name = "mpq8785",
		   .of_match_table = of_match_ptr(mpq8785_of_match),
	},
	.probe = mpq8785_probe,
	.id_table = mpq8785_id,
};

module_i2c_driver(mpq8785_driver);

MODULE_AUTHOR("Charles Hsu <ythsu0511@gmail.com>");
MODULE_DESCRIPTION("PMBus driver for MPS MPQ8785");
MODULE_LICENSE("GPL");
MODULE_IMPORT_NS(PMBUS);