Skip to content

Commit f7e775c

Browse files
Sanman Pradhangroeck
authored andcommitted
hwmon: (pmbus/ina233) Fix error handling and sign extension in shunt voltage read
ina233_read_word_data() reads MFR_READ_VSHUNT via pmbus_read_word_data() but has two issues: 1. The return value is not checked for errors before being used in arithmetic. A negative error code from a failed I2C transaction is passed directly to DIV_ROUND_CLOSEST(), producing garbage data. 2. MFR_READ_VSHUNT is a 16-bit two's complement value. Negative shunt voltages (values with bit 15 set) are treated as large positive values since pmbus_read_word_data() returns them zero-extended in an int. This leads to incorrect scaling in the VIN coefficient conversion. Fix both issues by adding an error check, casting to s16 for proper sign extension, and clamping the result to a valid non-negative range. The clamp is necessary because read_word_data callbacks must return non-negative values on success (negative values indicate errors to the pmbus core). Fixes: b64b6cb ("hwmon: Add driver for TI INA233 Current and Power Monitor") Cc: stable@vger.kernel.org Signed-off-by: Sanman Pradhan <psanman@juniper.net> Link: https://lore.kernel.org/r/20260319173055.125271-2-sanman.pradhan@hpe.com [groeck: Fixed clamp to avoid losing the sign bit] Signed-off-by: Guenter Roeck <linux@roeck-us.net>
1 parent c369299 commit f7e775c

1 file changed

Lines changed: 2 additions & 1 deletion

File tree

drivers/hwmon/pmbus/ina233.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ static int ina233_read_word_data(struct i2c_client *client, int page,
7272

7373
/* Adjust returned value to match VIN coefficients */
7474
/* VIN: 1.25 mV VSHUNT: 2.5 uV LSB */
75-
ret = DIV_ROUND_CLOSEST(ret * 25, 12500);
75+
ret = clamp_val(DIV_ROUND_CLOSEST((s16)ret * 25, 12500),
76+
S16_MIN, S16_MAX) & 0xffff;
7677
break;
7778
default:
7879
ret = -ENODATA;

0 commit comments

Comments
 (0)