summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2025-08-29 11:51:20 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-09-09 19:02:38 +0200
commit0b2cca4ace91af8cf567d22fcd8029d8aac64fc9 (patch)
tree99c4764afe9ee662b77d73a66afee2d9fa557009
parent6bc941d24524607840954e43bb44bb99284b031b (diff)
hwmon: (ina238) Correctly clamp power limits
[ Upstream commit c2623573178bab32990695fb729e9b69710ed66d ] ina238_write_power() was attempting to clamp the user input but was throwing away the result. Ensure that we clamp the value to the appropriate range before it is converted into a register value. Fixes: 0d9f596b1fe34 ("hwmon: (ina238) Modify the calculation formula to adapt to different chips") Cc: Wenliang Yan <wenliang202407@163.com> Cc: Chris Packham <chris.packham@alliedtelesis.co.nz> Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/hwmon/ina238.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/hwmon/ina238.c b/drivers/hwmon/ina238.c
index 0562f9a4dcf1..5c90c3e59f80 100644
--- a/drivers/hwmon/ina238.c
+++ b/drivers/hwmon/ina238.c
@@ -426,9 +426,10 @@ static int ina238_write_power(struct device *dev, u32 attr, long val)
* Unsigned postive values. Compared against the 24-bit power register,
* lower 8-bits are truncated. Same conversion to/from uW as POWER
* register.
+ * The first clamp_val() is to establish a baseline to avoid overflows.
*/
- regval = clamp_val(val, 0, LONG_MAX);
- regval = div_u64(val * 4 * 100 * data->rshunt, data->config->power_calculate_factor *
+ regval = clamp_val(val, 0, LONG_MAX / 2);
+ regval = div_u64(regval * 4 * 100 * data->rshunt, data->config->power_calculate_factor *
1000ULL * INA238_FIXED_SHUNT * data->gain);
regval = clamp_val(regval >> 8, 0, U16_MAX);