Re: [PATCH v15 00/10] iio: afe: add temperature rescaling support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, 12 Feb 2022 21:57:29 -0500
Liam Beguin <liambeguin@xxxxxxxxx> 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@xxxxxxxxx>
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@xxxxxxxxxx>
>      
>       ## 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




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux