iio: afe: rescale: use s64 for temporary scale calculations
authorLiam Beguin <liambeguin@gmail.com>
Sat, 8 Jan 2022 20:53:07 +0000 (15:53 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 12:22:50 +0000 (14:22 +0200)
commit 51593106b608ae4247cc8da928813347da16d025 upstream.

All four scaling coefficients can take signed values.
Make tmp a signed 64-bit integer and switch to div_s64() to preserve
signs during 64-bit divisions.

Fixes: 8b74816b5a9a ("iio: afe: rescale: new driver")
Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20220108205319.2046348-5-liambeguin@gmail.com
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/iio/afe/iio-rescale.c

index 774eb30..271d73e 100644 (file)
@@ -39,7 +39,7 @@ static int rescale_read_raw(struct iio_dev *indio_dev,
                            int *val, int *val2, long mask)
 {
        struct rescale *rescale = iio_priv(indio_dev);
-       unsigned long long tmp;
+       s64 tmp;
        int ret;
 
        switch (mask) {
@@ -77,10 +77,10 @@ static int rescale_read_raw(struct iio_dev *indio_dev,
                        *val2 = rescale->denominator;
                        return IIO_VAL_FRACTIONAL;
                case IIO_VAL_FRACTIONAL_LOG2:
-                       tmp = *val * 1000000000LL;
-                       do_div(tmp, rescale->denominator);
+                       tmp = (s64)*val * 1000000000LL;
+                       tmp = div_s64(tmp, rescale->denominator);
                        tmp *= rescale->numerator;
-                       do_div(tmp, 1000000000LL);
+                       tmp = div_s64(tmp, 1000000000LL);
                        *val = tmp;
                        return ret;
                default: