]> www.infradead.org Git - users/griffoul/linux.git/commitdiff
hwmon: (ina238) Correctly clamp power limits
authorGuenter Roeck <linux@roeck-us.net>
Fri, 29 Aug 2025 18:51:20 +0000 (11:51 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 1 Sep 2025 15:03:05 +0000 (08:03 -0700)
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>
drivers/hwmon/ina238.c

index c6b2734898d011b5cd00c806c8c7b9c25eb2053d..59a2c8889fa2b1c9accca2fa9ae1e7aa3b855ce9 100644 (file)
@@ -517,9 +517,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);