]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
hwmon: (pmbus/lt3074) add support for lt3074
authorCedric Encarnacion <cedricjustine.encarnacion@analog.com>
Mon, 21 Apr 2025 12:18:19 +0000 (20:18 +0800)
committerGuenter Roeck <linux@roeck-us.net>
Wed, 23 Apr 2025 14:18:27 +0000 (07:18 -0700)
Add hardware monitoring and regulator support for LT3074. The LT3074 is an
ultrafast, ultralow noise 3A, 5.5V dropout linear regulator. The PMBus
serial interface allows telemetry for input/output voltage, bias voltage,
output current, and die temperature.

Signed-off-by: Cedric Encarnacion <cedricjustine.encarnacion@analog.com>
Link: https://lore.kernel.org/r/20250421-upstream-lt3074-v3-2-71636322f9fe@analog.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Documentation/hwmon/index.rst
Documentation/hwmon/lt3074.rst [new file with mode: 0644]
MAINTAINERS
drivers/hwmon/pmbus/Kconfig
drivers/hwmon/pmbus/Makefile
drivers/hwmon/pmbus/lt3074.c [new file with mode: 0644]

index da5895115724df35416b88fcd6edb13c2d5b07f2..d17f942d8535359e942ae6359374431c1976afef 100644 (file)
@@ -126,6 +126,7 @@ Hardware Monitoring Kernel Drivers
    lm95234
    lm95245
    lochnagar
+   lt3074
    lt7182s
    ltc2992
    ltc2945
diff --git a/Documentation/hwmon/lt3074.rst b/Documentation/hwmon/lt3074.rst
new file mode 100644 (file)
index 0000000..234f369
--- /dev/null
@@ -0,0 +1,72 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+Kernel driver lt3074
+====================
+
+Supported chips:
+
+  * Analog Devices LT3074
+
+    Prefix: 'lt3074'
+
+    Addresses scanned: -
+
+    Datasheet: https://www.analog.com/en/products/lt3074.html
+
+Authors: Cedric Encarnacion <cedricjustine.encarnacion@analog.com>
+
+
+Description
+-----------
+
+This driver supports hardware monitoring for Analog Devices LT3074 Linear
+Regulator with PMBus interface.
+
+The LT3074 is a low voltage, ultra-low noise and ultra-fast transient
+response linear regulator with PMBus serial interface. PMBus telemetry
+feature provides information regarding the output voltage and current,
+input voltage, bias voltage and die temperature.
+
+The driver is a client driver to the core PMBus driver. Please see
+Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
+
+Usage Notes
+-----------
+
+This driver does not auto-detect devices. You will have to instantiate
+the devices explicitly. Please see Documentation/i2c/instantiating-devices.rst
+for details.
+
+Platform data support
+---------------------
+
+The driver supports standard PMBus driver platform data.
+
+Sysfs entries
+-------------
+
+======================= =======================================================
+in1_label              "vin"
+in1_input              Measured input voltage
+in1_max                        Input overvoltage warning limit
+in1_max_alarm          Input overvoltage warning status
+in1_min                        Input undervoltage warning limit
+in1_min_alarm          Input undervoltage warning status
+in2_label              "vmon"
+in2_input              Measured bias voltage
+in2_max                        Bias overvoltage warning limit
+in2_min                        Bias undervoltage warning limit
+in3_label              "vout1"
+in3_input              Measured output voltage
+in3_max                        Output overvoltage warning limit
+in3_max_alarm          Output overvoltage warning status
+in3_min                        Output undervoltage warning limit
+in3_min_alarm          Output undervoltage warning status
+curr1_label            "iout1"
+curr1_input            Measured output current.
+curr1_crit             Output overcurrent fault limit
+curr1_crit_alarm       Output overcurrent fault status
+temp1_input            Measured temperature
+temp1_max              Maximum temperature limit
+temp1_max_alarm                Overtemperature warning status
+======================= =======================================================
index eaa786e04abd1fb7e0d43c32b0308c5cb72615b4..6034c18b2c084c302ae8fb8199792ef607e45fa0 100644 (file)
@@ -13995,6 +13995,8 @@ L:      linux-hwmon@vger.kernel.org
 S:     Supported
 W:     https://ez.analog.com/linux-software-drivers
 F:     Documentation/devicetree/bindings/hwmon/pmbus/adi,lt3074.yaml
+F:     Documentation/hwmon/lt3074.rst
+F:     drivers/hwmon/pmbus/lt3074.c
 
 LTC1660 DAC DRIVER
 M:     Marcus Folkesson <marcus.folkesson@gmail.com>
index c9b3c314998234e639db1770c18c6f75fa037d25..441f984a859dd935e5248793f1bf54204ce2c371 100644 (file)
@@ -218,6 +218,24 @@ config SENSORS_LM25066_REGULATOR
          If you say yes here you get regulator support for National
          Semiconductor LM25066, LM5064, and LM5066.
 
+config SENSORS_LT3074
+       tristate "Analog Devices LT3074"
+       help
+         If you say yes here you get hardware monitoring support for Analog
+         Devices LT3074.
+
+         This driver can also be built as a module. If so, the module will
+         be called lt3074.
+
+config SENSORS_LT3074_REGULATOR
+       tristate "Regulator support for LT3074"
+       depends on SENSORS_LT3074 && REGULATOR
+       help
+         If you say yes here you get regulator support for Analog Devices
+         LT3074. The LT3074 is a low voltage, ultralow noise, high PSRR,
+         dropout linear regulator. The device supplies up to 3A with a
+         typical dropout voltage of 45mV.
+
 config SENSORS_LT7182S
        tristate "Analog Devices LT7182S"
        help
index 56f128c4653e3087ecd3c2fd859bb0bd9ff10a3d..29cd8a3317d29f85113b6a79904d0d8cb48fc61b 100644 (file)
@@ -23,6 +23,7 @@ obj-$(CONFIG_SENSORS_IR38064) += ir38064.o
 obj-$(CONFIG_SENSORS_IRPS5401) += irps5401.o
 obj-$(CONFIG_SENSORS_ISL68137) += isl68137.o
 obj-$(CONFIG_SENSORS_LM25066)  += lm25066.o
+obj-$(CONFIG_SENSORS_LT3074)   += lt3074.o
 obj-$(CONFIG_SENSORS_LT7182S)  += lt7182s.o
 obj-$(CONFIG_SENSORS_LTC2978)  += ltc2978.o
 obj-$(CONFIG_SENSORS_LTC3815)  += ltc3815.o
diff --git a/drivers/hwmon/pmbus/lt3074.c b/drivers/hwmon/pmbus/lt3074.c
new file mode 100644 (file)
index 0000000..3704dbe
--- /dev/null
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Hardware monitoring driver for Analog Devices LT3074
+ *
+ * Copyright (C) 2025 Analog Devices, Inc.
+ */
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+
+#include "pmbus.h"
+
+#define LT3074_MFR_READ_VBIAS                  0xc6
+#define LT3074_MFR_BIAS_OV_WARN_LIMIT          0xc7
+#define LT3074_MFR_BIAS_UV_WARN_LIMIT          0xc8
+#define LT3074_MFR_SPECIAL_ID                  0xe7
+
+#define LT3074_SPECIAL_ID_VALUE                        0x1c1d
+
+static const struct regulator_desc __maybe_unused lt3074_reg_desc[] = {
+       PMBUS_REGULATOR_ONE("regulator"),
+};
+
+static int lt3074_read_word_data(struct i2c_client *client, int page,
+                                int phase, int reg)
+{
+       switch (reg) {
+       case PMBUS_VIRT_READ_VMON:
+               return pmbus_read_word_data(client, page, phase,
+                                          LT3074_MFR_READ_VBIAS);
+       case PMBUS_VIRT_VMON_UV_WARN_LIMIT:
+               return pmbus_read_word_data(client, page, phase,
+                                          LT3074_MFR_BIAS_UV_WARN_LIMIT);
+       case PMBUS_VIRT_VMON_OV_WARN_LIMIT:
+               return pmbus_read_word_data(client, page, phase,
+                                          LT3074_MFR_BIAS_OV_WARN_LIMIT);
+       default:
+               return -ENODATA;
+       }
+}
+
+static int lt3074_write_word_data(struct i2c_client *client, int page,
+                                 int reg, u16 word)
+{
+       switch (reg) {
+       case PMBUS_VIRT_VMON_UV_WARN_LIMIT:
+               return pmbus_write_word_data(client, 0,
+                                           LT3074_MFR_BIAS_UV_WARN_LIMIT,
+                                           word);
+       case PMBUS_VIRT_VMON_OV_WARN_LIMIT:
+               return pmbus_write_word_data(client, 0,
+                                           LT3074_MFR_BIAS_OV_WARN_LIMIT,
+                                           word);
+       default:
+               return -ENODATA;
+       }
+}
+
+static struct pmbus_driver_info lt3074_info = {
+       .pages = 1,
+       .format[PSC_VOLTAGE_IN] = linear,
+       .format[PSC_VOLTAGE_OUT] = linear,
+       .format[PSC_CURRENT_OUT] = linear,
+       .format[PSC_TEMPERATURE] = linear,
+       .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_IOUT |
+                  PMBUS_HAVE_TEMP | PMBUS_HAVE_VMON |
+                  PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_IOUT |
+                  PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_STATUS_TEMP,
+       .read_word_data = lt3074_read_word_data,
+       .write_word_data = lt3074_write_word_data,
+#if IS_ENABLED(CONFIG_SENSORS_LT3074_REGULATOR)
+       .num_regulators = 1,
+       .reg_desc = lt3074_reg_desc,
+#endif
+};
+
+static int lt3074_probe(struct i2c_client *client)
+{
+       int ret;
+       struct device *dev = &client->dev;
+
+       if (!i2c_check_functionality(client->adapter,
+                                    I2C_FUNC_SMBUS_READ_WORD_DATA))
+               return -ENODEV;
+
+       ret = i2c_smbus_read_word_data(client, LT3074_MFR_SPECIAL_ID);
+       if (ret < 0)
+               return dev_err_probe(dev, ret, "Failed to read ID\n");
+
+       if (ret != LT3074_SPECIAL_ID_VALUE)
+               return dev_err_probe(dev, -ENODEV, "ID mismatch\n");
+
+       return pmbus_do_probe(client, &lt3074_info);
+}
+
+static const struct i2c_device_id lt3074_id[] = {
+       { "lt3074", 0 },
+       {}
+};
+MODULE_DEVICE_TABLE(i2c, lt3074_id);
+
+static const struct of_device_id __maybe_unused lt3074_of_match[] = {
+       { .compatible = "adi,lt3074" },
+       {}
+};
+MODULE_DEVICE_TABLE(of, lt3074_of_match);
+
+static struct i2c_driver lt3074_driver = {
+       .driver = {
+               .name = "lt3074",
+               .of_match_table = of_match_ptr(lt3074_of_match),
+       },
+       .probe = lt3074_probe,
+       .id_table = lt3074_id,
+};
+module_i2c_driver(lt3074_driver);
+
+MODULE_AUTHOR("Cedric Encarnacion <cedricjustine.encarnacion@analog.com>");
+MODULE_DESCRIPTION("PMBus driver for Analog Devices LT3074");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("PMBUS");