* [PATCH v2 1/2] dt-bindings: hwmon/pmbus: Add Infineon XDP720/XDP730
2026-05-29 5:42 [PATCH v2 0/2] Add support for Infineon eFuse XDP720/XDP730 ASHISH YADAV
@ 2026-05-29 5:42 ` ASHISH YADAV
2026-05-29 6:00 ` sashiko-bot
2026-05-29 16:41 ` Conor Dooley
2026-05-29 5:42 ` [PATCH v2 2/2] hwmon:(pmbus/xdp730) Add support for efuse xdp720/xdp730 ASHISH YADAV
1 sibling, 2 replies; 6+ messages in thread
From: ASHISH YADAV @ 2026-05-29 5:42 UTC (permalink / raw)
To: Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-hwmon, devicetree, linux-kernel, Ashish Yadav
From: Ashish Yadav <ashish.yadav@infineon.com>
Add documentation for the device tree binding of the XDP720/XDP730
eFuse Controllers.
Signed-off-by: Ashish Yadav <ashish.yadav@infineon.com>
---
.../bindings/hwmon/pmbus/infineon,xdp720.yaml | 59 --------------
.../bindings/hwmon/pmbus/infineon,xdp730.yaml | 80 +++++++++++++++++++
2 files changed, 80 insertions(+), 59 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/hwmon/pmbus/infineon,xdp720.yaml
create mode 100644 Documentation/devicetree/bindings/hwmon/pmbus/infineon,xdp730.yaml
diff --git a/Documentation/devicetree/bindings/hwmon/pmbus/infineon,xdp720.yaml b/Documentation/devicetree/bindings/hwmon/pmbus/infineon,xdp720.yaml
deleted file mode 100644
index 72bc3a5e7139..000000000000
--- a/Documentation/devicetree/bindings/hwmon/pmbus/infineon,xdp720.yaml
+++ /dev/null
@@ -1,59 +0,0 @@
-# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
-%YAML 1.2
----
-
-$id: http://devicetree.org/schemas/hwmon/pmbus/infineon,xdp720.yaml#
-$schema: http://devicetree.org/meta-schemas/core.yaml#
-
-title: Infineon XDP720 Digital eFuse Controller
-
-maintainers:
- - Ashish Yadav <ashish.yadav@infineon.com>
-
-description: |
- The XDP720 is an eFuse with integrated current sensor and digital
- controller. It provides accurate system telemetry (V, I, P, T) and
- reports analog current at the IMON pin for post-processing.
-
- Datasheet:
- https://www.infineon.com/assets/row/public/documents/24/49/infineon-xdp720-001-datasheet-en.pdf
-
-properties:
- compatible:
- enum:
- - infineon,xdp720
-
- reg:
- maxItems: 1
-
- infineon,rimon-micro-ohms:
- description:
- The value of the RIMON resistor, in micro ohms, required to enable
- the system overcurrent protection.
-
- vdd-vin-supply:
- description:
- Supply for the VDD_VIN pin (pin 9), the IC controller power supply.
- Typically connected to the input bus (VIN) through a 100 ohm / 100 nF
- RC filter.
-
-required:
- - compatible
- - reg
- - vdd-vin-supply
-
-additionalProperties: false
-
-examples:
- - |
- i2c {
- #address-cells = <1>;
- #size-cells = <0>;
-
- hwmon@11 {
- compatible = "infineon,xdp720";
- reg = <0x11>;
- vdd-vin-supply = <&vdd_vin>;
- infineon,rimon-micro-ohms = <1098000000>; /* 1.098k ohm */
- };
- };
diff --git a/Documentation/devicetree/bindings/hwmon/pmbus/infineon,xdp730.yaml b/Documentation/devicetree/bindings/hwmon/pmbus/infineon,xdp730.yaml
new file mode 100644
index 000000000000..fdbc577bccdd
--- /dev/null
+++ b/Documentation/devicetree/bindings/hwmon/pmbus/infineon,xdp730.yaml
@@ -0,0 +1,80 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+
+$id: http://devicetree.org/schemas/hwmon/pmbus/infineon,xdp730.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Infineon XDP720 / XDP730 Digital eFuse Controllers
+
+maintainers:
+ - Ashish Yadav <ashish.yadav@infineon.com>
+
+description: |
+ The XDP720 and XDP730 are PMBus-compliant digital eFuse controllers
+ with an integrated current sensor. They provide accurate system
+ telemetry (V, I, P, T) and report analog current at the IMON pin for
+ post-processing.
+
+ Both parts share the same PMBus register map and direct-format
+ coefficients; they differ in the GIMON gain step exposed via the
+ TELEMETRY_AVG register (bit 10) and in the VDD_VIN pin number
+ (XDP720: pin 9, XDP730: pin 20).
+
+ Datasheets:
+ - XDP720: https://www.infineon.com/assets/row/public/documents/24/49/infineon-xdp720-001-datasheet-en.pdf
+ - XDP730: https://www.infineon.com/assets/row/public/documents/24/49/infineon-xdp730-001-datasheet-en.pdf
+
+properties:
+ compatible:
+ enum:
+ - infineon,xdp720
+ - infineon,xdp730
+
+ reg:
+ maxItems: 1
+
+ infineon,rimon-micro-ohms:
+ description:
+ The value of the RIMON resistor, in micro ohms, required to enable
+ the system overcurrent protection.
+
+ vdd-vin-supply:
+ description:
+ Supply for the VDD_VIN pin (XDP720 pin 9, XDP730 pin 20), the IC
+ controller power supply. Typically connected to the input bus
+ (VIN) through a 100 ohm / 100 nF RC filter.
+
+required:
+ - compatible
+ - reg
+ - vdd-vin-supply
+
+additionalProperties: false
+
+examples:
+ - |
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ efuse@11 {
+ compatible = "infineon,xdp720";
+ reg = <0x11>;
+ vdd-vin-supply = <&vdd_vin>;
+ infineon,rimon-micro-ohms = <1098000000>; /* 1.098k ohm */
+ };
+ };
+
+ - |
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ efuse@12 {
+ compatible = "infineon,xdp730";
+ reg = <0x12>;
+ vdd-vin-supply = <&vdd_vin>;
+ infineon,rimon-micro-ohms = <1098000000>; /* 1.098k ohm */
+ };
+ };
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v2 2/2] hwmon:(pmbus/xdp730) Add support for efuse xdp720/xdp730
2026-05-29 5:42 [PATCH v2 0/2] Add support for Infineon eFuse XDP720/XDP730 ASHISH YADAV
2026-05-29 5:42 ` [PATCH v2 1/2] dt-bindings: hwmon/pmbus: Add Infineon XDP720/XDP730 ASHISH YADAV
@ 2026-05-29 5:42 ` ASHISH YADAV
2026-05-29 6:29 ` sashiko-bot
1 sibling, 1 reply; 6+ messages in thread
From: ASHISH YADAV @ 2026-05-29 5:42 UTC (permalink / raw)
To: Guenter Roeck, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-hwmon, devicetree, linux-kernel, Ashish Yadav
From: Ashish Yadav <ashish.yadav@infineon.com>
Add the pmbus driver for Infineon XDP720/XDP730 Digital eFuse
Controllers.
Signed-off-by: Ashish Yadav <ashish.yadav@infineon.com>
---
XDP720/XDP730 Digital eFuse Controllers provides accurate system telemetry
(V, I, P, T) and reports analog current at the IMON pin for post-processing.
The Current and Power measurement depends on the RIMON and GIMON values.
The GIMON (microA/A) depends on the 10th bit of TELEMETRY_AVG PMBUS Register.
The value of RIMON (kohm) can be provided by the user through device tree using
infineon,rimon-micro-ohms property.
---
drivers/hwmon/pmbus/Kconfig | 8 +-
drivers/hwmon/pmbus/Makefile | 2 +-
drivers/hwmon/pmbus/xdp720.c | 128 ----------------------------
drivers/hwmon/pmbus/xdp730.c | 159 +++++++++++++++++++++++++++++++++++
4 files changed, 164 insertions(+), 133 deletions(-)
delete mode 100644 drivers/hwmon/pmbus/xdp720.c
create mode 100644 drivers/hwmon/pmbus/xdp730.c
diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
index 8f4bff375ecb..eb3ed41c6fdc 100644
--- a/drivers/hwmon/pmbus/Kconfig
+++ b/drivers/hwmon/pmbus/Kconfig
@@ -711,14 +711,14 @@ config SENSORS_XDP710
This driver can also be built as a module. If so, the module will
be called xdp710.
-config SENSORS_XDP720
- tristate "Infineon XDP720 family"
+config SENSORS_XDP730
+ tristate "Infineon XDP730 family"
help
If you say yes here you get hardware monitoring support for Infineon
- XDP720.
+ XDP720 and XDP730 Digital eFuse Controllers.
This driver can also be built as a module. If so, the module will
- be called xdp720.
+ be called xdp730.
config SENSORS_XDPE152
tristate "Infineon XDPE152 family"
diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
index 7129b62bc00f..6d31082aa91f 100644
--- a/drivers/hwmon/pmbus/Makefile
+++ b/drivers/hwmon/pmbus/Makefile
@@ -69,7 +69,7 @@ obj-$(CONFIG_SENSORS_TPS546D24) += tps546d24.o
obj-$(CONFIG_SENSORS_UCD9000) += ucd9000.o
obj-$(CONFIG_SENSORS_UCD9200) += ucd9200.o
obj-$(CONFIG_SENSORS_XDP710) += xdp710.o
-obj-$(CONFIG_SENSORS_XDP720) += xdp720.o
+obj-$(CONFIG_SENSORS_XDP730) += xdp730.o
obj-$(CONFIG_SENSORS_XDPE122) += xdpe12284.o
obj-$(CONFIG_SENSORS_XDPE152) += xdpe152c4.o
obj-$(CONFIG_SENSORS_XDPE1A2G7B) += xdpe1a2g7b.o
diff --git a/drivers/hwmon/pmbus/xdp720.c b/drivers/hwmon/pmbus/xdp720.c
deleted file mode 100644
index 8729a771f216..000000000000
--- a/drivers/hwmon/pmbus/xdp720.c
+++ /dev/null
@@ -1,128 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Hardware monitoring driver for Infineon XDP720 Digital eFuse Controller
- *
- * Copyright (c) 2026 Infineon Technologies. All rights reserved.
- */
-
-#include <linux/i2c.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/of_device.h>
-#include <linux/bitops.h>
-#include <linux/math64.h>
-#include "pmbus.h"
-
-/*
- * The IMON resistor required to generate the system overcurrent protection.
- * Arbitrary default Rimon value: 2k Ohm
- */
-#define XDP720_DEFAULT_RIMON 2000000000 /* 2k ohm */
-#define XDP720_TELEMETRY_AVG 0xE9
-
-static struct pmbus_driver_info xdp720_info = {
- .pages = 1,
- .format[PSC_VOLTAGE_IN] = direct,
- .format[PSC_VOLTAGE_OUT] = direct,
- .format[PSC_CURRENT_OUT] = direct,
- .format[PSC_POWER] = direct,
- .format[PSC_TEMPERATURE] = direct,
-
- .m[PSC_VOLTAGE_IN] = 4653,
- .b[PSC_VOLTAGE_IN] = 0,
- .R[PSC_VOLTAGE_IN] = -2,
- .m[PSC_VOLTAGE_OUT] = 4653,
- .b[PSC_VOLTAGE_OUT] = 0,
- .R[PSC_VOLTAGE_OUT] = -2,
- /*
- * Current and Power measurement depends on the RIMON (kOhm) and
- * GIMON(microA/A) values.
- */
- .m[PSC_CURRENT_OUT] = 24668,
- .b[PSC_CURRENT_OUT] = 0,
- .R[PSC_CURRENT_OUT] = -4,
- .m[PSC_POWER] = 4486,
- .b[PSC_POWER] = 0,
- .R[PSC_POWER] = -1,
- .m[PSC_TEMPERATURE] = 54,
- .b[PSC_TEMPERATURE] = 22521,
- .R[PSC_TEMPERATURE] = -1,
-
- .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_PIN |
- PMBUS_HAVE_TEMP | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_INPUT |
- PMBUS_HAVE_STATUS_TEMP,
-};
-
-static int xdp720_probe(struct i2c_client *client)
-{
- struct pmbus_driver_info *info;
- int ret;
- u32 rimon;
- int gimon;
-
- info = devm_kmemdup(&client->dev, &xdp720_info, sizeof(*info),
- GFP_KERNEL);
- if (!info)
- return -ENOMEM;
-
- ret = devm_regulator_get_enable(&client->dev, "vdd-vin");
- if (ret)
- return dev_err_probe(&client->dev, ret,
- "failed to enable vdd-vin supply\n");
-
- ret = i2c_smbus_read_word_data(client, XDP720_TELEMETRY_AVG);
- if (ret < 0) {
- dev_err(&client->dev, "Can't get TELEMETRY_AVG\n");
- return ret;
- }
-
- ret >>= 10; /* 10th bit of TELEMETRY_AVG REG for GIMON Value */
- ret &= GENMASK(0, 0);
- if (ret == 1)
- gimon = 18200; /* output gain 18.2 microA/A */
- else
- gimon = 9100; /* output gain 9.1 microA/A */
-
- if (of_property_read_u32(client->dev.of_node,
- "infineon,rimon-micro-ohms", &rimon))
- rimon = XDP720_DEFAULT_RIMON; /* Default if not set via DT */
- if (rimon == 0)
- return -EINVAL;
-
- /* Adapt the current and power scale for each instance */
- info->m[PSC_CURRENT_OUT] = DIV64_U64_ROUND_CLOSEST((u64)
- info->m[PSC_CURRENT_OUT] * rimon * gimon, 1000000000000ULL);
- info->m[PSC_POWER] = DIV64_U64_ROUND_CLOSEST((u64)
- info->m[PSC_POWER] * rimon * gimon, 1000000000000000ULL);
-
- return pmbus_do_probe(client, info);
-}
-
-static const struct of_device_id xdp720_of_match[] = {
- { .compatible = "infineon,xdp720" },
- {}
-};
-MODULE_DEVICE_TABLE(of, xdp720_of_match);
-
-static const struct i2c_device_id xdp720_id[] = {
- { "xdp720" },
- {}
-};
-MODULE_DEVICE_TABLE(i2c, xdp720_id);
-
-static struct i2c_driver xdp720_driver = {
- .driver = {
- .name = "xdp720",
- .of_match_table = xdp720_of_match,
- },
- .probe = xdp720_probe,
- .id_table = xdp720_id,
-};
-
-module_i2c_driver(xdp720_driver);
-
-MODULE_AUTHOR("Ashish Yadav <ashish.yadav@infineon.com>");
-MODULE_DESCRIPTION("PMBus driver for Infineon XDP720 Digital eFuse Controller");
-MODULE_LICENSE("GPL");
-MODULE_IMPORT_NS("PMBUS");
diff --git a/drivers/hwmon/pmbus/xdp730.c b/drivers/hwmon/pmbus/xdp730.c
new file mode 100644
index 000000000000..3d6cb0614fe7
--- /dev/null
+++ b/drivers/hwmon/pmbus/xdp730.c
@@ -0,0 +1,159 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Hardware monitoring driver for Infineon XDP720 / XDP730 Digital
+ * eFuse Controllers.
+ *
+ * Both parts share the same PMBus register map and direct-format
+ * coefficients; they differ in the GIMON gain step exposed via
+ * the TELEMETRY_AVG register and in the VDD_VIN pin number.
+ *
+ * Copyright (c) 2026 Infineon Technologies. All rights reserved.
+ */
+
+#include <linux/bitops.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/math64.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/property.h>
+#include <linux/regulator/consumer.h>
+#include "pmbus.h"
+
+/*
+ * The IMON resistor required to generate the system overcurrent
+ * protection. Arbitrary default Rimon value: 2 kOhm (in micro-ohms).
+ */
+#define XDP730_DEFAULT_RIMON 2000000000U /* 2 kohm */
+#define XDP730_TELEMETRY_AVG 0xE9
+#define XDP730_TELEMETRY_AVG_GIMON BIT(10) /* high/low GIMON select */
+
+/* Chip identifiers carried in OF match-data and i2c_device_id->driver_data. */
+enum xdp730_chip_id {
+ CHIP_XDP720 = 0,
+ CHIP_XDP730,
+};
+
+struct xdp730_data {
+ enum xdp730_chip_id id;
+ struct pmbus_driver_info info;
+};
+
+static const struct pmbus_driver_info xdp730_info = {
+ .pages = 1,
+ .format[PSC_VOLTAGE_IN] = direct,
+ .format[PSC_VOLTAGE_OUT] = direct,
+ .format[PSC_CURRENT_OUT] = direct,
+ .format[PSC_POWER] = direct,
+ .format[PSC_TEMPERATURE] = direct,
+
+ .m[PSC_VOLTAGE_IN] = 4653,
+ .b[PSC_VOLTAGE_IN] = 0,
+ .R[PSC_VOLTAGE_IN] = -2,
+ .m[PSC_VOLTAGE_OUT] = 4653,
+ .b[PSC_VOLTAGE_OUT] = 0,
+ .R[PSC_VOLTAGE_OUT] = -2,
+ /*
+ * Current and Power measurement depend on the RIMON (micro-ohm)
+ * and GIMON (microA/A) values; scaled per-instance in probe().
+ */
+ .m[PSC_CURRENT_OUT] = 24668,
+ .b[PSC_CURRENT_OUT] = 0,
+ .R[PSC_CURRENT_OUT] = -4,
+ .m[PSC_POWER] = 4486,
+ .b[PSC_POWER] = 0,
+ .R[PSC_POWER] = -1,
+ .m[PSC_TEMPERATURE] = 54,
+ .b[PSC_TEMPERATURE] = 22521,
+ .R[PSC_TEMPERATURE] = -1,
+
+ .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_PIN |
+ PMBUS_HAVE_TEMP | PMBUS_HAVE_IOUT |
+ PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_STATUS_TEMP,
+};
+
+static int xdp730_probe(struct i2c_client *client)
+{
+ struct xdp730_data *data;
+ int ret;
+ int gimon;
+ u32 rimon;
+
+ data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ data->id = (enum xdp730_chip_id)(uintptr_t)i2c_get_match_data(client);
+ data->info = xdp730_info;
+
+ ret = devm_regulator_get_enable(&client->dev, "vdd-vin");
+ if (ret)
+ return dev_err_probe(&client->dev, ret,
+ "failed to enable vdd-vin supply\n");
+
+ ret = i2c_smbus_read_word_data(client, XDP730_TELEMETRY_AVG);
+ if (ret < 0)
+ return dev_err_probe(&client->dev, ret,
+ "failed to read TELEMETRY_AVG\n");
+
+ /* Bit 10 of TELEMETRY_AVG selects the GIMON gain step in microA/A */
+ switch (data->id) {
+ case CHIP_XDP720:
+ gimon = (ret & XDP730_TELEMETRY_AVG_GIMON) ? 18200 : 9100;
+ dev_info(&client->dev, "Initialised XDP720 instance\n");
+ break;
+ case CHIP_XDP730:
+ gimon = (ret & XDP730_TELEMETRY_AVG_GIMON) ? 20000 : 10000;
+ dev_info(&client->dev, "Initialised XDP730 instance\n");
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (device_property_read_u32(&client->dev,
+ "infineon,rimon-micro-ohms", &rimon))
+ rimon = XDP730_DEFAULT_RIMON; /* Default if not in FW */
+ if (rimon == 0)
+ return -EINVAL;
+
+ /* Adapt the current and power scale for each instance. */
+ data->info.m[PSC_CURRENT_OUT] = DIV64_U64_ROUND_CLOSEST((u64)
+ data->info.m[PSC_CURRENT_OUT] * rimon * gimon,
+ 1000000000000ULL);
+ data->info.m[PSC_POWER] = DIV64_U64_ROUND_CLOSEST((u64)
+ data->info.m[PSC_POWER] * rimon * gimon,
+ 1000000000000000ULL);
+
+ return pmbus_do_probe(client, &data->info);
+}
+
+static const struct of_device_id xdp730_of_match[] = {
+ { .compatible = "infineon,xdp720", .data = (void *)CHIP_XDP720 },
+ { .compatible = "infineon,xdp730", .data = (void *)CHIP_XDP730 },
+ { }
+};
+MODULE_DEVICE_TABLE(of, xdp730_of_match);
+
+static const struct i2c_device_id xdp730_id[] = {
+ { "xdp720", CHIP_XDP720 },
+ { "xdp730", CHIP_XDP730 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, xdp730_id);
+
+static struct i2c_driver xdp730_driver = {
+ .driver = {
+ .name = "xdp730",
+ .of_match_table = xdp730_of_match,
+ },
+ .probe = xdp730_probe,
+ .id_table = xdp730_id,
+};
+
+module_i2c_driver(xdp730_driver);
+
+MODULE_AUTHOR("Ashish Yadav <ashish.yadav@infineon.com>");
+MODULE_DESCRIPTION("PMBus driver for Infineon XDP720/XDP730 Digital eFuse Controllers");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("PMBUS");
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread