Re: [PATCH v2 2/2] hwmon:(pmbus/xdp720) Add support for efuse xdp720

From: ashish yadav

Date: Mon Apr 06 2026 - 01:23:17 EST


Hi Guenter,

I hope you’re doing well.

I’m writing to provide an update regarding the m[PSC_POWER] issue
identified in the following
patchset: https://sashiko.dev/#/patchset/20260401104550.115715-1-Ashish.Yadav%40infineon.com.

The discrepancy was caused by an incorrect divisor in the power
calculation. Specifically:
info->m[PSC_POWER] = DIV64_U64_ROUND_CLOSEST((u64) info->m[PSC_POWER]
* rimon * gimon, 1000000000000);

The divisor should be 10^15 rather than 10^12.
With this correction, the [PSC_POWER] value scales correctly to 163.29
(previously 16329).

I will include this fix in the next version of the patch.
Apologies for any inconvenience this may have caused, and thank you
for your time and feedback.

With Best Regards,
Ashish Yadav


On Thu, Apr 2, 2026 at 7:39 PM ashish yadav <ashishyadav78@xxxxxxxxx> wrote:
>
> Hi Guenter,
>
> Thanks for your valuable feedback and time.
> Please find my response in-line.
>
> With Best Regards,
> Ashish Yadav
>
> On Wed, Apr 1, 2026 at 9:26 PM Guenter Roeck <linux@xxxxxxxxxxxx> wrote:
> >
> > Hi,
> >
> > On 4/1/26 03:45, ASHISH YADAV wrote:
> > > From: Ashish Yadav <ashish.yadav@xxxxxxxxxxxx>
> > >
> > > Add the pmbus driver for Infineon XDP720 Digital eFuse Controller.
> > >
> > > Signed-off-by: Ashish Yadav <ashish.yadav@xxxxxxxxxxxx>
> > > ---
> > > XDP720 Digital eFuse Controller 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.
> > > Please look into data sheet sections 5.4.2 and 5.4.4 for more details:
> > > https://www.infineon.com/assets/row/public/documents/24/49/infineon-xdp720-001-datasheet-en.pdf
> > >
> > > 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.
> >
> > Please have a look at
> >
> > https://sashiko.dev/#/patchset/20260401104550.115715-1-Ashish.Yadav%40infineon.com
> >
> > Main concern is the power measurement range, but also please use 1000000000000ULL
> > as suggested.
>
> Sure, We will look into it and get back to you.
>
> > Thanks,
> > Guenter
> >
> > > ---
> > > drivers/hwmon/pmbus/Kconfig | 9 +++
> > > drivers/hwmon/pmbus/Makefile | 1 +
> > > drivers/hwmon/pmbus/xdp720.c | 123 +++++++++++++++++++++++++++++++++++
> > > 3 files changed, 133 insertions(+)
> > > create mode 100644 drivers/hwmon/pmbus/xdp720.c
> > >
> > > diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
> > > index fc1273abe357..c419e3ecce90 100644
> > > --- a/drivers/hwmon/pmbus/Kconfig
> > > +++ b/drivers/hwmon/pmbus/Kconfig
> > > @@ -702,6 +702,15 @@ 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"
> > > + help
> > > + If you say yes here you get hardware monitoring support for Infineon
> > > + XDP720.
> > > +
> > > + This driver can also be built as a module. If so, the module will
> > > + be called xdp720.
> > > +
> > > config SENSORS_XDPE152
> > > tristate "Infineon XDPE152 family"
> > > help
> > > diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
> > > index d6c86924f887..1cac7ccae79f 100644
> > > --- a/drivers/hwmon/pmbus/Makefile
> > > +++ b/drivers/hwmon/pmbus/Makefile
> > > @@ -68,6 +68,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_XDPE122) += xdpe12284.o
> > > obj-$(CONFIG_SENSORS_XDPE152) += xdpe152c4.o
> > > obj-$(CONFIG_SENSORS_ZL6100) += zl6100.o
> > > diff --git a/drivers/hwmon/pmbus/xdp720.c b/drivers/hwmon/pmbus/xdp720.c
> > > new file mode 100644
> > > index 000000000000..382dc3f9ce80
> > > --- /dev/null
> > > +++ b/drivers/hwmon/pmbus/xdp720.c
> > > @@ -0,0 +1,123 @@
> > > +// 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 = 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, 1000000000000);
> > > + info->m[PSC_POWER] = DIV64_U64_ROUND_CLOSEST((u64)
> > > + info->m[PSC_POWER] * rimon * gimon, 1000000000000);
> > > +
> > > + 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@xxxxxxxxxxxx>");
> > > +MODULE_DESCRIPTION("PMBus driver for Infineon XDP720 Digital eFuse Controller");
> > > +MODULE_LICENSE("GPL");
> > > +MODULE_IMPORT_NS("PMBUS");
> >