Provide callback for overvoltage and undervoltage output readouts conversion. These registers are presented in 'slinear11' format, while default conversion for 'vout' class for the devices is 'vid'. It is resulted in wrong conversion in pmbus_reg2data() for in{3-4}_lcrit and in{3-4}_crit attributes. Signed-off-by: Vadim Pasternak <vadimp@xxxxxxxxxxxx> --- drivers/hwmon/pmbus/xdpe12284.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/hwmon/pmbus/xdpe12284.c b/drivers/hwmon/pmbus/xdpe12284.c index ecd9b65627ec..751c8e18c881 100644 --- a/drivers/hwmon/pmbus/xdpe12284.c +++ b/drivers/hwmon/pmbus/xdpe12284.c @@ -18,6 +18,28 @@ #define XDPE122_AMD_625MV 0x10 /* AMD mode 6.25mV */ #define XDPE122_PAGE_NUM 2 +static int xdpe122_reg2data(u16 reg, int data, long *val) +{ + s16 exponent; + s32 mantissa; + + switch (reg) { + case PMBUS_VOUT_OV_FAULT_LIMIT: + case PMBUS_VOUT_UV_FAULT_LIMIT: + /* Convert to LINEAR11. */ + exponent = ((s16)data) >> 11; + mantissa = ((s16)((data & GENMASK(10, 0)) << 5)) >> 5; + *val = mantissa * 1000L; + if (exponent >= 0) + *val <<= exponent; + else + *val >>= -exponent; + return 0; + default: + return -ENODATA; + } +} + static int xdpe122_identify(struct i2c_client *client, struct pmbus_driver_info *info) { @@ -70,6 +92,7 @@ static struct pmbus_driver_info xdpe122_info = { PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | PMBUS_HAVE_POUT | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT, .identify = xdpe122_identify, + .reg2data = xdpe122_reg2data, }; static int xdpe122_probe(struct i2c_client *client, -- 2.11.0