hwmon: (pmbus/tda38740) Add driver for Infineon TDA38740/TDA38725

Add a PMBus driver for Infineon TDA38740 and TDA38725
single-voltage synchronous buck regulators.

Signed-off-by: Colin Huang <u8813345@gmail.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://patch.msgid.link/20260918-add-tda38740-and-tda38725-v6-2-a8b11018d850@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Colin Huang 2026-09-18 18:23:55 +08:00 committed by Guenter Roeck
parent ea863d7834
commit 3f02ddc377
5 changed files with 140 additions and 0 deletions

View File

@ -267,6 +267,7 @@ Hardware Monitoring Kernel Drivers
sy7636a-hwmon
tc654
tc74
tda38740
thmc50
tmp102
tmp103

View File

@ -0,0 +1,65 @@
.. SPDX-License-Identifier: GPL-2.0-only
====================================
Kernel driver tda38740
====================================
Supported chips:
* Infineon TDA38740
* Infineon TDA38725
Prefix: 'tda38740'
Addresses scanned: -
Datasheet:
https://www.infineon.com/row/public/documents/24/49/infineon-tda38740-tda38725-datasheet-en.pdf
Author: Colin Huang <u8813345@gmail.com>
Description
-----------
The TDA38740 and TDA38725 are single-output synchronous buck regulators with a
PMBus interface. They expose basic voltage, current, power and temperature
telemetry through the standard PMBus hwmon interfaces.
Sysfs entries
-------------
======================= =======================================================
curr1_alarm Input current alarm
curr1_input Measured input current
curr1_label "iin"
curr2_crit Critical maximum output current
curr2_crit_alarm Output current critical high alarm
curr2_input Measured output current
curr2_label "iout"
in1_crit Critical maximum input voltage
in1_crit_alarm Input voltage critical high alarm
in1_input Measured input voltage
in1_label "vin"
in2_crit Critical maximum output voltage
in2_crit_alarm Output voltage critical high alarm
in2_input Measured output voltage
in2_label "vout"
in2_lcrit Critical minimum output voltage
in2_lcrit_alarm Output voltage critical low alarm
power1_alarm Input power alarm
power1_input Measured input power
power1_label "pin"
power2_input Measured output power
power2_label "pout"
temp1_crit Critical high temperature
temp1_crit_alarm Chip temperature critical high alarm
temp1_input Measured temperature
temp1_max Maximum temperature
temp1_max_alarm Chip temperature high alarm
======================= =======================================================

View File

@ -782,6 +782,15 @@ config SENSORS_TDA38640_REGULATOR
If you say yes here you get regulator support for Infineon
TDA38640 as regulator.
config SENSORS_TDA38740
tristate "Infineon TDA38725/TDA38740"
help
If you say yes here you get hardware monitoring support for Infineon
TDA38725 and TDA38740.
This driver can also be built as a module. If so, the module will
be called tda38740.
config SENSORS_TPS25990
tristate "TI TPS25990"
help

View File

@ -71,6 +71,7 @@ obj-$(CONFIG_SENSORS_STEF48H28) += stef48h28.o
obj-$(CONFIG_SENSORS_SQ24860) += sq24860.o
obj-$(CONFIG_SENSORS_STPDDC60) += stpddc60.o
obj-$(CONFIG_SENSORS_TDA38640) += tda38640.o
obj-$(CONFIG_SENSORS_TDA38740) += tda38740.o
obj-$(CONFIG_SENSORS_TPS25990) += tps25990.o
obj-$(CONFIG_SENSORS_TPS40422) += tps40422.o
obj-$(CONFIG_SENSORS_TPS53679) += tps53679.o

View File

@ -0,0 +1,64 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Hardware monitoring driver for Infineon TDA38725/TDA38740
*
* Copyright (c) 2023 9elements GmbH
*
*/
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include "pmbus.h"
static struct pmbus_driver_info tda38740_info = {
.pages = 1,
.format[PSC_VOLTAGE_IN] = linear,
.format[PSC_VOLTAGE_OUT] = linear,
.format[PSC_CURRENT_OUT] = linear,
.format[PSC_CURRENT_IN] = linear,
.format[PSC_POWER] = linear,
.format[PSC_TEMPERATURE] = linear,
.func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT
| PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP
| PMBUS_HAVE_IIN
| PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT
| PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT
| PMBUS_HAVE_POUT | PMBUS_HAVE_PIN,
};
static int tda38740_probe(struct i2c_client *client)
{
return pmbus_do_probe(client, &tda38740_info);
}
static const struct i2c_device_id tda38740_id[] = {
{ .name = "tda38725"},
{ .name = "tda38740"},
{}
};
MODULE_DEVICE_TABLE(i2c, tda38740_id);
static const struct of_device_id tda38740_of_match[] = {
{ .compatible = "infineon,tda38725"},
{ .compatible = "infineon,tda38740"},
{}
};
MODULE_DEVICE_TABLE(of, tda38740_of_match);
static struct i2c_driver tda38740_driver = {
.driver = {
.name = "tda38740",
.of_match_table = tda38740_of_match,
},
.probe = tda38740_probe,
.id_table = tda38740_id,
};
module_i2c_driver(tda38740_driver);
MODULE_DESCRIPTION("PMBus driver for Infineon TDA38725/TDA38740");
MODULE_LICENSE("GPL");
MODULE_IMPORT_NS("PMBUS");