Skip to content

Commit da1d0e6

Browse files
Murad Masimovgroeck
authored andcommitted
hwmon: (tmp513) Fix Current Register value interpretation
The value returned by the driver after processing the contents of the Current Register does not correspond to the TMP512/TMP513 specifications. A raw register value is converted to a signed integer value by a sign extension in accordance with the algorithm provided in the specification, but due to the off-by-one error in the sign bit index, the result is incorrect. Moreover, negative values will be reported as large positive due to missing sign extension from u32 to long. According to the TMP512 and TMP513 datasheets, the Current Register (07h) is a 16-bit two's complement integer value. E.g., if regval = 1000 0011 0000 0000, then the value must be (-32000 * lsb), but the driver will return (33536 * lsb). Fix off-by-one bug, and also cast data->curr_lsb_ua (which is of type u32) to long to prevent incorrect cast for negative values. Found by Linux Verification Center (linuxtesting.org) with SVACE. Fixes: 59dfa75 ("hwmon: Add driver for Texas Instruments TMP512/513 sensor chips.") Signed-off-by: Murad Masimov <[email protected]> Link: https://lore.kernel.org/r/[email protected] [groeck: Fixed description line length] Signed-off-by: Guenter Roeck <[email protected]>
1 parent 74d7e03 commit da1d0e6

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

drivers/hwmon/tmp513.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos,
222222
break;
223223
case TMP51X_BUS_CURRENT_RESULT:
224224
// Current = (ShuntVoltage * CalibrationRegister) / 4096
225-
*val = sign_extend32(regval, 16) * data->curr_lsb_ua;
225+
*val = sign_extend32(regval, 15) * (long)data->curr_lsb_ua;
226226
*val = DIV_ROUND_CLOSEST(*val, MILLI);
227227
break;
228228
case TMP51X_LOCAL_TEMP_RESULT:

0 commit comments

Comments
 (0)