iio: afe: rescale: expose scale processing function
authorLiam Beguin <liambeguin@gmail.com>
Sun, 13 Feb 2022 02:57:30 +0000 (21:57 -0500)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 27 Feb 2022 13:37:49 +0000 (13:37 +0000)
In preparation for the addition of kunit tests, expose the logic
responsible for combining channel scales.

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/20220213025739.2561834-2-liambeguin@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/afe/iio-rescale.c
include/linux/iio/afe/rescale.h [new file with mode: 0644]

index 69710c481376eb4cfb98d0cd88a36b5733377785..65832dd09249dbfaf13377255fe23058d29db67b 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/property.h>
 
+#include <linux/iio/afe/rescale.h>
 #include <linux/iio/consumer.h>
 #include <linux/iio/iio.h>
 
-struct rescale;
-
-struct rescale_cfg {
-       enum iio_chan_type type;
-       int (*props)(struct device *dev, struct rescale *rescale);
-};
+int rescale_process_scale(struct rescale *rescale, int scale_type,
+                         int *val, int *val2)
+{
+       s64 tmp;
 
-struct rescale {
-       const struct rescale_cfg *cfg;
-       struct iio_channel *source;
-       struct iio_chan_spec chan;
-       struct iio_chan_spec_ext_info *ext_info;
-       bool chan_processed;
-       s32 numerator;
-       s32 denominator;
-};
+       switch (scale_type) {
+       case IIO_VAL_FRACTIONAL:
+               *val *= rescale->numerator;
+               *val2 *= rescale->denominator;
+               return scale_type;
+       case IIO_VAL_INT:
+               *val *= rescale->numerator;
+               if (rescale->denominator == 1)
+                       return scale_type;
+               *val2 = rescale->denominator;
+               return IIO_VAL_FRACTIONAL;
+       case IIO_VAL_FRACTIONAL_LOG2:
+               tmp = (s64)*val * 1000000000LL;
+               tmp = div_s64(tmp, rescale->denominator);
+               tmp *= rescale->numerator;
+               tmp = div_s64(tmp, 1000000000LL);
+               *val = tmp;
+               return scale_type;
+       default:
+               return -EOPNOTSUPP;
+       }
+}
 
 static int rescale_read_raw(struct iio_dev *indio_dev,
                            struct iio_chan_spec const *chan,
                            int *val, int *val2, long mask)
 {
        struct rescale *rescale = iio_priv(indio_dev);
-       s64 tmp;
        int ret;
 
        switch (mask) {
@@ -66,27 +77,7 @@ static int rescale_read_raw(struct iio_dev *indio_dev,
                } else {
                        ret = iio_read_channel_scale(rescale->source, val, val2);
                }
-               switch (ret) {
-               case IIO_VAL_FRACTIONAL:
-                       *val *= rescale->numerator;
-                       *val2 *= rescale->denominator;
-                       return ret;
-               case IIO_VAL_INT:
-                       *val *= rescale->numerator;
-                       if (rescale->denominator == 1)
-                               return ret;
-                       *val2 = rescale->denominator;
-                       return IIO_VAL_FRACTIONAL;
-               case IIO_VAL_FRACTIONAL_LOG2:
-                       tmp = (s64)*val * 1000000000LL;
-                       tmp = div_s64(tmp, rescale->denominator);
-                       tmp *= rescale->numerator;
-                       tmp = div_s64(tmp, 1000000000LL);
-                       *val = tmp;
-                       return ret;
-               default:
-                       return -EOPNOTSUPP;
-               }
+               return rescale_process_scale(rescale, ret, val, val2);
        default:
                return -EINVAL;
        }
diff --git a/include/linux/iio/afe/rescale.h b/include/linux/iio/afe/rescale.h
new file mode 100644 (file)
index 0000000..8a2eb34
--- /dev/null
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2018 Axentia Technologies AB
+ */
+
+#ifndef __IIO_RESCALE_H__
+#define __IIO_RESCALE_H__
+
+#include <linux/types.h>
+#include <linux/iio/iio.h>
+
+struct device;
+struct rescale;
+
+struct rescale_cfg {
+       enum iio_chan_type type;
+       int (*props)(struct device *dev, struct rescale *rescale);
+};
+
+struct rescale {
+       const struct rescale_cfg *cfg;
+       struct iio_channel *source;
+       struct iio_chan_spec chan;
+       struct iio_chan_spec_ext_info *ext_info;
+       bool chan_processed;
+       s32 numerator;
+       s32 denominator;
+};
+
+int rescale_process_scale(struct rescale *rescale, int scale_type,
+                         int *val, int *val2);
+#endif /* __IIO_RESCALE_H__ */