All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v15 00/10] iio: afe: add temperature rescaling support
@ 2022-02-13  2:57 Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 01/10] iio: afe: rescale: expose scale processing function Liam Beguin
                   ` (10 more replies)
  0 siblings, 11 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

Jonathan, Peter, Andy,

This series focuses on adding temperature rescaling support to the IIO
Analog Front End (AFE) driver.

The main changes to the AFE driver include an initial Kunit test suite,
support for IIO_VAL_INT_PLUS_{NANO,MICRO} scales, and support for RTDs
and temperature transducer sensors.

Thanks for your time,
Liam

Changes since v14:
- Revert units.h changes in favor of "raw" values

Changes since v13:
- fix SI prefix in rescale_temp_sense_rtd_props()
- add comment explaining SI prefixes are sometimes used as mathematical
  multipliers with no particular physical meaning associated.

Changes since v12:
- rebase on latest testing branch
- fix copyright holder in newly created header file
- add myself as a copyright holder of the iio-rescale.c driver at
  Peter's suggestion
- fix undefined behavior on left-shift operation

Changes since v11:
- update commits with my personal email since all this work was done on
  my own time
- apply Peter's Reviewed-by to my local tree
- fix use of units.h
- make use of units.h more consistently in iio-rescale.c and in the
  tests
- fix #include ordering
- treat 04/16 as a fix. Move it, and add a Fixes: tag
- fix undefined behavior on left-shift operation
- add comment about fract_mult with iio_str_to_fixpoint()
- reword commit message for 14/16, based on Andy's comments

Changes since v10:
- apply Andy's suggestion for offset calculations
- make use of units.h more consistently

Changes since v9:
- make use of linux/units.h
- reorder commits, fix fract_log2 before merging fract
- keep fractional representation when not overflowing

Changes since v8:
- reword comment
- fix erroneous 64-bit division
- optimize and use 32-bit divisions when values are know to not overflow
- keep IIO_VAL_FRACTIONAL scale when possible, if not default to fixed
  point
- add test cases
- use nano precision in test cases
- simplify offset calculation in rtd_props()

Changes since v7:
- drop gcd() logic in rescale_process_scale()
- use div_s64() instead of do_div() for signed 64-bit divisions
- combine IIO_VAL_FRACTIONAL and IIO_VAL_FRACTIONAL_LOG2 scale cases
- switch to INT_PLUS_NANO when accuracy is lost with FRACTIONAL scales
- rework test logic to allow for small relative error
- rename test variables to align error output messages

Changes since v6:
- rework IIO_VAL_INT_PLUS_{NANO,MICRO} based on Peter's suggestion
- combine IIO_VAL_INT_PLUS_{NANO,MICRO} cases
- add test cases for negative IIO_VAL_INT_PLUS_{NANO,MICRO} corner cases
- force use of positive integers with gcd()
- reduce risk of integer overflow in IIO_VAL_FRACTIONAL_LOG2
- fix duplicate symbol build error
- apply Reviewed-by

Changes since v5:
- add include/linux/iio/afe/rescale.h
- expose functions use to process scale and offset
- add basic iio-rescale kunit test cases
- fix integer overflow case
- improve precision for IIO_VAL_FRACTIONAL_LOG2

Changes since v4:
- only use gcd() when necessary in overflow mitigation
- fix INT_PLUS_{MICRO,NANO} support
- apply Reviewed-by
- fix temperature-transducer bindings

Changes since v3:
- drop unnecessary fallthrough statements
- drop redundant local variables in some calculations
- fix s64 divisions on 32bit platforms by using do_div
- add comment describing iio-rescaler offset calculation
- drop unnecessary MAINTAINERS entry

Changes since v2:
- don't break implicit offset truncations
- make a best effort to get a valid value for fractional types
- drop return value change in iio_convert_raw_to_processed_unlocked()
- don't rely on processed value for offset calculation
- add INT_PLUS_{MICRO,NANO} support in iio-rescale
- revert generic implementation in favor of temperature-sense-rtd and
  temperature-transducer
- add separate section to MAINTAINERS file

Changes since v1:
- rebase on latest iio `testing` branch
- also apply consumer scale on integer channel scale types
- don't break implicit truncation in processed channel offset
  calculation
- drop temperature AFE flavors in favor of a simpler generic
  implementation

Liam Beguin (10):
  iio: afe: rescale: expose scale processing function
  iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support
  iio: afe: rescale: add offset support
  iio: afe: rescale: fix accuracy for small fractional scales
  iio: afe: rescale: reduce risk of integer overflow
  iio: test: add basic tests for the iio-rescale driver
  iio: afe: rescale: add RTD temperature sensor support
  iio: afe: rescale: add temperature transducers
  dt-bindings: iio: afe: add bindings for temperature-sense-rtd
  dt-bindings: iio: afe: add bindings for temperature transducers

 .../iio/afe/temperature-sense-rtd.yaml        | 101 +++
 .../iio/afe/temperature-transducer.yaml       | 114 +++
 drivers/iio/afe/iio-rescale.c                 | 283 ++++++-
 drivers/iio/test/Kconfig                      |  10 +
 drivers/iio/test/Makefile                     |   1 +
 drivers/iio/test/iio-test-rescale.c           | 710 ++++++++++++++++++
 include/linux/iio/afe/rescale.h               |  36 +
 7 files changed, 1220 insertions(+), 35 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml
 create mode 100644 Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml
 create mode 100644 drivers/iio/test/iio-test-rescale.c
 create mode 100644 include/linux/iio/afe/rescale.h

Range-diff against v14:
 -:  ------------ >  1:  ee26b0eeac65 iio: afe: rescale: expose scale processing function
 1:  a510097c83f1 !  2:  78f9d37575a5 iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support
    @@ Commit message
         Reviewed-by: Peter Rosin <peda@axentia.se>
     
      ## drivers/iio/afe/iio-rescale.c ##
    -@@
    - #include <linux/of_device.h>
    - #include <linux/platform_device.h>
    - #include <linux/property.h>
    -+#include <linux/units.h>
    - 
    - #include <linux/iio/afe/rescale.h>
    - #include <linux/iio/consumer.h>
     @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale, int scale_type,
      			  int *val, int *val2)
      {
    @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale
     +		return scale_type;
     +	case IIO_VAL_INT_PLUS_NANO:
     +	case IIO_VAL_INT_PLUS_MICRO:
    -+		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? GIGA : MEGA;
    ++		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? 1000000000L : 1000000L;
     +
     +		/*
     +		 * For IIO_VAL_INT_PLUS_{MICRO,NANO} scale types if either *val
 2:  8f2f2699a9b4 !  3:  5be82bd72453 iio: afe: rescale: add offset support
    @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale
     +		*val = div_s64(tmp, scale) + schan_off;
     +		return IIO_VAL_INT;
     +	case IIO_VAL_INT_PLUS_NANO:
    -+		tmp = (s64)rescale->offset * GIGA;
    -+		tmp2 = ((s64)scale * GIGA) + scale2;
    ++		tmp = (s64)rescale->offset * 1000000000LL;
    ++		tmp2 = ((s64)scale * 1000000000LL) + scale2;
     +		*val = div64_s64(tmp, tmp2) + schan_off;
     +		return IIO_VAL_INT;
     +	case IIO_VAL_INT_PLUS_MICRO:
    -+		tmp = (s64)rescale->offset * MEGA;
    -+		tmp2 = ((s64)scale * MEGA) + scale2;
    ++		tmp = (s64)rescale->offset * 1000000LL;
    ++		tmp2 = ((s64)scale * 1000000LL) + scale2;
     +		*val = div64_s64(tmp, tmp2) + schan_off;
     +		return IIO_VAL_INT;
     +	default:
 3:  2efa970bad26 !  4:  95ec184759f6 iio: afe: rescale: fix accuracy for small fractional scales
    @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale
     +		return IIO_VAL_INT_PLUS_NANO;
      	case IIO_VAL_INT_PLUS_NANO:
      	case IIO_VAL_INT_PLUS_MICRO:
    - 		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? GIGA : MEGA;
    + 		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? 1000000000L : 1000000L;
 4:  201037c0ead8 =  5:  2e1d41ef69d9 iio: afe: rescale: reduce risk of integer overflow
 5:  a0037cc3ee90 <  -:  ------------ iio: afe: rescale: make use of units.h
 6:  f8d47728f482 !  6:  0b6c029dea1d iio: test: add basic tests for the iio-rescale driver
    @@ drivers/iio/test/iio-test-rescale.c (new)
     +
     +#include <linux/gcd.h>
     +#include <linux/overflow.h>
    -+#include <linux/units.h>
     +
     +#include <linux/iio/afe/rescale.h>
     +#include <linux/iio/iio.h>
    @@ drivers/iio/test/iio-test-rescale.c (new)
     +	if (tmp < 0)
     +		tmp2 *= -1;
     +
    -+	*nano = (s64)tmp * GIGA + tmp2;
    ++	*nano = (s64)tmp * 1000000000UL + tmp2;
     +
     +	return ret;
     +}
    @@ drivers/iio/test/iio-test-rescale.c (new)
     +		return -EINVAL;
     +	}
     +
    -+	err = MEGA * abs(exp - real);
    ++	err = 1000000UL * abs(exp - real);
     +
     +	return (int)div64_u64(err, abs(exp));
     +}
 7:  a04685586340 !  7:  951ea44d0f5c iio: afe: rescale: add RTD temperature sensor support
    @@ drivers/iio/afe/iio-rescale.c: static int rescale_voltage_divider_props(struct d
     +		return ret;
     +	}
     +
    -+	tmp = r0 * iexc * alpha / MEGA;
    -+	factor = gcd(tmp, MEGA);
    -+	rescale->numerator = MEGA / factor;
    ++	tmp = r0 * iexc * alpha / 1000000;
    ++	factor = gcd(tmp, 1000000);
    ++	rescale->numerator = 1000000 / factor;
     +	rescale->denominator = tmp / factor;
     +
    -+	rescale->offset = -1 * ((r0 * iexc) / KILO);
    ++	rescale->offset = -1 * ((r0 * iexc) / 1000);
     +
     +	return 0;
     +}
 8:  e3b716aaee50 !  8:  56516fdc67bf iio: afe: rescale: add temperature transducers
    @@ drivers/iio/afe/iio-rescale.c: static int rescale_temp_sense_rtd_props(struct de
     +		return ret;
     +	}
     +
    -+	rescale->numerator = MEGA;
    ++	rescale->numerator = 1000000;
     +	rescale->denominator = alpha * sense;
     +
     +	rescale->offset = div_s64((s64)offset * rescale->denominator,
 9:  22ae1458eb8b =  9:  8c409050990b dt-bindings: iio: afe: add bindings for temperature-sense-rtd
10:  33825ad452d6 = 10:  bb39296590f3 dt-bindings: iio: afe: add bindings for temperature transducers

base-commit: cd717ac6f69db4953ca701c6220c7cb58e17f35a
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH v15 01/10] iio: afe: rescale: expose scale processing function
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
@ 2022-02-13  2:57 ` Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 02/10] iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support Liam Beguin
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

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>
---
 drivers/iio/afe/iio-rescale.c   | 65 ++++++++++++++-------------------
 include/linux/iio/afe/rescale.h | 32 ++++++++++++++++
 2 files changed, 60 insertions(+), 37 deletions(-)
 create mode 100644 include/linux/iio/afe/rescale.h

diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
index 69710c481376..65832dd09249 100644
--- a/drivers/iio/afe/iio-rescale.c
+++ b/drivers/iio/afe/iio-rescale.c
@@ -15,32 +15,43 @@
 #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
index 000000000000..8a2eb34af327
--- /dev/null
+++ b/include/linux/iio/afe/rescale.h
@@ -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__ */
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v15 02/10] iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 01/10] iio: afe: rescale: expose scale processing function Liam Beguin
@ 2022-02-13  2:57 ` Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 03/10] iio: afe: rescale: add offset support Liam Beguin
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

Some ADCs use IIO_VAL_INT_PLUS_{NANO,MICRO} scale types.
Add support for these to allow using the iio-rescaler with them.

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
---
 drivers/iio/afe/iio-rescale.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
index 65832dd09249..e67d9a9e6135 100644
--- a/drivers/iio/afe/iio-rescale.c
+++ b/drivers/iio/afe/iio-rescale.c
@@ -23,6 +23,9 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,
 			  int *val, int *val2)
 {
 	s64 tmp;
+	s32 rem;
+	u32 mult;
+	u32 neg;
 
 	switch (scale_type) {
 	case IIO_VAL_FRACTIONAL:
@@ -41,6 +44,37 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,
 		tmp *= rescale->numerator;
 		tmp = div_s64(tmp, 1000000000LL);
 		*val = tmp;
+		return scale_type;
+	case IIO_VAL_INT_PLUS_NANO:
+	case IIO_VAL_INT_PLUS_MICRO:
+		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? 1000000000L : 1000000L;
+
+		/*
+		 * For IIO_VAL_INT_PLUS_{MICRO,NANO} scale types if either *val
+		 * OR *val2 is negative the schan scale is negative, i.e.
+		 * *val = 1 and *val2 = -0.5 yields -1.5 not -0.5.
+		 */
+		neg = *val < 0 || *val2 < 0;
+
+		tmp = (s64)abs(*val) * abs(rescale->numerator);
+		*val = div_s64_rem(tmp, abs(rescale->denominator), &rem);
+
+		tmp = (s64)rem * mult + (s64)abs(*val2) * abs(rescale->numerator);
+		tmp = div_s64(tmp, abs(rescale->denominator));
+
+		*val += div_s64_rem(tmp, mult, val2);
+
+		/*
+		 * If only one of the rescaler elements or the schan scale is
+		 * negative, the combined scale is negative.
+		 */
+		if (neg ^ ((rescale->numerator < 0) ^ (rescale->denominator < 0))) {
+			if (*val)
+				*val = -*val;
+			else
+				*val2 = -*val2;
+		}
+
 		return scale_type;
 	default:
 		return -EOPNOTSUPP;
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v15 03/10] iio: afe: rescale: add offset support
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 01/10] iio: afe: rescale: expose scale processing function Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 02/10] iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support Liam Beguin
@ 2022-02-13  2:57 ` Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 04/10] iio: afe: rescale: fix accuracy for small fractional scales Liam Beguin
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

This is a preparatory change required for the addition of temperature
sensing front ends.

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
---
 drivers/iio/afe/iio-rescale.c   | 81 +++++++++++++++++++++++++++++++++
 include/linux/iio/afe/rescale.h |  4 ++
 2 files changed, 85 insertions(+)

diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
index e67d9a9e6135..8eaf766e28cc 100644
--- a/drivers/iio/afe/iio-rescale.c
+++ b/drivers/iio/afe/iio-rescale.c
@@ -3,6 +3,7 @@
  * IIO rescale driver
  *
  * Copyright (C) 2018 Axentia Technologies AB
+ * Copyright (C) 2022 Liam Beguin <liambeguin@gmail.com>
  *
  * Author: Peter Rosin <peda@axentia.se>
  */
@@ -81,11 +82,46 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,
 	}
 }
 
+int rescale_process_offset(struct rescale *rescale, int scale_type,
+			   int scale, int scale2, int schan_off,
+			   int *val, int *val2)
+{
+	s64 tmp, tmp2;
+
+	switch (scale_type) {
+	case IIO_VAL_FRACTIONAL:
+		tmp = (s64)rescale->offset * scale2;
+		*val = div_s64(tmp, scale) + schan_off;
+		return IIO_VAL_INT;
+	case IIO_VAL_INT:
+		*val = div_s64(rescale->offset, scale) + schan_off;
+		return IIO_VAL_INT;
+	case IIO_VAL_FRACTIONAL_LOG2:
+		tmp = (s64)rescale->offset * (1 << scale2);
+		*val = div_s64(tmp, scale) + schan_off;
+		return IIO_VAL_INT;
+	case IIO_VAL_INT_PLUS_NANO:
+		tmp = (s64)rescale->offset * 1000000000LL;
+		tmp2 = ((s64)scale * 1000000000LL) + scale2;
+		*val = div64_s64(tmp, tmp2) + schan_off;
+		return IIO_VAL_INT;
+	case IIO_VAL_INT_PLUS_MICRO:
+		tmp = (s64)rescale->offset * 1000000LL;
+		tmp2 = ((s64)scale * 1000000LL) + scale2;
+		*val = div64_s64(tmp, tmp2) + schan_off;
+		return IIO_VAL_INT;
+	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);
+	int scale, scale2;
+	int schan_off = 0;
 	int ret;
 
 	switch (mask) {
@@ -112,6 +148,47 @@ static int rescale_read_raw(struct iio_dev *indio_dev,
 			ret = iio_read_channel_scale(rescale->source, val, val2);
 		}
 		return rescale_process_scale(rescale, ret, val, val2);
+	case IIO_CHAN_INFO_OFFSET:
+		/*
+		 * Processed channels are scaled 1-to-1 and source offset is
+		 * already taken into account.
+		 *
+		 * In other cases, real world measurement are expressed as:
+		 *
+		 *	schan_scale * (raw + schan_offset)
+		 *
+		 * Given that the rescaler parameters are applied recursively:
+		 *
+		 *	rescaler_scale * (schan_scale * (raw + schan_offset) +
+		 *		rescaler_offset)
+		 *
+		 * Or,
+		 *
+		 *	(rescaler_scale * schan_scale) * (raw +
+		 *		(schan_offset +	rescaler_offset / schan_scale)
+		 *
+		 * Thus, reusing the original expression the parameters exposed
+		 * to userspace are:
+		 *
+		 *	scale = schan_scale * rescaler_scale
+		 *	offset = schan_offset + rescaler_offset / schan_scale
+		 */
+		if (rescale->chan_processed) {
+			*val = rescale->offset;
+			return IIO_VAL_INT;
+		}
+
+		if (iio_channel_has_info(rescale->source->channel,
+					 IIO_CHAN_INFO_OFFSET)) {
+			ret = iio_read_channel_offset(rescale->source,
+						      &schan_off, NULL);
+			if (ret != IIO_VAL_INT)
+				return ret < 0 ? ret : -EOPNOTSUPP;
+		}
+
+		ret = iio_read_channel_scale(rescale->source, &scale, &scale2);
+		return rescale_process_offset(rescale, ret, scale, scale2,
+					      schan_off, val, val2);
 	default:
 		return -EINVAL;
 	}
@@ -188,6 +265,9 @@ static int rescale_configure_channel(struct device *dev,
 	chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
 		BIT(IIO_CHAN_INFO_SCALE);
 
+	if (rescale->offset)
+		chan->info_mask_separate |= BIT(IIO_CHAN_INFO_OFFSET);
+
 	/*
 	 * Using .read_avail() is fringe to begin with and makes no sense
 	 * whatsoever for processed channels, so we make sure that this cannot
@@ -352,6 +432,7 @@ static int rescale_probe(struct platform_device *pdev)
 	rescale->cfg = of_device_get_match_data(dev);
 	rescale->numerator = 1;
 	rescale->denominator = 1;
+	rescale->offset = 0;
 
 	ret = rescale->cfg->props(dev, rescale);
 	if (ret)
diff --git a/include/linux/iio/afe/rescale.h b/include/linux/iio/afe/rescale.h
index 8a2eb34af327..6eecb435488f 100644
--- a/include/linux/iio/afe/rescale.h
+++ b/include/linux/iio/afe/rescale.h
@@ -25,8 +25,12 @@ struct rescale {
 	bool chan_processed;
 	s32 numerator;
 	s32 denominator;
+	s32 offset;
 };
 
 int rescale_process_scale(struct rescale *rescale, int scale_type,
 			  int *val, int *val2);
+int rescale_process_offset(struct rescale *rescale, int scale_type,
+			   int scale, int scale2, int schan_off,
+			   int *val, int *val2);
 #endif /* __IIO_RESCALE_H__ */
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v15 04/10] iio: afe: rescale: fix accuracy for small fractional scales
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
                   ` (2 preceding siblings ...)
  2022-02-13  2:57 ` [PATCH v15 03/10] iio: afe: rescale: add offset support Liam Beguin
@ 2022-02-13  2:57 ` Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 05/10] iio: afe: rescale: reduce risk of integer overflow Liam Beguin
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

The approximation caused by integer divisions can be costly on smaller
scale values since the decimal part is significant compared to the
integer part. Switch to an IIO_VAL_INT_PLUS_NANO scale type in such
cases to maintain accuracy.

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
---
 drivers/iio/afe/iio-rescale.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
index 8eaf766e28cc..5d78f0cf47d2 100644
--- a/drivers/iio/afe/iio-rescale.c
+++ b/drivers/iio/afe/iio-rescale.c
@@ -24,7 +24,7 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,
 			  int *val, int *val2)
 {
 	s64 tmp;
-	s32 rem;
+	s32 rem, rem2;
 	u32 mult;
 	u32 neg;
 
@@ -43,9 +43,23 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,
 		tmp = (s64)*val * 1000000000LL;
 		tmp = div_s64(tmp, rescale->denominator);
 		tmp *= rescale->numerator;
-		tmp = div_s64(tmp, 1000000000LL);
+
+		tmp = div_s64_rem(tmp, 1000000000LL, &rem);
 		*val = tmp;
-		return scale_type;
+
+		if (!rem)
+			return scale_type;
+
+		tmp = 1 << *val2;
+
+		rem2 = *val % (int)tmp;
+		*val = *val / (int)tmp;
+
+		*val2 = rem / (int)tmp;
+		if (rem2)
+			*val2 += div_s64((s64)rem2 * 1000000000LL, tmp);
+
+		return IIO_VAL_INT_PLUS_NANO;
 	case IIO_VAL_INT_PLUS_NANO:
 	case IIO_VAL_INT_PLUS_MICRO:
 		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? 1000000000L : 1000000L;
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v15 05/10] iio: afe: rescale: reduce risk of integer overflow
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
                   ` (3 preceding siblings ...)
  2022-02-13  2:57 ` [PATCH v15 04/10] iio: afe: rescale: fix accuracy for small fractional scales Liam Beguin
@ 2022-02-13  2:57 ` Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 06/10] iio: test: add basic tests for the iio-rescale driver Liam Beguin
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

Reduce the risk of integer overflow by doing the scale calculation on
a 64-bit integer. Since the rescaling is only performed on *val, reuse
the IIO_VAL_FRACTIONAL_LOG2 case.

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
---
 drivers/iio/afe/iio-rescale.c | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
index 5d78f0cf47d2..46947c68d3a9 100644
--- a/drivers/iio/afe/iio-rescale.c
+++ b/drivers/iio/afe/iio-rescale.c
@@ -24,21 +24,31 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,
 			  int *val, int *val2)
 {
 	s64 tmp;
+	int _val, _val2;
 	s32 rem, rem2;
 	u32 mult;
 	u32 neg;
 
 	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:
+		/*
+		 * When the product of both scales doesn't overflow, avoid
+		 * potential accuracy loss (for in kernel consumers) by
+		 * keeping a fractional representation.
+		 */
+		if (!check_mul_overflow(*val, rescale->numerator, &_val) &&
+		    !check_mul_overflow(*val2, rescale->denominator, &_val2)) {
+			*val = _val;
+			*val2 = _val2;
+			return IIO_VAL_FRACTIONAL;
+		}
+		fallthrough;
 	case IIO_VAL_FRACTIONAL_LOG2:
 		tmp = (s64)*val * 1000000000LL;
 		tmp = div_s64(tmp, rescale->denominator);
@@ -50,7 +60,10 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,
 		if (!rem)
 			return scale_type;
 
-		tmp = 1 << *val2;
+		if (scale_type == IIO_VAL_FRACTIONAL)
+			tmp = *val2;
+		else
+			tmp = ULL(1) << *val2;
 
 		rem2 = *val % (int)tmp;
 		*val = *val / (int)tmp;
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v15 06/10] iio: test: add basic tests for the iio-rescale driver
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
                   ` (4 preceding siblings ...)
  2022-02-13  2:57 ` [PATCH v15 05/10] iio: afe: rescale: reduce risk of integer overflow Liam Beguin
@ 2022-02-13  2:57 ` Liam Beguin
  2022-02-14  9:59   ` kernel test robot
  2022-06-27  7:22   ` Geert Uytterhoeven
  2022-02-13  2:57 ` [PATCH v15 07/10] iio: afe: rescale: add RTD temperature sensor support Liam Beguin
                   ` (4 subsequent siblings)
  10 siblings, 2 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

The iio-rescale driver supports various combinations of scale types and
offsets. These can often result in large integer multiplications. Make
sure these calculations are done right by adding a set of kunit test
cases that build on top of iio-test-format.

To run these tests, add the following to .kunitconfig
	$ cat .kunitconfig
	CONFIG_IIO=y
	CONFIG_IIO_RESCALE_KUNIT_TEST=y
	CONFIG_KUNIT=y

Then run:
	$ ./tools/testing/kunit/kunit.py run --kunitconfig .kunitconfig

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
---
 drivers/iio/test/Kconfig            |  10 +
 drivers/iio/test/Makefile           |   1 +
 drivers/iio/test/iio-test-rescale.c | 710 ++++++++++++++++++++++++++++
 3 files changed, 721 insertions(+)
 create mode 100644 drivers/iio/test/iio-test-rescale.c

diff --git a/drivers/iio/test/Kconfig b/drivers/iio/test/Kconfig
index 679a7794af20..872ed4ed140a 100644
--- a/drivers/iio/test/Kconfig
+++ b/drivers/iio/test/Kconfig
@@ -4,6 +4,16 @@
 #
 
 # Keep in alphabetical order
+config IIO_RESCALE_KUNIT_TEST
+	bool "Test IIO rescale conversion functions"
+	depends on KUNIT && !IIO_RESCALE
+	default KUNIT_ALL_TESTS
+	help
+	  If you want to run tests on the iio-rescale code say Y here.
+
+	  This takes advantage of ARCH=um to run tests and should be used by
+	  developers to tests their changes to the rescaling logic.
+
 config IIO_TEST_FORMAT
         bool "Test IIO formatting functions"
         depends on KUNIT=y
diff --git a/drivers/iio/test/Makefile b/drivers/iio/test/Makefile
index 467519a2027e..f15ae0a6394f 100644
--- a/drivers/iio/test/Makefile
+++ b/drivers/iio/test/Makefile
@@ -4,5 +4,6 @@
 #
 
 # Keep in alphabetical order
+obj-$(CONFIG_IIO_RESCALE_KUNIT_TEST) += iio-test-rescale.o ../afe/iio-rescale.o
 obj-$(CONFIG_IIO_TEST_FORMAT) += iio-test-format.o
 CFLAGS_iio-test-format.o += $(DISABLE_STRUCTLEAK_PLUGIN)
diff --git a/drivers/iio/test/iio-test-rescale.c b/drivers/iio/test/iio-test-rescale.c
new file mode 100644
index 000000000000..0b6699bfd553
--- /dev/null
+++ b/drivers/iio/test/iio-test-rescale.c
@@ -0,0 +1,710 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Kunit tests for IIO rescale conversions
+ *
+ * Copyright (c) 2021 Liam Beguin <liambeguin@gmail.com>
+ */
+
+#include <linux/gcd.h>
+#include <linux/overflow.h>
+
+#include <linux/iio/afe/rescale.h>
+#include <linux/iio/iio.h>
+
+#include <kunit/test.h>
+
+struct rescale_tc_data {
+	const char *name;
+
+	const s32 numerator;
+	const s32 denominator;
+	const s32 offset;
+
+	const int schan_val;
+	const int schan_val2;
+	const int schan_off;
+	const int schan_scale_type;
+
+	const char *expected;
+	const char *expected_off;
+};
+
+const struct rescale_tc_data scale_cases[] = {
+	/*
+	 * Typical use cases
+	 */
+	{
+		.name = "typical IIO_VAL_INT, positive",
+		.numerator = 1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT,
+		.schan_val = 42,
+		.expected = "5210.918114143",
+	},
+	{
+		.name = "typical IIO_VAL_INT, negative",
+		.numerator = -1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT,
+		.schan_val = 42,
+		.expected = "-5210.918114143",
+	},
+	{
+		.name = "typical IIO_VAL_FRACTIONAL, positive",
+		.numerator = 1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 42,
+		.schan_val2 = 20,
+		.expected = "260.545905707",
+	},
+	{
+		.name = "typical IIO_VAL_FRACTIONAL, negative",
+		.numerator = -1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 42,
+		.schan_val2 = 20,
+		.expected = "-260.545905707",
+	},
+	{
+		.name = "typical IIO_VAL_FRACTIONAL_LOG2, positive",
+		.numerator = 42,
+		.denominator = 53,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 4096,
+		.schan_val2 = 16,
+		.expected = "0.049528301",
+	},
+	{
+		.name = "typical IIO_VAL_FRACTIONAL_LOG2, negative",
+		.numerator = -42,
+		.denominator = 53,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 4096,
+		.schan_val2 = 16,
+		.expected = "-0.049528301",
+	},
+	{
+		.name = "typical IIO_VAL_INT_PLUS_NANO, positive",
+		.numerator = 1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = 10,
+		.schan_val2 = 123456,
+		.expected = "1240.710106203",
+	},
+	{
+		.name = "typical IIO_VAL_INT_PLUS_NANO, negative",
+		.numerator = -1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = 10,
+		.schan_val2 = 123456,
+		.expected = "-1240.710106203",
+	},
+	{
+		.name = "typical IIO_VAL_INT_PLUS_MICRO, positive",
+		.numerator = 1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = 10,
+		.schan_val2 = 1234,
+		.expected = "1240.84789",
+	},
+	{
+		.name = "typical IIO_VAL_INT_PLUS_MICRO, negative",
+		.numerator = -1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = 10,
+		.schan_val2 = 1234,
+		.expected = "-1240.84789",
+	},
+	/*
+	 * Use cases with small scales involving divisions
+	 */
+	{
+		.name = "small IIO_VAL_FRACTIONAL, 261/509 scaled by 90/1373754273",
+		.numerator = 261,
+		.denominator = 509,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 90,
+		.schan_val2 = 1373754273,
+		.expected = "0.000000033594",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL, 90/1373754273 scaled by 261/509",
+		.numerator = 90,
+		.denominator = 1373754273,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 261,
+		.schan_val2 = 509,
+		.expected = "0.000000033594",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL, 760/1373754273 scaled by 427/2727",
+		.numerator = 760,
+		.denominator = 1373754273,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 427,
+		.schan_val2 = 2727,
+		.expected = "0.000000086626",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL, 761/1373754273 scaled by 427/2727",
+		.numerator = 761,
+		.denominator = 1373754273,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 427,
+		.schan_val2 = 2727,
+		.expected = "0.000000086740",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL, 5/32768 scaled by 3/10000",
+		.numerator = 5,
+		.denominator = 32768,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 3,
+		.schan_val2 = 10000,
+		.expected = "0.0000000457763671875",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL, 0 < scale < 1",
+		.numerator = 6,
+		.denominator = 6,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 1,
+		.schan_val2 = 3,
+		.expected = "0.3333333333333333",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL, -1 < scale < 0",
+		.numerator = -6,
+		.denominator = 6,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 1,
+		.schan_val2 = 3,
+		.expected = "-0.3333333333333333",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL, 0 < scale < 2",
+		.numerator = 8,
+		.denominator = 2,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 1,
+		.schan_val2 = 3,
+		.expected = "1.3333333333333333",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL, -2 < scale < 0",
+		.numerator = -8,
+		.denominator = 2,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 1,
+		.schan_val2 = 3,
+		.expected = "-1.3333333333333333",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL_LOG2, 760/32768 scaled by 15/22",
+		.numerator = 760,
+		.denominator = 32768,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 15,
+		.schan_val2 = 22,
+		.expected = "0.000000082946",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL_LOG2, 761/32768 scaled by 15/22",
+		.numerator = 761,
+		.denominator = 32768,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 15,
+		.schan_val2 = 22,
+		.expected = "0.000000083055",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL_LOG2, 0 < scale < 1",
+		.numerator = 16,
+		.denominator = 3,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 1,
+		.schan_val2 = 4,
+		.expected = "0.3333333333333333",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL_LOG2, -1 < scale < 0",
+		.numerator = -16,
+		.denominator = 3,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 1,
+		.schan_val2 = 4,
+		.expected = "-0.3333333333333333",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL_LOG2, 0 < scale < 2",
+		.numerator = 8,
+		.denominator = 3,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 1,
+		.schan_val2 = 1,
+		.expected = "1.3333333333333333",
+	},
+	{
+		.name = "small IIO_VAL_FRACTIONAL_LOG2, -2 < scale < 0",
+		.numerator = -8,
+		.denominator = 3,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 1,
+		.schan_val2 = 1,
+		.expected = "-1.3333333333333333",
+	},
+	{
+		.name = "small IIO_VAL_INT_PLUS_MICRO, positive",
+		.numerator = 1,
+		.denominator = 2,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = 5,
+		.schan_val2 = 1234,
+		.expected = "2.500617",
+	},
+	{
+		.name = "small IIO_VAL_INT_PLUS_MICRO, negative",
+		.numerator = -1,
+		.denominator = 2,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = 5,
+		.schan_val2 = 1234,
+		.expected = "-2.500617",
+	},
+	/*
+	 * INT_PLUS_{MICRO,NANO} positive/negative corner cases
+	 */
+	{
+		.name = "negative IIO_VAL_INT_PLUS_NANO, negative schan",
+		.numerator = 1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = -10,
+		.schan_val2 = 123456,
+		.expected = "-1240.710106203",
+	},
+	{
+		.name = "negative IIO_VAL_INT_PLUS_NANO, both negative",
+		.numerator = -1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = -10,
+		.schan_val2 = 123456,
+		.expected = "1240.710106203",
+	},
+	{
+		.name = "negative IIO_VAL_INT_PLUS_NANO, 3 negative",
+		.numerator = -1000000,
+		.denominator = -8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = -10,
+		.schan_val2 = 123456,
+		.expected = "-1240.710106203",
+	},
+	{
+		.name = "negative IIO_VAL_INT_PLUS_NANO, 4 negative",
+		.numerator = -1000000,
+		.denominator = -8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = -10,
+		.schan_val2 = -123456,
+		.expected = "-1240.710106203",
+	},
+	{
+		.name = "negative IIO_VAL_INT_PLUS_NANO, negative, *val = 0",
+		.numerator = 1,
+		.denominator = -10,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = 0,
+		.schan_val2 = 123456789,
+		.expected = "-0.012345678",
+	},
+	/*
+	 * INT_PLUS_{MICRO,NANO} decimal part overflow
+	 */
+	{
+		.name = "decimal overflow IIO_VAL_INT_PLUS_NANO, positive",
+		.numerator = 1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = 10,
+		.schan_val2 = 123456789,
+		.expected = "1256.01200856",
+	},
+	{
+		.name = "decimal overflow IIO_VAL_INT_PLUS_NANO, negative",
+		.numerator = -1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = 10,
+		.schan_val2 = 123456789,
+		.expected = "-1256.01200856",
+	},
+	{
+		.name = "decimal overflow IIO_VAL_INT_PLUS_NANO, negative schan",
+		.numerator = 1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = -10,
+		.schan_val2 = 123456789,
+		.expected = "-1256.01200856",
+	},
+	{
+		.name = "decimal overflow IIO_VAL_INT_PLUS_MICRO, positive",
+		.numerator = 1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = 10,
+		.schan_val2 = 123456789,
+		.expected = "16557.914267",
+	},
+	{
+		.name = "decimal overflow IIO_VAL_INT_PLUS_MICRO, negative",
+		.numerator = -1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = 10,
+		.schan_val2 = 123456789,
+		.expected = "-16557.914267",
+	},
+	{
+		.name = "decimal overflow IIO_VAL_INT_PLUS_MICRO, negative schan",
+		.numerator = 1000000,
+		.denominator = 8060,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = -10,
+		.schan_val2 = 123456789,
+		.expected = "-16557.914267",
+	},
+	/*
+	 * 32-bit overflow conditions
+	 */
+	{
+		.name = "overflow IIO_VAL_FRACTIONAL, positive",
+		.numerator = 2,
+		.denominator = 20,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = S32_MAX,
+		.schan_val2 = 1,
+		.expected = "214748364.7",
+	},
+	{
+		.name = "overflow IIO_VAL_FRACTIONAL, negative",
+		.numerator = -2,
+		.denominator = 20,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = S32_MAX,
+		.schan_val2 = 1,
+		.expected = "-214748364.7",
+	},
+	{
+		.name = "overflow IIO_VAL_FRACTIONAL_LOG2, positive",
+		.numerator = S32_MAX,
+		.denominator = 4096,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 4096,
+		.schan_val2 = 16,
+		.expected = "32767.99998474121",
+	},
+	{
+		.name = "overflow IIO_VAL_FRACTIONAL_LOG2, negative",
+		.numerator = S32_MAX,
+		.denominator = 4096,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = -4096,
+		.schan_val2 = 16,
+		.expected = "-32767.99998474121",
+	},
+	{
+		.name = "overflow IIO_VAL_INT_PLUS_NANO, positive",
+		.numerator = 2,
+		.denominator = 20,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = 10,
+		.schan_val2 = S32_MAX,
+		.expected = "1.214748364",
+	},
+	{
+		.name = "overflow IIO_VAL_INT_PLUS_NANO, negative",
+		.numerator = -2,
+		.denominator = 20,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = 10,
+		.schan_val2 = S32_MAX,
+		.expected = "-1.214748364",
+	},
+	{
+		.name = "overflow IIO_VAL_INT_PLUS_NANO, negative schan",
+		.numerator = 2,
+		.denominator = 20,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = -10,
+		.schan_val2 = S32_MAX,
+		.expected = "-1.214748364",
+	},
+	{
+		.name = "overflow IIO_VAL_INT_PLUS_MICRO, positive",
+		.numerator = 2,
+		.denominator = 20,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = 10,
+		.schan_val2 = S32_MAX,
+		.expected = "215.748364",
+	},
+	{
+		.name = "overflow IIO_VAL_INT_PLUS_MICRO, negative",
+		.numerator = -2,
+		.denominator = 20,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = 10,
+		.schan_val2 = S32_MAX,
+		.expected = "-215.748364",
+	},
+	{
+		.name = "overflow IIO_VAL_INT_PLUS_MICRO, negative schan",
+		.numerator = 2,
+		.denominator = 20,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = -10,
+		.schan_val2 = S32_MAX,
+		.expected = "-215.748364",
+	},
+};
+
+const struct rescale_tc_data offset_cases[] = {
+	/*
+	 * Typical use cases
+	 */
+	{
+		.name = "typical IIO_VAL_INT, positive",
+		.offset = 1234,
+		.schan_scale_type = IIO_VAL_INT,
+		.schan_val = 123,
+		.schan_val2 = 0,
+		.schan_off = 14,
+		.expected_off = "24", /* 23.872 */
+	},
+	{
+		.name = "typical IIO_VAL_INT, negative",
+		.offset = -1234,
+		.schan_scale_type = IIO_VAL_INT,
+		.schan_val = 12,
+		.schan_val2 = 0,
+		.schan_off = 14,
+		.expected_off = "-88", /* -88.83333333333333 */
+	},
+	{
+		.name = "typical IIO_VAL_FRACTIONAL, positive",
+		.offset = 1234,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 12,
+		.schan_val2 = 34,
+		.schan_off = 14,
+		.expected_off = "3510", /* 3510.333333333333 */
+	},
+	{
+		.name = "typical IIO_VAL_FRACTIONAL, negative",
+		.offset = -1234,
+		.schan_scale_type = IIO_VAL_FRACTIONAL,
+		.schan_val = 12,
+		.schan_val2 = 34,
+		.schan_off = 14,
+		.expected_off = "-3482", /* -3482.333333333333 */
+	},
+	{
+		.name = "typical IIO_VAL_FRACTIONAL_LOG2, positive",
+		.offset = 1234,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 12,
+		.schan_val2 = 16,
+		.schan_off = 14,
+		.expected_off = "6739299", /* 6739299.333333333 */
+	},
+	{
+		.name = "typical IIO_VAL_FRACTIONAL_LOG2, negative",
+		.offset = -1234,
+		.schan_scale_type = IIO_VAL_FRACTIONAL_LOG2,
+		.schan_val = 12,
+		.schan_val2 = 16,
+		.schan_off = 14,
+		.expected_off = "-6739271", /* -6739271.333333333 */
+	},
+	{
+		.name = "typical IIO_VAL_INT_PLUS_NANO, positive",
+		.offset = 1234,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = 10,
+		.schan_val2 = 123456789,
+		.schan_off = 14,
+		.expected_off = "135", /* 135.8951219647469 */
+	},
+	{
+		.name = "typical IIO_VAL_INT_PLUS_NANO, negative",
+		.offset = -1234,
+		.schan_scale_type = IIO_VAL_INT_PLUS_NANO,
+		.schan_val = 10,
+		.schan_val2 = 123456789,
+		.schan_off = 14,
+		.expected_off = "-107", /* -107.89512196474689 */
+	},
+	{
+		.name = "typical IIO_VAL_INT_PLUS_MICRO, positive",
+		.offset = 1234,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = 10,
+		.schan_val2 = 123456789,
+		.schan_off = 14,
+		.expected_off = "23", /* 23.246438560723952 */
+	},
+	{
+		.name = "typical IIO_VAL_INT_PLUS_MICRO, negative",
+		.offset = -12345,
+		.schan_scale_type = IIO_VAL_INT_PLUS_MICRO,
+		.schan_val = 10,
+		.schan_val2 = 123456789,
+		.schan_off = 14,
+		.expected_off = "-78", /* -78.50185091745313 */
+	},
+};
+
+static void case_to_desc(const struct rescale_tc_data *t, char *desc)
+{
+	strcpy(desc, t->name);
+}
+
+KUNIT_ARRAY_PARAM(iio_rescale_scale, scale_cases, case_to_desc);
+KUNIT_ARRAY_PARAM(iio_rescale_offset, offset_cases, case_to_desc);
+
+/**
+ * iio_str_to_nano() - Parse a fixed-point string to get an
+ *                      IIO_VAL_INT_PLUS_NANO value
+ * @str: The string to parse
+ * @nano: The number as an integer
+ *
+ * Returns 0 on success, or a negative error code if the string cound not be
+ * parsed.
+ */
+static int iio_str_to_nano(const char *str, s64 *nano)
+{
+	int tmp, tmp2;
+	int ret = 0;
+
+	/*
+	 * iio_str_to_fixpoint() uses 10^8 here instead of 10^9 as fract_mult is
+	 * the multiplier for the first decimal place.
+	 */
+	ret = iio_str_to_fixpoint(str, 100000000, &tmp, &tmp2);
+	if (ret < 0)
+		return ret;
+
+	if (tmp < 0)
+		tmp2 *= -1;
+
+	*nano = (s64)tmp * 1000000000UL + tmp2;
+
+	return ret;
+}
+
+/**
+ * iio_test_relative_error_ppm() - Compute relative error (in parts-per-million)
+ *                                 between two fixed-point strings
+ * @real_str: The real value as a string
+ * @exp_str: The expected value as a string
+ *
+ * Returns a negative error code if the strings cound not be parsed, or the
+ * relative error in parts-per-million.
+ */
+static int iio_test_relative_error_ppm(const char *real_str, const char *exp_str)
+{
+	s64 real, exp, err;
+	int ret;
+
+	ret = iio_str_to_nano(real_str, &real);
+	if (ret < 0)
+		return ret;
+
+	ret = iio_str_to_nano(exp_str, &exp);
+	if (ret < 0)
+		return ret;
+
+	if (!exp) {
+		pr_err("Expected value is null, relative error is undefined\n");
+		return -EINVAL;
+	}
+
+	err = 1000000UL * abs(exp - real);
+
+	return (int)div64_u64(err, abs(exp));
+}
+
+static void iio_rescale_test_scale(struct kunit *test)
+{
+	struct rescale_tc_data *t = (struct rescale_tc_data *)test->param_value;
+	char *buff = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
+	struct rescale rescale;
+	int values[2];
+	int rel_ppm;
+	int ret;
+
+	rescale.numerator = t->numerator;
+	rescale.denominator = t->denominator;
+	rescale.offset = t->offset;
+	values[0] = t->schan_val;
+	values[1] = t->schan_val2;
+
+	ret = rescale_process_scale(&rescale, t->schan_scale_type,
+				    &values[0], &values[1]);
+
+	ret = iio_format_value(buff, ret, 2, values);
+	KUNIT_EXPECT_EQ(test, (int)strlen(buff), ret);
+
+	rel_ppm = iio_test_relative_error_ppm(buff, t->expected);
+	KUNIT_EXPECT_GE_MSG(test, rel_ppm, 0, "failed to compute ppm\n");
+
+	KUNIT_EXPECT_EQ_MSG(test, rel_ppm, 0,
+			    "\t    real=%s"
+			    "\texpected=%s\n",
+			    buff, t->expected);
+}
+
+static void iio_rescale_test_offset(struct kunit *test)
+{
+	struct rescale_tc_data *t = (struct rescale_tc_data *)test->param_value;
+	char *buff_off = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
+	struct rescale rescale;
+	int values[2];
+	int ret;
+
+	rescale.numerator = t->numerator;
+	rescale.denominator = t->denominator;
+	rescale.offset = t->offset;
+	values[0] = t->schan_val;
+	values[1] = t->schan_val2;
+
+	ret = rescale_process_offset(&rescale, t->schan_scale_type,
+				     t->schan_val, t->schan_val2, t->schan_off,
+				     &values[0], &values[1]);
+
+	ret = iio_format_value(buff_off, ret, 2, values);
+	KUNIT_EXPECT_EQ(test, (int)strlen(buff_off), ret);
+
+	KUNIT_EXPECT_STREQ(test, strim(buff_off), t->expected_off);
+}
+
+static struct kunit_case iio_rescale_test_cases[] = {
+	KUNIT_CASE_PARAM(iio_rescale_test_scale, iio_rescale_scale_gen_params),
+	KUNIT_CASE_PARAM(iio_rescale_test_offset, iio_rescale_offset_gen_params),
+	{}
+};
+
+static struct kunit_suite iio_rescale_test_suite = {
+	.name = "iio-rescale",
+	.test_cases = iio_rescale_test_cases,
+};
+kunit_test_suite(iio_rescale_test_suite);
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v15 07/10] iio: afe: rescale: add RTD temperature sensor support
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
                   ` (5 preceding siblings ...)
  2022-02-13  2:57 ` [PATCH v15 06/10] iio: test: add basic tests for the iio-rescale driver Liam Beguin
@ 2022-02-13  2:57 ` Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 08/10] iio: afe: rescale: add temperature transducers Liam Beguin
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

An RTD (Resistance Temperature Detector) is a kind of temperature
sensor used to get a linear voltage to temperature reading within a
give range (usually 0 to 100 degrees Celsius). Common types of RTDs
include PT100, PT500, and PT1000.

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
---
 drivers/iio/afe/iio-rescale.c | 48 +++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
index 46947c68d3a9..e31a93435536 100644
--- a/drivers/iio/afe/iio-rescale.c
+++ b/drivers/iio/afe/iio-rescale.c
@@ -394,10 +394,52 @@ static int rescale_voltage_divider_props(struct device *dev,
 	return 0;
 }
 
+static int rescale_temp_sense_rtd_props(struct device *dev,
+					struct rescale *rescale)
+{
+	u32 factor;
+	u32 alpha;
+	u32 iexc;
+	u32 tmp;
+	int ret;
+	u32 r0;
+
+	ret = device_property_read_u32(dev, "excitation-current-microamp",
+				       &iexc);
+	if (ret) {
+		dev_err(dev, "failed to read excitation-current-microamp: %d\n",
+			ret);
+		return ret;
+	}
+
+	ret = device_property_read_u32(dev, "alpha-ppm-per-celsius", &alpha);
+	if (ret) {
+		dev_err(dev, "failed to read alpha-ppm-per-celsius: %d\n",
+			ret);
+		return ret;
+	}
+
+	ret = device_property_read_u32(dev, "r-naught-ohms", &r0);
+	if (ret) {
+		dev_err(dev, "failed to read r-naught-ohms: %d\n", ret);
+		return ret;
+	}
+
+	tmp = r0 * iexc * alpha / 1000000;
+	factor = gcd(tmp, 1000000);
+	rescale->numerator = 1000000 / factor;
+	rescale->denominator = tmp / factor;
+
+	rescale->offset = -1 * ((r0 * iexc) / 1000);
+
+	return 0;
+}
+
 enum rescale_variant {
 	CURRENT_SENSE_AMPLIFIER,
 	CURRENT_SENSE_SHUNT,
 	VOLTAGE_DIVIDER,
+	TEMP_SENSE_RTD,
 };
 
 static const struct rescale_cfg rescale_cfg[] = {
@@ -413,6 +455,10 @@ static const struct rescale_cfg rescale_cfg[] = {
 		.type = IIO_VOLTAGE,
 		.props = rescale_voltage_divider_props,
 	},
+	[TEMP_SENSE_RTD] = {
+		.type = IIO_TEMP,
+		.props = rescale_temp_sense_rtd_props,
+	},
 };
 
 static const struct of_device_id rescale_match[] = {
@@ -422,6 +468,8 @@ static const struct of_device_id rescale_match[] = {
 	  .data = &rescale_cfg[CURRENT_SENSE_SHUNT], },
 	{ .compatible = "voltage-divider",
 	  .data = &rescale_cfg[VOLTAGE_DIVIDER], },
+	{ .compatible = "temperature-sense-rtd",
+	  .data = &rescale_cfg[TEMP_SENSE_RTD], },
 	{ /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, rescale_match);
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v15 08/10] iio: afe: rescale: add temperature transducers
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
                   ` (6 preceding siblings ...)
  2022-02-13  2:57 ` [PATCH v15 07/10] iio: afe: rescale: add RTD temperature sensor support Liam Beguin
@ 2022-02-13  2:57 ` Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 09/10] dt-bindings: iio: afe: add bindings for temperature-sense-rtd Liam Beguin
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

A temperature transducer is a device that converts a thermal quantity
into any other physical quantity. This patch adds support for
temperature to voltage (like the LTC2997) and temperature to current
(like the AD590) linear transducers.
In both cases these are assumed to be connected to a voltage ADC.

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
---
 drivers/iio/afe/iio-rescale.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
index e31a93435536..7e511293d6d1 100644
--- a/drivers/iio/afe/iio-rescale.c
+++ b/drivers/iio/afe/iio-rescale.c
@@ -435,11 +435,37 @@ static int rescale_temp_sense_rtd_props(struct device *dev,
 	return 0;
 }
 
+static int rescale_temp_transducer_props(struct device *dev,
+					 struct rescale *rescale)
+{
+	s32 offset = 0;
+	s32 sense = 1;
+	s32 alpha;
+	int ret;
+
+	device_property_read_u32(dev, "sense-offset-millicelsius", &offset);
+	device_property_read_u32(dev, "sense-resistor-ohms", &sense);
+	ret = device_property_read_u32(dev, "alpha-ppm-per-celsius", &alpha);
+	if (ret) {
+		dev_err(dev, "failed to read alpha-ppm-per-celsius: %d\n", ret);
+		return ret;
+	}
+
+	rescale->numerator = 1000000;
+	rescale->denominator = alpha * sense;
+
+	rescale->offset = div_s64((s64)offset * rescale->denominator,
+				  rescale->numerator);
+
+	return 0;
+}
+
 enum rescale_variant {
 	CURRENT_SENSE_AMPLIFIER,
 	CURRENT_SENSE_SHUNT,
 	VOLTAGE_DIVIDER,
 	TEMP_SENSE_RTD,
+	TEMP_TRANSDUCER,
 };
 
 static const struct rescale_cfg rescale_cfg[] = {
@@ -459,6 +485,10 @@ static const struct rescale_cfg rescale_cfg[] = {
 		.type = IIO_TEMP,
 		.props = rescale_temp_sense_rtd_props,
 	},
+	[TEMP_TRANSDUCER] = {
+		.type = IIO_TEMP,
+		.props = rescale_temp_transducer_props,
+	},
 };
 
 static const struct of_device_id rescale_match[] = {
@@ -470,6 +500,8 @@ static const struct of_device_id rescale_match[] = {
 	  .data = &rescale_cfg[VOLTAGE_DIVIDER], },
 	{ .compatible = "temperature-sense-rtd",
 	  .data = &rescale_cfg[TEMP_SENSE_RTD], },
+	{ .compatible = "temperature-transducer",
+	  .data = &rescale_cfg[TEMP_TRANSDUCER], },
 	{ /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, rescale_match);
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v15 09/10] dt-bindings: iio: afe: add bindings for temperature-sense-rtd
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
                   ` (7 preceding siblings ...)
  2022-02-13  2:57 ` [PATCH v15 08/10] iio: afe: rescale: add temperature transducers Liam Beguin
@ 2022-02-13  2:57 ` Liam Beguin
  2022-02-13  2:57 ` [PATCH v15 10/10] dt-bindings: iio: afe: add bindings for temperature transducers Liam Beguin
  2022-02-27 12:55 ` [PATCH v15 00/10] iio: afe: add temperature rescaling support Jonathan Cameron
  10 siblings, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

An ADC is often used to measure other quantities indirectly. This
binding describe one case, the measurement of a temperature through the
voltage across an RTD resistor such as a PT1000.

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Reviewed-by: Peter Rosin <peda@axentia.se>
---
 .../iio/afe/temperature-sense-rtd.yaml        | 101 ++++++++++++++++++
 1 file changed, 101 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml

diff --git a/Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml b/Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml
new file mode 100644
index 000000000000..336ce96371db
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/afe/temperature-sense-rtd.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Temperature Sense RTD
+
+maintainers:
+  - Liam Beguin <liambeguin@gmail.com>
+
+description: |
+  RTDs (Resistance Temperature Detectors) are a kind of temperature sensors
+  used to get a linear voltage to temperature reading within a give range
+  (usually 0 to 100 degrees Celsius).
+
+  When an io-channel measures the output voltage across an RTD such as a
+  PT1000, the interesting measurement is almost always the corresponding
+  temperature, not the voltage output. This binding describes such a circuit.
+
+  The general transfer function here is (using SI units)
+
+    V = R(T) * iexc
+    R(T) = r0 * (1 + alpha * T)
+    T = 1 / (alpha * r0 * iexc) * (V - r0 * iexc)
+
+  The following circuit matches what's in the examples section.
+
+           5V0
+          -----
+            |
+        +---+----+
+        |  R 5k  |
+        +---+----+
+            |
+            V 1mA
+            |
+            +---- Vout
+            |
+        +---+----+
+        | PT1000 |
+        +---+----+
+            |
+          -----
+           GND
+
+properties:
+  compatible:
+    const: temperature-sense-rtd
+
+  io-channels:
+    maxItems: 1
+    description: |
+      Channel node of a voltage io-channel.
+
+  '#io-channel-cells':
+    const: 0
+
+  excitation-current-microamp:
+    description: The current fed through the RTD sensor.
+
+  alpha-ppm-per-celsius:
+    description: |
+      alpha can also be expressed in micro-ohms per ohm Celsius. It's a linear
+      approximation of the resistance versus temperature relationship
+      between 0 and 100 degrees Celsius.
+
+      alpha = (R_100 - R_0) / (100 * R_0)
+
+      Where, R_100 is the resistance of the sensor at 100 degrees Celsius, and
+      R_0 (or r-naught-ohms) is the resistance of the sensor at 0 degrees
+      Celsius.
+
+      Pure platinum has an alpha of 3925. Industry standards such as IEC60751
+      and ASTM E-1137 specify an alpha of 3850.
+
+  r-naught-ohms:
+    description: |
+      Resistance of the sensor at 0 degrees Celsius.
+      Common values are 100 for PT100, 500 for PT500, and 1000 for PT1000
+
+additionalProperties: false
+required:
+  - compatible
+  - io-channels
+  - excitation-current-microamp
+  - alpha-ppm-per-celsius
+  - r-naught-ohms
+
+examples:
+  - |
+    pt1000_1: temperature-sensor0 {
+        compatible = "temperature-sense-rtd";
+        #io-channel-cells = <0>;
+        io-channels = <&temp_adc1 0>;
+
+        excitation-current-microamp = <1000>; /* i = U/R = 5 / 5000 */
+        alpha-ppm-per-celsius = <3908>;
+        r-naught-ohms = <1000>;
+    };
+...
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v15 10/10] dt-bindings: iio: afe: add bindings for temperature transducers
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
                   ` (8 preceding siblings ...)
  2022-02-13  2:57 ` [PATCH v15 09/10] dt-bindings: iio: afe: add bindings for temperature-sense-rtd Liam Beguin
@ 2022-02-13  2:57 ` Liam Beguin
  2022-02-27 12:55 ` [PATCH v15 00/10] iio: afe: add temperature rescaling support Jonathan Cameron
  10 siblings, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-13  2:57 UTC (permalink / raw)
  To: liambeguin, peda, jic23, andy.shevchenko, lars
  Cc: linux-kernel, linux-iio, devicetree, robh+dt

An ADC is often used to measure other quantities indirectly.
This binding describe one case, the measurement of a temperature
through a temperature transducer (either voltage or current).

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Reviewed-by: Peter Rosin <peda@axentia.se>
---
 .../iio/afe/temperature-transducer.yaml       | 114 ++++++++++++++++++
 1 file changed, 114 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml

diff --git a/Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml b/Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml
new file mode 100644
index 000000000000..cfbf5350db27
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml
@@ -0,0 +1,114 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/afe/temperature-transducer.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Temperature Transducer
+
+maintainers:
+  - Liam Beguin <liambeguin@gmail.com>
+
+description: |
+  A temperature transducer is a device that converts a thermal quantity
+  into any other physical quantity. This binding applies to temperature to
+  voltage (like the LTC2997), and temperature to current (like the AD590)
+  linear transducers.
+  In both cases these are assumed to be connected to a voltage ADC.
+
+  When an io-channel measures the output voltage of a temperature analog front
+  end such as a temperature transducer, the interesting measurement is almost
+  always the corresponding temperature, not the voltage output. This binding
+  describes such a circuit.
+
+  The general transfer function here is (using SI units)
+    V(T) = Rsense * Isense(T)
+    T = (Isense(T) / alpha) + offset
+    T = 1 / (Rsense * alpha) * (V + offset * Rsense * alpha)
+
+  When using a temperature to voltage transducer, Rsense is set to 1.
+
+  The following circuits show a temperature to current and a temperature to
+  voltage transducer that can be used with this binding.
+
+           VCC
+          -----
+            |
+        +---+---+
+        | AD590 |                               VCC
+        +---+---+                              -----
+            |                                    |
+            V proportional to T             +----+----+
+            |                          D+ --+         |
+            +---- Vout                      | LTC2997 +--- Vout
+            |                          D- --+         |
+        +---+----+                          +---------+
+        | Rsense |                               |
+        +---+----+                             -----
+            |                                   GND
+          -----
+           GND
+
+properties:
+  compatible:
+    const: temperature-transducer
+
+  io-channels:
+    maxItems: 1
+    description: |
+      Channel node of a voltage io-channel.
+
+  '#io-channel-cells':
+    const: 0
+
+  sense-offset-millicelsius:
+    description: |
+      Temperature offset.
+      This offset is commonly used to convert from Kelvins to degrees Celsius.
+      In that case, sense-offset-millicelsius would be set to <(-273150)>.
+    default: 0
+
+  sense-resistor-ohms:
+    description: |
+      The sense resistor.
+      By default sense-resistor-ohms cancels out the resistor making the
+      circuit behave like a temperature transducer.
+    default: 1
+
+  alpha-ppm-per-celsius:
+    description: |
+      Sometimes referred to as output gain, slope, or temperature coefficient.
+
+      alpha is expressed in parts per million which can be micro-amps per
+      degrees Celsius or micro-volts per degrees Celsius. The is the main
+      characteristic of a temperature transducer and should be stated in the
+      datasheet.
+
+additionalProperties: false
+
+required:
+  - compatible
+  - io-channels
+  - alpha-ppm-per-celsius
+
+examples:
+  - |
+    ad950: temperature-sensor-0 {
+        compatible = "temperature-transducer";
+        #io-channel-cells = <0>;
+        io-channels = <&temp_adc 3>;
+
+        sense-offset-millicelsius = <(-273150)>; /* Kelvin to degrees Celsius */
+        sense-resistor-ohms = <8060>;
+        alpha-ppm-per-celsius = <1>; /* 1 uA/K */
+    };
+  - |
+    znq_tmp: temperature-sensor-1 {
+        compatible = "temperature-transducer";
+        #io-channel-cells = <0>;
+        io-channels = <&temp_adc 2>;
+
+        sense-offset-millicelsius = <(-273150)>; /* Kelvin to degrees Celsius */
+        alpha-ppm-per-celsius = <4000>; /* 4 mV/K */
+    };
+...
-- 
2.35.1.4.g5d01301f2b86


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH v15 06/10] iio: test: add basic tests for the iio-rescale driver
  2022-02-13  2:57 ` [PATCH v15 06/10] iio: test: add basic tests for the iio-rescale driver Liam Beguin
@ 2022-02-14  9:59   ` kernel test robot
  2022-06-27  7:22   ` Geert Uytterhoeven
  1 sibling, 0 replies; 19+ messages in thread
From: kernel test robot @ 2022-02-14  9:59 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 2638 bytes --]

Hi Liam,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on cd717ac6f69db4953ca701c6220c7cb58e17f35a]

url:    https://github.com/0day-ci/linux/commits/Liam-Beguin/iio-afe-add-temperature-rescaling-support/20220213-105952
base:   cd717ac6f69db4953ca701c6220c7cb58e17f35a
config: microblaze-randconfig-r002-20220213 (https://download.01.org/0day-ci/archive/20220214/202202141701.Sk68w0Ft-lkp(a)intel.com/config)
compiler: microblaze-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/757b647146492570add37dfe5839b90d87c74cf4
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Liam-Beguin/iio-afe-add-temperature-rescaling-support/20220213-105952
        git checkout 757b647146492570add37dfe5839b90d87c74cf4
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=microblaze SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   microblaze-linux-ld: drivers/iio/test/iio-test-rescale.o: in function `iio_rescale_test_offset':
>> (.text+0x34): undefined reference to `kunit_kmalloc_array'
>> microblaze-linux-ld: (.text+0x16c): undefined reference to `kunit_binary_assert_format'
>> microblaze-linux-ld: (.text+0x1d4): undefined reference to `kunit_do_assertion'
>> microblaze-linux-ld: (.text+0x1ec): undefined reference to `kunit_binary_str_assert_format'
   microblaze-linux-ld: (.text+0x2e4): undefined reference to `kunit_do_assertion'
   microblaze-linux-ld: drivers/iio/test/iio-test-rescale.o: in function `iio_rescale_test_scale':
   (.text+0x478): undefined reference to `kunit_kmalloc_array'
   microblaze-linux-ld: (.text+0x4b0): undefined reference to `kunit_binary_assert_format'
   microblaze-linux-ld: (.text+0x608): undefined reference to `kunit_do_assertion'
   microblaze-linux-ld: (.text+0x9ec): undefined reference to `kunit_do_assertion'
   microblaze-linux-ld: (.text+0xaf0): undefined reference to `kunit_do_assertion'
   microblaze-linux-ld: net/core/sock.o: in function `sk_destruct':
   (.text+0x7810): undefined reference to `__sk_defer_free_flush'

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v15 00/10] iio: afe: add temperature rescaling support
  2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
                   ` (9 preceding siblings ...)
  2022-02-13  2:57 ` [PATCH v15 10/10] dt-bindings: iio: afe: add bindings for temperature transducers Liam Beguin
@ 2022-02-27 12:55 ` Jonathan Cameron
  2022-02-27 13:05   ` Jonathan Cameron
  2022-02-28 16:45   ` Liam Beguin
  10 siblings, 2 replies; 19+ messages in thread
From: Jonathan Cameron @ 2022-02-27 12:55 UTC (permalink / raw)
  To: Liam Beguin
  Cc: peda, andy.shevchenko, lars, linux-kernel, linux-iio, devicetree,
	robh+dt

On Sat, 12 Feb 2022 21:57:29 -0500
Liam Beguin <liambeguin@gmail.com> wrote:

> Jonathan, Peter, Andy,
> 
> This series focuses on adding temperature rescaling support to the IIO
> Analog Front End (AFE) driver.
> 
> The main changes to the AFE driver include an initial Kunit test suite,
> support for IIO_VAL_INT_PLUS_{NANO,MICRO} scales, and support for RTDs
> and temperature transducer sensors.
> 
> Thanks for your time,
> Liam

Hi Liam,

I was waiting for Andy to reply to this. Took a quick look back at
what was outstanding and realised he had given a
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
for v13.

I'm assuming there wasn't a strong reason to drop that in the meantime
and it's a simple omission / crossed emails issue.

As such, 

Series applied to the togreg branch of iio.git and pushed out
as testing to get some build coverage from 0-day.

Thanks,

Jonathan

> 
> Changes since v14:
> - Revert units.h changes in favor of "raw" values
> 
> Changes since v13:
> - fix SI prefix in rescale_temp_sense_rtd_props()
> - add comment explaining SI prefixes are sometimes used as mathematical
>   multipliers with no particular physical meaning associated.
> 
> Changes since v12:
> - rebase on latest testing branch
> - fix copyright holder in newly created header file
> - add myself as a copyright holder of the iio-rescale.c driver at
>   Peter's suggestion
> - fix undefined behavior on left-shift operation
> 
> Changes since v11:
> - update commits with my personal email since all this work was done on
>   my own time
> - apply Peter's Reviewed-by to my local tree
> - fix use of units.h
> - make use of units.h more consistently in iio-rescale.c and in the
>   tests
> - fix #include ordering
> - treat 04/16 as a fix. Move it, and add a Fixes: tag
> - fix undefined behavior on left-shift operation
> - add comment about fract_mult with iio_str_to_fixpoint()
> - reword commit message for 14/16, based on Andy's comments
> 
> Changes since v10:
> - apply Andy's suggestion for offset calculations
> - make use of units.h more consistently
> 
> Changes since v9:
> - make use of linux/units.h
> - reorder commits, fix fract_log2 before merging fract
> - keep fractional representation when not overflowing
> 
> Changes since v8:
> - reword comment
> - fix erroneous 64-bit division
> - optimize and use 32-bit divisions when values are know to not overflow
> - keep IIO_VAL_FRACTIONAL scale when possible, if not default to fixed
>   point
> - add test cases
> - use nano precision in test cases
> - simplify offset calculation in rtd_props()
> 
> Changes since v7:
> - drop gcd() logic in rescale_process_scale()
> - use div_s64() instead of do_div() for signed 64-bit divisions
> - combine IIO_VAL_FRACTIONAL and IIO_VAL_FRACTIONAL_LOG2 scale cases
> - switch to INT_PLUS_NANO when accuracy is lost with FRACTIONAL scales
> - rework test logic to allow for small relative error
> - rename test variables to align error output messages
> 
> Changes since v6:
> - rework IIO_VAL_INT_PLUS_{NANO,MICRO} based on Peter's suggestion
> - combine IIO_VAL_INT_PLUS_{NANO,MICRO} cases
> - add test cases for negative IIO_VAL_INT_PLUS_{NANO,MICRO} corner cases
> - force use of positive integers with gcd()
> - reduce risk of integer overflow in IIO_VAL_FRACTIONAL_LOG2
> - fix duplicate symbol build error
> - apply Reviewed-by
> 
> Changes since v5:
> - add include/linux/iio/afe/rescale.h
> - expose functions use to process scale and offset
> - add basic iio-rescale kunit test cases
> - fix integer overflow case
> - improve precision for IIO_VAL_FRACTIONAL_LOG2
> 
> Changes since v4:
> - only use gcd() when necessary in overflow mitigation
> - fix INT_PLUS_{MICRO,NANO} support
> - apply Reviewed-by
> - fix temperature-transducer bindings
> 
> Changes since v3:
> - drop unnecessary fallthrough statements
> - drop redundant local variables in some calculations
> - fix s64 divisions on 32bit platforms by using do_div
> - add comment describing iio-rescaler offset calculation
> - drop unnecessary MAINTAINERS entry
> 
> Changes since v2:
> - don't break implicit offset truncations
> - make a best effort to get a valid value for fractional types
> - drop return value change in iio_convert_raw_to_processed_unlocked()
> - don't rely on processed value for offset calculation
> - add INT_PLUS_{MICRO,NANO} support in iio-rescale
> - revert generic implementation in favor of temperature-sense-rtd and
>   temperature-transducer
> - add separate section to MAINTAINERS file
> 
> Changes since v1:
> - rebase on latest iio `testing` branch
> - also apply consumer scale on integer channel scale types
> - don't break implicit truncation in processed channel offset
>   calculation
> - drop temperature AFE flavors in favor of a simpler generic
>   implementation
> 
> Liam Beguin (10):
>   iio: afe: rescale: expose scale processing function
>   iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support
>   iio: afe: rescale: add offset support
>   iio: afe: rescale: fix accuracy for small fractional scales
>   iio: afe: rescale: reduce risk of integer overflow
>   iio: test: add basic tests for the iio-rescale driver
>   iio: afe: rescale: add RTD temperature sensor support
>   iio: afe: rescale: add temperature transducers
>   dt-bindings: iio: afe: add bindings for temperature-sense-rtd
>   dt-bindings: iio: afe: add bindings for temperature transducers
> 
>  .../iio/afe/temperature-sense-rtd.yaml        | 101 +++
>  .../iio/afe/temperature-transducer.yaml       | 114 +++
>  drivers/iio/afe/iio-rescale.c                 | 283 ++++++-
>  drivers/iio/test/Kconfig                      |  10 +
>  drivers/iio/test/Makefile                     |   1 +
>  drivers/iio/test/iio-test-rescale.c           | 710 ++++++++++++++++++
>  include/linux/iio/afe/rescale.h               |  36 +
>  7 files changed, 1220 insertions(+), 35 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml
>  create mode 100644 Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml
>  create mode 100644 drivers/iio/test/iio-test-rescale.c
>  create mode 100644 include/linux/iio/afe/rescale.h
> 
> Range-diff against v14:
>  -:  ------------ >  1:  ee26b0eeac65 iio: afe: rescale: expose scale processing function
>  1:  a510097c83f1 !  2:  78f9d37575a5 iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support
>     @@ Commit message
>          Reviewed-by: Peter Rosin <peda@axentia.se>
>      
>       ## drivers/iio/afe/iio-rescale.c ##
>     -@@
>     - #include <linux/of_device.h>
>     - #include <linux/platform_device.h>
>     - #include <linux/property.h>
>     -+#include <linux/units.h>
>     - 
>     - #include <linux/iio/afe/rescale.h>
>     - #include <linux/iio/consumer.h>
>      @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale, int scale_type,
>       			  int *val, int *val2)
>       {
>     @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale
>      +		return scale_type;
>      +	case IIO_VAL_INT_PLUS_NANO:
>      +	case IIO_VAL_INT_PLUS_MICRO:
>     -+		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? GIGA : MEGA;
>     ++		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? 1000000000L : 1000000L;
>      +
>      +		/*
>      +		 * For IIO_VAL_INT_PLUS_{MICRO,NANO} scale types if either *val
>  2:  8f2f2699a9b4 !  3:  5be82bd72453 iio: afe: rescale: add offset support
>     @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale
>      +		*val = div_s64(tmp, scale) + schan_off;
>      +		return IIO_VAL_INT;
>      +	case IIO_VAL_INT_PLUS_NANO:
>     -+		tmp = (s64)rescale->offset * GIGA;
>     -+		tmp2 = ((s64)scale * GIGA) + scale2;
>     ++		tmp = (s64)rescale->offset * 1000000000LL;
>     ++		tmp2 = ((s64)scale * 1000000000LL) + scale2;
>      +		*val = div64_s64(tmp, tmp2) + schan_off;
>      +		return IIO_VAL_INT;
>      +	case IIO_VAL_INT_PLUS_MICRO:
>     -+		tmp = (s64)rescale->offset * MEGA;
>     -+		tmp2 = ((s64)scale * MEGA) + scale2;
>     ++		tmp = (s64)rescale->offset * 1000000LL;
>     ++		tmp2 = ((s64)scale * 1000000LL) + scale2;
>      +		*val = div64_s64(tmp, tmp2) + schan_off;
>      +		return IIO_VAL_INT;
>      +	default:
>  3:  2efa970bad26 !  4:  95ec184759f6 iio: afe: rescale: fix accuracy for small fractional scales
>     @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale
>      +		return IIO_VAL_INT_PLUS_NANO;
>       	case IIO_VAL_INT_PLUS_NANO:
>       	case IIO_VAL_INT_PLUS_MICRO:
>     - 		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? GIGA : MEGA;
>     + 		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? 1000000000L : 1000000L;
>  4:  201037c0ead8 =  5:  2e1d41ef69d9 iio: afe: rescale: reduce risk of integer overflow
>  5:  a0037cc3ee90 <  -:  ------------ iio: afe: rescale: make use of units.h
>  6:  f8d47728f482 !  6:  0b6c029dea1d iio: test: add basic tests for the iio-rescale driver
>     @@ drivers/iio/test/iio-test-rescale.c (new)
>      +
>      +#include <linux/gcd.h>
>      +#include <linux/overflow.h>
>     -+#include <linux/units.h>
>      +
>      +#include <linux/iio/afe/rescale.h>
>      +#include <linux/iio/iio.h>
>     @@ drivers/iio/test/iio-test-rescale.c (new)
>      +	if (tmp < 0)
>      +		tmp2 *= -1;
>      +
>     -+	*nano = (s64)tmp * GIGA + tmp2;
>     ++	*nano = (s64)tmp * 1000000000UL + tmp2;
>      +
>      +	return ret;
>      +}
>     @@ drivers/iio/test/iio-test-rescale.c (new)
>      +		return -EINVAL;
>      +	}
>      +
>     -+	err = MEGA * abs(exp - real);
>     ++	err = 1000000UL * abs(exp - real);
>      +
>      +	return (int)div64_u64(err, abs(exp));
>      +}
>  7:  a04685586340 !  7:  951ea44d0f5c iio: afe: rescale: add RTD temperature sensor support
>     @@ drivers/iio/afe/iio-rescale.c: static int rescale_voltage_divider_props(struct d
>      +		return ret;
>      +	}
>      +
>     -+	tmp = r0 * iexc * alpha / MEGA;
>     -+	factor = gcd(tmp, MEGA);
>     -+	rescale->numerator = MEGA / factor;
>     ++	tmp = r0 * iexc * alpha / 1000000;
>     ++	factor = gcd(tmp, 1000000);
>     ++	rescale->numerator = 1000000 / factor;
>      +	rescale->denominator = tmp / factor;
>      +
>     -+	rescale->offset = -1 * ((r0 * iexc) / KILO);
>     ++	rescale->offset = -1 * ((r0 * iexc) / 1000);
>      +
>      +	return 0;
>      +}
>  8:  e3b716aaee50 !  8:  56516fdc67bf iio: afe: rescale: add temperature transducers
>     @@ drivers/iio/afe/iio-rescale.c: static int rescale_temp_sense_rtd_props(struct de
>      +		return ret;
>      +	}
>      +
>     -+	rescale->numerator = MEGA;
>     ++	rescale->numerator = 1000000;
>      +	rescale->denominator = alpha * sense;
>      +
>      +	rescale->offset = div_s64((s64)offset * rescale->denominator,
>  9:  22ae1458eb8b =  9:  8c409050990b dt-bindings: iio: afe: add bindings for temperature-sense-rtd
> 10:  33825ad452d6 = 10:  bb39296590f3 dt-bindings: iio: afe: add bindings for temperature transducers
> 
> base-commit: cd717ac6f69db4953ca701c6220c7cb58e17f35a


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v15 00/10] iio: afe: add temperature rescaling support
  2022-02-27 12:55 ` [PATCH v15 00/10] iio: afe: add temperature rescaling support Jonathan Cameron
@ 2022-02-27 13:05   ` Jonathan Cameron
  2022-02-27 13:25     ` Andy Shevchenko
  2022-02-28 16:45   ` Liam Beguin
  1 sibling, 1 reply; 19+ messages in thread
From: Jonathan Cameron @ 2022-02-27 13:05 UTC (permalink / raw)
  To: Liam Beguin
  Cc: peda, andy.shevchenko, lars, linux-kernel, linux-iio, devicetree,
	robh+dt

On Sun, 27 Feb 2022 12:55:59 +0000
Jonathan Cameron <jic23@kernel.org> wrote:

> On Sat, 12 Feb 2022 21:57:29 -0500
> Liam Beguin <liambeguin@gmail.com> wrote:
> 
> > Jonathan, Peter, Andy,
> > 
> > This series focuses on adding temperature rescaling support to the IIO
> > Analog Front End (AFE) driver.
> > 
> > The main changes to the AFE driver include an initial Kunit test suite,
> > support for IIO_VAL_INT_PLUS_{NANO,MICRO} scales, and support for RTDs
> > and temperature transducer sensors.
> > 
> > Thanks for your time,
> > Liam  
> 
> Hi Liam,
> 
> I was waiting for Andy to reply to this. Took a quick look back at
> what was outstanding and realised he had given a
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> for v13.

Actually given the units.h change is a perhaps non trivial perhaps that's
why you dropped Andy's RB.  I'll still apply the series, but it Andy
confirms his view on that tag before I push this out as something I can't
rebase I'll add it if appropriate.

Thanks,

Jonathan

> 
> I'm assuming there wasn't a strong reason to drop that in the meantime
> and it's a simple omission / crossed emails issue.
> 
> As such, 
> 
> Series applied to the togreg branch of iio.git and pushed out
> as testing to get some build coverage from 0-day.
> 
> Thanks,
> 
> Jonathan
> 
> > 
> > Changes since v14:
> > - Revert units.h changes in favor of "raw" values
> > 
> > Changes since v13:
> > - fix SI prefix in rescale_temp_sense_rtd_props()
> > - add comment explaining SI prefixes are sometimes used as mathematical
> >   multipliers with no particular physical meaning associated.
> > 
> > Changes since v12:
> > - rebase on latest testing branch
> > - fix copyright holder in newly created header file
> > - add myself as a copyright holder of the iio-rescale.c driver at
> >   Peter's suggestion
> > - fix undefined behavior on left-shift operation
> > 
> > Changes since v11:
> > - update commits with my personal email since all this work was done on
> >   my own time
> > - apply Peter's Reviewed-by to my local tree
> > - fix use of units.h
> > - make use of units.h more consistently in iio-rescale.c and in the
> >   tests
> > - fix #include ordering
> > - treat 04/16 as a fix. Move it, and add a Fixes: tag
> > - fix undefined behavior on left-shift operation
> > - add comment about fract_mult with iio_str_to_fixpoint()
> > - reword commit message for 14/16, based on Andy's comments
> > 
> > Changes since v10:
> > - apply Andy's suggestion for offset calculations
> > - make use of units.h more consistently
> > 
> > Changes since v9:
> > - make use of linux/units.h
> > - reorder commits, fix fract_log2 before merging fract
> > - keep fractional representation when not overflowing
> > 
> > Changes since v8:
> > - reword comment
> > - fix erroneous 64-bit division
> > - optimize and use 32-bit divisions when values are know to not overflow
> > - keep IIO_VAL_FRACTIONAL scale when possible, if not default to fixed
> >   point
> > - add test cases
> > - use nano precision in test cases
> > - simplify offset calculation in rtd_props()
> > 
> > Changes since v7:
> > - drop gcd() logic in rescale_process_scale()
> > - use div_s64() instead of do_div() for signed 64-bit divisions
> > - combine IIO_VAL_FRACTIONAL and IIO_VAL_FRACTIONAL_LOG2 scale cases
> > - switch to INT_PLUS_NANO when accuracy is lost with FRACTIONAL scales
> > - rework test logic to allow for small relative error
> > - rename test variables to align error output messages
> > 
> > Changes since v6:
> > - rework IIO_VAL_INT_PLUS_{NANO,MICRO} based on Peter's suggestion
> > - combine IIO_VAL_INT_PLUS_{NANO,MICRO} cases
> > - add test cases for negative IIO_VAL_INT_PLUS_{NANO,MICRO} corner cases
> > - force use of positive integers with gcd()
> > - reduce risk of integer overflow in IIO_VAL_FRACTIONAL_LOG2
> > - fix duplicate symbol build error
> > - apply Reviewed-by
> > 
> > Changes since v5:
> > - add include/linux/iio/afe/rescale.h
> > - expose functions use to process scale and offset
> > - add basic iio-rescale kunit test cases
> > - fix integer overflow case
> > - improve precision for IIO_VAL_FRACTIONAL_LOG2
> > 
> > Changes since v4:
> > - only use gcd() when necessary in overflow mitigation
> > - fix INT_PLUS_{MICRO,NANO} support
> > - apply Reviewed-by
> > - fix temperature-transducer bindings
> > 
> > Changes since v3:
> > - drop unnecessary fallthrough statements
> > - drop redundant local variables in some calculations
> > - fix s64 divisions on 32bit platforms by using do_div
> > - add comment describing iio-rescaler offset calculation
> > - drop unnecessary MAINTAINERS entry
> > 
> > Changes since v2:
> > - don't break implicit offset truncations
> > - make a best effort to get a valid value for fractional types
> > - drop return value change in iio_convert_raw_to_processed_unlocked()
> > - don't rely on processed value for offset calculation
> > - add INT_PLUS_{MICRO,NANO} support in iio-rescale
> > - revert generic implementation in favor of temperature-sense-rtd and
> >   temperature-transducer
> > - add separate section to MAINTAINERS file
> > 
> > Changes since v1:
> > - rebase on latest iio `testing` branch
> > - also apply consumer scale on integer channel scale types
> > - don't break implicit truncation in processed channel offset
> >   calculation
> > - drop temperature AFE flavors in favor of a simpler generic
> >   implementation
> > 
> > Liam Beguin (10):
> >   iio: afe: rescale: expose scale processing function
> >   iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support
> >   iio: afe: rescale: add offset support
> >   iio: afe: rescale: fix accuracy for small fractional scales
> >   iio: afe: rescale: reduce risk of integer overflow
> >   iio: test: add basic tests for the iio-rescale driver
> >   iio: afe: rescale: add RTD temperature sensor support
> >   iio: afe: rescale: add temperature transducers
> >   dt-bindings: iio: afe: add bindings for temperature-sense-rtd
> >   dt-bindings: iio: afe: add bindings for temperature transducers
> > 
> >  .../iio/afe/temperature-sense-rtd.yaml        | 101 +++
> >  .../iio/afe/temperature-transducer.yaml       | 114 +++
> >  drivers/iio/afe/iio-rescale.c                 | 283 ++++++-
> >  drivers/iio/test/Kconfig                      |  10 +
> >  drivers/iio/test/Makefile                     |   1 +
> >  drivers/iio/test/iio-test-rescale.c           | 710 ++++++++++++++++++
> >  include/linux/iio/afe/rescale.h               |  36 +
> >  7 files changed, 1220 insertions(+), 35 deletions(-)
> >  create mode 100644 Documentation/devicetree/bindings/iio/afe/temperature-sense-rtd.yaml
> >  create mode 100644 Documentation/devicetree/bindings/iio/afe/temperature-transducer.yaml
> >  create mode 100644 drivers/iio/test/iio-test-rescale.c
> >  create mode 100644 include/linux/iio/afe/rescale.h
> > 
> > Range-diff against v14:
> >  -:  ------------ >  1:  ee26b0eeac65 iio: afe: rescale: expose scale processing function
> >  1:  a510097c83f1 !  2:  78f9d37575a5 iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support
> >     @@ Commit message
> >          Reviewed-by: Peter Rosin <peda@axentia.se>
> >      
> >       ## drivers/iio/afe/iio-rescale.c ##
> >     -@@
> >     - #include <linux/of_device.h>
> >     - #include <linux/platform_device.h>
> >     - #include <linux/property.h>
> >     -+#include <linux/units.h>
> >     - 
> >     - #include <linux/iio/afe/rescale.h>
> >     - #include <linux/iio/consumer.h>
> >      @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale, int scale_type,
> >       			  int *val, int *val2)
> >       {
> >     @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale
> >      +		return scale_type;
> >      +	case IIO_VAL_INT_PLUS_NANO:
> >      +	case IIO_VAL_INT_PLUS_MICRO:
> >     -+		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? GIGA : MEGA;
> >     ++		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? 1000000000L : 1000000L;
> >      +
> >      +		/*
> >      +		 * For IIO_VAL_INT_PLUS_{MICRO,NANO} scale types if either *val
> >  2:  8f2f2699a9b4 !  3:  5be82bd72453 iio: afe: rescale: add offset support
> >     @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale
> >      +		*val = div_s64(tmp, scale) + schan_off;
> >      +		return IIO_VAL_INT;
> >      +	case IIO_VAL_INT_PLUS_NANO:
> >     -+		tmp = (s64)rescale->offset * GIGA;
> >     -+		tmp2 = ((s64)scale * GIGA) + scale2;
> >     ++		tmp = (s64)rescale->offset * 1000000000LL;
> >     ++		tmp2 = ((s64)scale * 1000000000LL) + scale2;
> >      +		*val = div64_s64(tmp, tmp2) + schan_off;
> >      +		return IIO_VAL_INT;
> >      +	case IIO_VAL_INT_PLUS_MICRO:
> >     -+		tmp = (s64)rescale->offset * MEGA;
> >     -+		tmp2 = ((s64)scale * MEGA) + scale2;
> >     ++		tmp = (s64)rescale->offset * 1000000LL;
> >     ++		tmp2 = ((s64)scale * 1000000LL) + scale2;
> >      +		*val = div64_s64(tmp, tmp2) + schan_off;
> >      +		return IIO_VAL_INT;
> >      +	default:
> >  3:  2efa970bad26 !  4:  95ec184759f6 iio: afe: rescale: fix accuracy for small fractional scales
> >     @@ drivers/iio/afe/iio-rescale.c: int rescale_process_scale(struct rescale *rescale
> >      +		return IIO_VAL_INT_PLUS_NANO;
> >       	case IIO_VAL_INT_PLUS_NANO:
> >       	case IIO_VAL_INT_PLUS_MICRO:
> >     - 		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? GIGA : MEGA;
> >     + 		mult = scale_type == IIO_VAL_INT_PLUS_NANO ? 1000000000L : 1000000L;
> >  4:  201037c0ead8 =  5:  2e1d41ef69d9 iio: afe: rescale: reduce risk of integer overflow
> >  5:  a0037cc3ee90 <  -:  ------------ iio: afe: rescale: make use of units.h
> >  6:  f8d47728f482 !  6:  0b6c029dea1d iio: test: add basic tests for the iio-rescale driver
> >     @@ drivers/iio/test/iio-test-rescale.c (new)
> >      +
> >      +#include <linux/gcd.h>
> >      +#include <linux/overflow.h>
> >     -+#include <linux/units.h>
> >      +
> >      +#include <linux/iio/afe/rescale.h>
> >      +#include <linux/iio/iio.h>
> >     @@ drivers/iio/test/iio-test-rescale.c (new)
> >      +	if (tmp < 0)
> >      +		tmp2 *= -1;
> >      +
> >     -+	*nano = (s64)tmp * GIGA + tmp2;
> >     ++	*nano = (s64)tmp * 1000000000UL + tmp2;
> >      +
> >      +	return ret;
> >      +}
> >     @@ drivers/iio/test/iio-test-rescale.c (new)
> >      +		return -EINVAL;
> >      +	}
> >      +
> >     -+	err = MEGA * abs(exp - real);
> >     ++	err = 1000000UL * abs(exp - real);
> >      +
> >      +	return (int)div64_u64(err, abs(exp));
> >      +}
> >  7:  a04685586340 !  7:  951ea44d0f5c iio: afe: rescale: add RTD temperature sensor support
> >     @@ drivers/iio/afe/iio-rescale.c: static int rescale_voltage_divider_props(struct d
> >      +		return ret;
> >      +	}
> >      +
> >     -+	tmp = r0 * iexc * alpha / MEGA;
> >     -+	factor = gcd(tmp, MEGA);
> >     -+	rescale->numerator = MEGA / factor;
> >     ++	tmp = r0 * iexc * alpha / 1000000;
> >     ++	factor = gcd(tmp, 1000000);
> >     ++	rescale->numerator = 1000000 / factor;
> >      +	rescale->denominator = tmp / factor;
> >      +
> >     -+	rescale->offset = -1 * ((r0 * iexc) / KILO);
> >     ++	rescale->offset = -1 * ((r0 * iexc) / 1000);
> >      +
> >      +	return 0;
> >      +}
> >  8:  e3b716aaee50 !  8:  56516fdc67bf iio: afe: rescale: add temperature transducers
> >     @@ drivers/iio/afe/iio-rescale.c: static int rescale_temp_sense_rtd_props(struct de
> >      +		return ret;
> >      +	}
> >      +
> >     -+	rescale->numerator = MEGA;
> >     ++	rescale->numerator = 1000000;
> >      +	rescale->denominator = alpha * sense;
> >      +
> >      +	rescale->offset = div_s64((s64)offset * rescale->denominator,
> >  9:  22ae1458eb8b =  9:  8c409050990b dt-bindings: iio: afe: add bindings for temperature-sense-rtd
> > 10:  33825ad452d6 = 10:  bb39296590f3 dt-bindings: iio: afe: add bindings for temperature transducers
> > 
> > base-commit: cd717ac6f69db4953ca701c6220c7cb58e17f35a  
> 


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v15 00/10] iio: afe: add temperature rescaling support
  2022-02-27 13:05   ` Jonathan Cameron
@ 2022-02-27 13:25     ` Andy Shevchenko
  2022-02-27 13:39       ` Jonathan Cameron
  0 siblings, 1 reply; 19+ messages in thread
From: Andy Shevchenko @ 2022-02-27 13:25 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Liam Beguin, Peter Rosin, Lars-Peter Clausen,
	Linux Kernel Mailing List, linux-iio, devicetree, Rob Herring

On Sun, Feb 27, 2022 at 2:58 PM Jonathan Cameron <jic23@kernel.org> wrote:
> On Sun, 27 Feb 2022 12:55:59 +0000
> Jonathan Cameron <jic23@kernel.org> wrote:
> > On Sat, 12 Feb 2022 21:57:29 -0500
> > Liam Beguin <liambeguin@gmail.com> wrote:
> >
> > > Jonathan, Peter, Andy,
> > >
> > > This series focuses on adding temperature rescaling support to the IIO
> > > Analog Front End (AFE) driver.
> > >
> > > The main changes to the AFE driver include an initial Kunit test suite,
> > > support for IIO_VAL_INT_PLUS_{NANO,MICRO} scales, and support for RTDs
> > > and temperature transducer sensors.

...

> > I was waiting for Andy to reply to this. Took a quick look back at
> > what was outstanding and realised he had given a
> > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> > for v13.
>
> Actually given the units.h change is a perhaps non trivial perhaps that's
> why you dropped Andy's RB.  I'll still apply the series, but it Andy
> confirms his view on that tag before I push this out as something I can't
> rebase I'll add it if appropriate.

Since it was a separate patch, I'm fine with not including it due to
strong argument from Peter.

> > I'm assuming there wasn't a strong reason to drop that in the meantime
> > and it's a simple omission / crossed emails issue.
> >
> > As such,
> >
> > Series applied to the togreg branch of iio.git and pushed out
> > as testing to get some build coverage from 0-day.


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v15 00/10] iio: afe: add temperature rescaling support
  2022-02-27 13:25     ` Andy Shevchenko
@ 2022-02-27 13:39       ` Jonathan Cameron
  0 siblings, 0 replies; 19+ messages in thread
From: Jonathan Cameron @ 2022-02-27 13:39 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Liam Beguin, Peter Rosin, Lars-Peter Clausen,
	Linux Kernel Mailing List, linux-iio, devicetree, Rob Herring

On Sun, 27 Feb 2022 15:25:50 +0200
Andy Shevchenko <andy.shevchenko@gmail.com> wrote:

> On Sun, Feb 27, 2022 at 2:58 PM Jonathan Cameron <jic23@kernel.org> wrote:
> > On Sun, 27 Feb 2022 12:55:59 +0000
> > Jonathan Cameron <jic23@kernel.org> wrote:  
> > > On Sat, 12 Feb 2022 21:57:29 -0500
> > > Liam Beguin <liambeguin@gmail.com> wrote:
> > >  
> > > > Jonathan, Peter, Andy,
> > > >
> > > > This series focuses on adding temperature rescaling support to the IIO
> > > > Analog Front End (AFE) driver.
> > > >
> > > > The main changes to the AFE driver include an initial Kunit test suite,
> > > > support for IIO_VAL_INT_PLUS_{NANO,MICRO} scales, and support for RTDs
> > > > and temperature transducer sensors.  
> 
> ...
> 
> > > I was waiting for Andy to reply to this. Took a quick look back at
> > > what was outstanding and realised he had given a
> > > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> > > for v13.  
> >
> > Actually given the units.h change is a perhaps non trivial perhaps that's
> > why you dropped Andy's RB.  I'll still apply the series, but it Andy
> > confirms his view on that tag before I push this out as something I can't
> > rebase I'll add it if appropriate.  
> 
> Since it was a separate patch, I'm fine with not including it due to
> strong argument from Peter.
Thanks. I've added your Rb and pushed out a fresh testing branch.

Jonathan

> 
> > > I'm assuming there wasn't a strong reason to drop that in the meantime
> > > and it's a simple omission / crossed emails issue.
> > >
> > > As such,
> > >
> > > Series applied to the togreg branch of iio.git and pushed out
> > > as testing to get some build coverage from 0-day.  
> 
> 


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v15 00/10] iio: afe: add temperature rescaling support
  2022-02-27 12:55 ` [PATCH v15 00/10] iio: afe: add temperature rescaling support Jonathan Cameron
  2022-02-27 13:05   ` Jonathan Cameron
@ 2022-02-28 16:45   ` Liam Beguin
  1 sibling, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-02-28 16:45 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: peda, andy.shevchenko, lars, linux-kernel, linux-iio, devicetree,
	robh+dt

Hi Jonathan,

On Sun, Feb 27, 2022 at 12:55:59PM +0000, Jonathan Cameron wrote:
> On Sat, 12 Feb 2022 21:57:29 -0500
> Liam Beguin <liambeguin@gmail.com> wrote:
> 
> > Jonathan, Peter, Andy,
> > 
> > This series focuses on adding temperature rescaling support to the IIO
> > Analog Front End (AFE) driver.
> > 
> > The main changes to the AFE driver include an initial Kunit test suite,
> > support for IIO_VAL_INT_PLUS_{NANO,MICRO} scales, and support for RTDs
> > and temperature transducer sensors.
> > 
> > Thanks for your time,
> > Liam
> 
> Hi Liam,
> 
> I was waiting for Andy to reply to this. Took a quick look back at
> what was outstanding and realised he had given a
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> for v13.
> 
> I'm assuming there wasn't a strong reason to drop that in the meantime
> and it's a simple omission / crossed emails issue.
> 
> As such, 
> 
> Series applied to the togreg branch of iio.git and pushed out
> as testing to get some build coverage from 0-day.

Great news! Thanks again for your patience, and review on this work.

I noticed you fixed the CI error. Thanks for doing that, and my
apologies for missing it.

Cheers,
Liam

> Thanks,
> 
> Jonathan
> 

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v15 06/10] iio: test: add basic tests for the iio-rescale driver
  2022-02-13  2:57 ` [PATCH v15 06/10] iio: test: add basic tests for the iio-rescale driver Liam Beguin
  2022-02-14  9:59   ` kernel test robot
@ 2022-06-27  7:22   ` Geert Uytterhoeven
  2022-06-28 17:06     ` Liam Beguin
  1 sibling, 1 reply; 19+ messages in thread
From: Geert Uytterhoeven @ 2022-06-27  7:22 UTC (permalink / raw)
  To: Liam Beguin
  Cc: Peter Rosin, Jonathan Cameron, Andy Shevchenko,
	Lars-Peter Clausen, Linux Kernel Mailing List, linux-iio,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	Rob Herring

Hi Liam,

On Mon, Feb 14, 2022 at 12:00 AM Liam Beguin <liambeguin@gmail.com> wrote:
> The iio-rescale driver supports various combinations of scale types and
> offsets. These can often result in large integer multiplications. Make
> sure these calculations are done right by adding a set of kunit test
> cases that build on top of iio-test-format.
>
> To run these tests, add the following to .kunitconfig
>         $ cat .kunitconfig
>         CONFIG_IIO=y
>         CONFIG_IIO_RESCALE_KUNIT_TEST=y
>         CONFIG_KUNIT=y
>
> Then run:
>         $ ./tools/testing/kunit/kunit.py run --kunitconfig .kunitconfig
>
> Signed-off-by: Liam Beguin <liambeguin@gmail.com>
> Reviewed-by: Peter Rosin <peda@axentia.se>

Thanks for your patch, which is now commit 8e74a48d17d509bf
("iio: test: add basic tests for the iio-rescale driver") in v5.18.

> --- a/drivers/iio/test/Kconfig
> +++ b/drivers/iio/test/Kconfig
> @@ -4,6 +4,16 @@
>  #
>
>  # Keep in alphabetical order
> +config IIO_RESCALE_KUNIT_TEST
> +       bool "Test IIO rescale conversion functions"

Is there any reason this cannot be tristate, so I can always enable
this as a module, and run the test by loading the module whenever
I want?

> +       depends on KUNIT && !IIO_RESCALE
> +       default KUNIT_ALL_TESTS
> +       help
> +         If you want to run tests on the iio-rescale code say Y here.
> +
> +         This takes advantage of ARCH=um to run tests and should be used by
> +         developers to tests their changes to the rescaling logic.
> +
>  config IIO_TEST_FORMAT
>          bool "Test IIO formatting functions"
>          depends on KUNIT=y

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v15 06/10] iio: test: add basic tests for the iio-rescale driver
  2022-06-27  7:22   ` Geert Uytterhoeven
@ 2022-06-28 17:06     ` Liam Beguin
  0 siblings, 0 replies; 19+ messages in thread
From: Liam Beguin @ 2022-06-28 17:06 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Peter Rosin, Jonathan Cameron, Andy Shevchenko,
	Lars-Peter Clausen, Linux Kernel Mailing List, linux-iio,
	open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS,
	Rob Herring

Hi Geert,

On Mon, Jun 27, 2022 at 09:22:29AM +0200, Geert Uytterhoeven wrote:
> Hi Liam,
> 
> On Mon, Feb 14, 2022 at 12:00 AM Liam Beguin <liambeguin@gmail.com> wrote:
> > The iio-rescale driver supports various combinations of scale types and
> > offsets. These can often result in large integer multiplications. Make
> > sure these calculations are done right by adding a set of kunit test
> > cases that build on top of iio-test-format.
> >
> > To run these tests, add the following to .kunitconfig
> >         $ cat .kunitconfig
> >         CONFIG_IIO=y
> >         CONFIG_IIO_RESCALE_KUNIT_TEST=y
> >         CONFIG_KUNIT=y
> >
> > Then run:
> >         $ ./tools/testing/kunit/kunit.py run --kunitconfig .kunitconfig
> >
> > Signed-off-by: Liam Beguin <liambeguin@gmail.com>
> > Reviewed-by: Peter Rosin <peda@axentia.se>
> 
> Thanks for your patch, which is now commit 8e74a48d17d509bf
> ("iio: test: add basic tests for the iio-rescale driver") in v5.18.

Thanks!  I also recently sent a fix for this which recently made it
upstream:
7a2f6f61e8ee ("iio: test: fix missing MODULE_LICENSE for IIO_RESCALE=m")

> > --- a/drivers/iio/test/Kconfig
> > +++ b/drivers/iio/test/Kconfig
> > @@ -4,6 +4,16 @@
> >  #
> >
> >  # Keep in alphabetical order
> > +config IIO_RESCALE_KUNIT_TEST
> > +       bool "Test IIO rescale conversion functions"
> 
> Is there any reason this cannot be tristate, so I can always enable
> this as a module, and run the test by loading the module whenever
> I want?

I based this patch off of IIO_TEST_FORMAT, and also thought that Kunit
tests had to be built-in to work with tools/testing/kunit/kunit.py

Looking at the Documentation again, it seems I was (partially?) wrong,
kunit tests can be run as module, but manually.

I could give this a try and send a patch in the next few days.

Cheers,
Liam

> > +       depends on KUNIT && !IIO_RESCALE
> > +       default KUNIT_ALL_TESTS
> > +       help
> > +         If you want to run tests on the iio-rescale code say Y here.
> > +
> > +         This takes advantage of ARCH=um to run tests and should be used by
> > +         developers to tests their changes to the rescaling logic.
> > +
> >  config IIO_TEST_FORMAT
> >          bool "Test IIO formatting functions"
> >          depends on KUNIT=y
> 
> Gr{oetje,eeting}s,
> 
>                         Geert
> 
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
> 
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
>                                 -- Linus Torvalds

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2022-06-28 17:06 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-13  2:57 [PATCH v15 00/10] iio: afe: add temperature rescaling support Liam Beguin
2022-02-13  2:57 ` [PATCH v15 01/10] iio: afe: rescale: expose scale processing function Liam Beguin
2022-02-13  2:57 ` [PATCH v15 02/10] iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support Liam Beguin
2022-02-13  2:57 ` [PATCH v15 03/10] iio: afe: rescale: add offset support Liam Beguin
2022-02-13  2:57 ` [PATCH v15 04/10] iio: afe: rescale: fix accuracy for small fractional scales Liam Beguin
2022-02-13  2:57 ` [PATCH v15 05/10] iio: afe: rescale: reduce risk of integer overflow Liam Beguin
2022-02-13  2:57 ` [PATCH v15 06/10] iio: test: add basic tests for the iio-rescale driver Liam Beguin
2022-02-14  9:59   ` kernel test robot
2022-06-27  7:22   ` Geert Uytterhoeven
2022-06-28 17:06     ` Liam Beguin
2022-02-13  2:57 ` [PATCH v15 07/10] iio: afe: rescale: add RTD temperature sensor support Liam Beguin
2022-02-13  2:57 ` [PATCH v15 08/10] iio: afe: rescale: add temperature transducers Liam Beguin
2022-02-13  2:57 ` [PATCH v15 09/10] dt-bindings: iio: afe: add bindings for temperature-sense-rtd Liam Beguin
2022-02-13  2:57 ` [PATCH v15 10/10] dt-bindings: iio: afe: add bindings for temperature transducers Liam Beguin
2022-02-27 12:55 ` [PATCH v15 00/10] iio: afe: add temperature rescaling support Jonathan Cameron
2022-02-27 13:05   ` Jonathan Cameron
2022-02-27 13:25     ` Andy Shevchenko
2022-02-27 13:39       ` Jonathan Cameron
2022-02-28 16:45   ` Liam Beguin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.