hwmon: Add driver for MPS MPQ8785 Synchronous Step-Down Converter
authorCharles Hsu <ythsu0511@gmail.com>
Wed, 31 Jan 2024 07:48:22 +0000 (15:48 +0800)
committerGuenter Roeck <linux@roeck-us.net>
Sun, 25 Feb 2024 20:37:36 +0000 (12:37 -0800)
Add support for mpq8785 device from Monolithic Power Systems, Inc.
(MPS) vendor. This is synchronous step-down controller.

Signed-off-by: Charles 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: Guenter Roeck <linux@roeck-us.net>
Documentation/hwmon/index.rst
Documentation/hwmon/mpq8785.rst [new file with mode: 0644]
drivers/hwmon/pmbus/Kconfig
drivers/hwmon/pmbus/Makefile
drivers/hwmon/pmbus/mpq8785.c [new file with mode: 0644]

index 8f73badecba11cb39a53e28a137f71890bbaa779..9ac087dd3e78d1a317d7c247b6c034d6721449bd 100644 (file)
@@ -164,6 +164,7 @@ Hardware Monitoring Kernel Drivers
    mp2975
    mp5023
    mp5990
+   mpq8785
    nct6683
    nct6775
    nct7802
diff --git a/Documentation/hwmon/mpq8785.rst b/Documentation/hwmon/mpq8785.rst
new file mode 100644 (file)
index 0000000..bf8176b
--- /dev/null
@@ -0,0 +1,94 @@
+.. 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**
index 294808f5240abd3f775270ba4ac5e2bb705b7e19..557ae0c414b09ee8c3adb616320f9bd69fc1097b 100644 (file)
@@ -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
index cf8a767445456ab924e7dafb343714e34d495183..f14ecf03ad7790edbc3c30b2886d495b06144ae7 100644 (file)
@@ -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
diff --git a/drivers/hwmon/pmbus/mpq8785.c b/drivers/hwmon/pmbus/mpq8785.c
new file mode 100644 (file)
index 0000000..4e2549c
--- /dev/null
@@ -0,0 +1,90 @@
+// 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);