diff mbox series

[v3,11/17] iio: core: Introduce _zeropoint for differential channels

Message ID 20220626122938.582107-12-jic23@kernel.org (mailing list archive)
State Accepted
Headers show
Series [v3,01/17] iio: core: Increase precision of IIO_VAL_FRACTIONAL_LOG2 when possible | expand

Commit Message

Jonathan Cameron June 26, 2022, 12:29 p.m. UTC
From: Jonathan Cameron <Jonathan.Cameron@huawei.com>

Address an ABI gap for device where the offset of both lines in a
differential pair may be controlled so as to allow a wider range of
inputs, but without having any direct effect of the differential
measurement.

_offset cannot be used as to remain in line with existing usage,
userspace would be expected to apply it as (_raw + _offset) * _scale
whereas _zeropoint is not. i.e. If we were computing the differential
in software it would be.
((postive_raw + _zeropoint) - (negative_raw + zeropoint) + _offset) * _scale
= ((postive_raw - negative_raw) + _offset) * _scale
= (differential_raw + _offset) * _scale

Similarly calibbias is expected to tweak the measurement seen, not
the adjust the two lines of the differential pair.

Needed for in_capacitanceX-capacitanceY_zeropoint for the
AD7746 CDC driver.

Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
---
 Documentation/ABI/testing/sysfs-bus-iio | 19 +++++++++++++++++++
 drivers/iio/industrialio-core.c         |  1 +
 include/linux/iio/types.h               |  1 +
 3 files changed, 21 insertions(+)

Comments

Andy Shevchenko June 28, 2022, 12:17 p.m. UTC | #1
On Sun, Jun 26, 2022 at 2:20 PM Jonathan Cameron <jic23@kernel.org> wrote:
>
> From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
>
> Address an ABI gap for device where the offset of both lines in a
> differential pair may be controlled so as to allow a wider range of
> inputs, but without having any direct effect of the differential
> measurement.
>
> _offset cannot be used as to remain in line with existing usage,
> userspace would be expected to apply it as (_raw + _offset) * _scale
> whereas _zeropoint is not. i.e. If we were computing the differential
> in software it would be.
> ((postive_raw + _zeropoint) - (negative_raw + zeropoint) + _offset) * _scale
> = ((postive_raw - negative_raw) + _offset) * _scale
> = (differential_raw + _offset) * _scale
>
> Similarly calibbias is expected to tweak the measurement seen, not
> the adjust the two lines of the differential pair.
>
> Needed for in_capacitanceX-capacitanceY_zeropoint for the
> AD7746 CDC driver.

...

> +What:          /sys/.../iio:deviceX/in_capacitanceY-capacitanceZ_zeropoint
> +KernelVersion: 5.19

5.20?

> +Contact:       linux-iio@vger.kernel.org
> +Description:
> +               For differential channels, this an offset that is applied
> +               equally to both inputs. As the reading is of the difference
> +               between the two inputs, this should not be applied to the _raw
> +               reading by userspace (unlike _offset) and unlike calibbias
> +               it does not affect the differential value measured because
> +               the effect of _zeropoint cancels out across the two inputs
> +               that make up the differential pair. It's purpose is to bring

makes

> +               the individual signals, before the differential is measured,
> +               within the measurement range of the device. The naming is
> +               chosen because if the separate inputs that make the
> +               differential pair are drawn on a graph in their
> +               _raw  units, this is the value that the zero point on the
> +               measurement axis represents. It is expressed with the
> +               same scaling as _raw.
Jonathan Cameron July 18, 2022, 6:02 p.m. UTC | #2
On Tue, 28 Jun 2022 14:17:33 +0200
Andy Shevchenko <andy.shevchenko@gmail.com> wrote:

> On Sun, Jun 26, 2022 at 2:20 PM Jonathan Cameron <jic23@kernel.org> wrote:
> >
> > From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> >
> > Address an ABI gap for device where the offset of both lines in a
> > differential pair may be controlled so as to allow a wider range of
> > inputs, but without having any direct effect of the differential
> > measurement.
> >
> > _offset cannot be used as to remain in line with existing usage,
> > userspace would be expected to apply it as (_raw + _offset) * _scale
> > whereas _zeropoint is not. i.e. If we were computing the differential
> > in software it would be.
> > ((postive_raw + _zeropoint) - (negative_raw + zeropoint) + _offset) * _scale
> > = ((postive_raw - negative_raw) + _offset) * _scale
> > = (differential_raw + _offset) * _scale
> >
> > Similarly calibbias is expected to tweak the measurement seen, not
> > the adjust the two lines of the differential pair.
> >
> > Needed for in_capacitanceX-capacitanceY_zeropoint for the
> > AD7746 CDC driver.  
> 
> ...
> 
> > +What:          /sys/.../iio:deviceX/in_capacitanceY-capacitanceZ_zeropoint
> > +KernelVersion: 5.19  
> 
> 5.20?

:) Probably 5.21 as I'm not going to rush this in now, but good point none the less.

> 
> > +Contact:       linux-iio@vger.kernel.org
> > +Description:
> > +               For differential channels, this an offset that is applied
> > +               equally to both inputs. As the reading is of the difference
> > +               between the two inputs, this should not be applied to the _raw
> > +               reading by userspace (unlike _offset) and unlike calibbias
> > +               it does not affect the differential value measured because
> > +               the effect of _zeropoint cancels out across the two inputs
> > +               that make up the differential pair. It's purpose is to bring  
> 
> makes

No.  make is correct.
That's indeed an odd corner of English and honestly I'm not sure I could successfully
argue why it should be make :)

> 
> > +               the individual signals, before the differential is measured,
> > +               within the measurement range of the device. The naming is
> > +               chosen because if the separate inputs that make the
> > +               differential pair are drawn on a graph in their
> > +               _raw  units, this is the value that the zero point on the
> > +               measurement axis represents. It is expressed with the
> > +               same scaling as _raw.  
>
Jonathan Cameron Aug. 7, 2022, 1:46 p.m. UTC | #3
On Mon, 18 Jul 2022 19:02:35 +0100
Jonathan Cameron <jic23@kernel.org> wrote:

> On Tue, 28 Jun 2022 14:17:33 +0200
> Andy Shevchenko <andy.shevchenko@gmail.com> wrote:
> 
> > On Sun, Jun 26, 2022 at 2:20 PM Jonathan Cameron <jic23@kernel.org> wrote:  
> > >
> > > From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> > >
> > > Address an ABI gap for device where the offset of both lines in a
> > > differential pair may be controlled so as to allow a wider range of
> > > inputs, but without having any direct effect of the differential
> > > measurement.
> > >
> > > _offset cannot be used as to remain in line with existing usage,
> > > userspace would be expected to apply it as (_raw + _offset) * _scale
> > > whereas _zeropoint is not. i.e. If we were computing the differential
> > > in software it would be.
> > > ((postive_raw + _zeropoint) - (negative_raw + zeropoint) + _offset) * _scale
> > > = ((postive_raw - negative_raw) + _offset) * _scale
> > > = (differential_raw + _offset) * _scale
> > >
> > > Similarly calibbias is expected to tweak the measurement seen, not
> > > the adjust the two lines of the differential pair.
> > >
> > > Needed for in_capacitanceX-capacitanceY_zeropoint for the
> > > AD7746 CDC driver.    
> > 
> > ...
> >   
> > > +What:          /sys/.../iio:deviceX/in_capacitanceY-capacitanceZ_zeropoint
> > > +KernelVersion: 5.19    
> > 
> > 5.20?  
> 
> :) Probably 5.21 as I'm not going to rush this in now, but good point none the less.
6.0 I guess :)  Anyhow I've applied this with Andy's tag on the assumption that the below
English quirk is fine by Andy.

Jonathan

> 
> >   
> > > +Contact:       linux-iio@vger.kernel.org
> > > +Description:
> > > +               For differential channels, this an offset that is applied
> > > +               equally to both inputs. As the reading is of the difference
> > > +               between the two inputs, this should not be applied to the _raw
> > > +               reading by userspace (unlike _offset) and unlike calibbias
> > > +               it does not affect the differential value measured because
> > > +               the effect of _zeropoint cancels out across the two inputs
> > > +               that make up the differential pair. It's purpose is to bring    
> > 
> > makes  
> 
> No.  make is correct.
> That's indeed an odd corner of English and honestly I'm not sure I could successfully
> argue why it should be make :)
> 
> >   
> > > +               the individual signals, before the differential is measured,
> > > +               within the measurement range of the device. The naming is
> > > +               chosen because if the separate inputs that make the
> > > +               differential pair are drawn on a graph in their
> > > +               _raw  units, this is the value that the zero point on the
> > > +               measurement axis represents. It is expressed with the
> > > +               same scaling as _raw.    
> >   
>
Jonathan Cameron Aug. 7, 2022, 1:50 p.m. UTC | #4
On Sun, 7 Aug 2022 14:46:51 +0100
Jonathan Cameron <jic23@kernel.org> wrote:

> On Mon, 18 Jul 2022 19:02:35 +0100
> Jonathan Cameron <jic23@kernel.org> wrote:
> 
> > On Tue, 28 Jun 2022 14:17:33 +0200
> > Andy Shevchenko <andy.shevchenko@gmail.com> wrote:
> >   
> > > On Sun, Jun 26, 2022 at 2:20 PM Jonathan Cameron <jic23@kernel.org> wrote:    
> > > >
> > > > From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> > > >
> > > > Address an ABI gap for device where the offset of both lines in a
> > > > differential pair may be controlled so as to allow a wider range of
> > > > inputs, but without having any direct effect of the differential
> > > > measurement.
> > > >
> > > > _offset cannot be used as to remain in line with existing usage,
> > > > userspace would be expected to apply it as (_raw + _offset) * _scale
> > > > whereas _zeropoint is not. i.e. If we were computing the differential
> > > > in software it would be.
> > > > ((postive_raw + _zeropoint) - (negative_raw + zeropoint) + _offset) * _scale
> > > > = ((postive_raw - negative_raw) + _offset) * _scale
> > > > = (differential_raw + _offset) * _scale
> > > >
> > > > Similarly calibbias is expected to tweak the measurement seen, not
> > > > the adjust the two lines of the differential pair.
> > > >
> > > > Needed for in_capacitanceX-capacitanceY_zeropoint for the
> > > > AD7746 CDC driver.      
> > > 
> > > ...
> > >     
> > > > +What:          /sys/.../iio:deviceX/in_capacitanceY-capacitanceZ_zeropoint
> > > > +KernelVersion: 5.19      
> > > 
> > > 5.20?    
> > 
> > :) Probably 5.21 as I'm not going to rush this in now, but good point none the less.  
> 6.0 I guess :)  Anyhow I've applied this with Andy's tag on the assumption that the below
> English quirk is fine by Andy.
6.1.  As sounds like Linus will tag this merge window as 6.0 and this is being queued for the
next one. oops.
> 
> Jonathan
> 
> >   
> > >     
> > > > +Contact:       linux-iio@vger.kernel.org
> > > > +Description:
> > > > +               For differential channels, this an offset that is applied
> > > > +               equally to both inputs. As the reading is of the difference
> > > > +               between the two inputs, this should not be applied to the _raw
> > > > +               reading by userspace (unlike _offset) and unlike calibbias
> > > > +               it does not affect the differential value measured because
> > > > +               the effect of _zeropoint cancels out across the two inputs
> > > > +               that make up the differential pair. It's purpose is to bring      
> > > 
> > > makes    
> > 
> > No.  make is correct.
> > That's indeed an odd corner of English and honestly I'm not sure I could successfully
> > argue why it should be make :)
> >   
> > >     
> > > > +               the individual signals, before the differential is measured,
> > > > +               within the measurement range of the device. The naming is
> > > > +               chosen because if the separate inputs that make the
> > > > +               differential pair are drawn on a graph in their
> > > > +               _raw  units, this is the value that the zero point on the
> > > > +               measurement axis represents. It is expressed with the
> > > > +               same scaling as _raw.      
> > >     
> >   
>
diff mbox series

Patch

diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio
index d3a0c0ef8948..1dfd6c3f2bd0 100644
--- a/Documentation/ABI/testing/sysfs-bus-iio
+++ b/Documentation/ABI/testing/sysfs-bus-iio
@@ -204,6 +204,25 @@  Description:
 		is required is a consistent labeling.  Units after application
 		of scale and offset are nanofarads.
 
+What:		/sys/.../iio:deviceX/in_capacitanceY-capacitanceZ_zeropoint
+KernelVersion:	5.19
+Contact:	linux-iio@vger.kernel.org
+Description:
+		For differential channels, this an offset that is applied
+		equally to both inputs. As the reading is of the difference
+		between the two inputs, this should not be applied to the _raw
+		reading by userspace (unlike _offset) and unlike calibbias
+		it does not affect the differential value measured because
+		the effect of _zeropoint cancels out across the two inputs
+		that make up the differential pair. It's purpose is to bring
+		the individual signals, before the differential is measured,
+		within the measurement range of the device. The naming is
+		chosen because if the separate inputs that make the
+		differential pair are drawn on a graph in their
+		_raw  units, this is the value that the zero point on the
+		measurement axis represents. It is expressed with the
+		same scaling as _raw.
+
 What:		/sys/bus/iio/devices/iio:deviceX/in_temp_raw
 What:		/sys/bus/iio/devices/iio:deviceX/in_tempX_raw
 What:		/sys/bus/iio/devices/iio:deviceX/in_temp_x_raw
diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index 8225d0c43010..fbd7d6bd6f98 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -169,6 +169,7 @@  static const char * const iio_chan_info_postfix[] = {
 	[IIO_CHAN_INFO_OVERSAMPLING_RATIO] = "oversampling_ratio",
 	[IIO_CHAN_INFO_THERMOCOUPLE_TYPE] = "thermocouple_type",
 	[IIO_CHAN_INFO_CALIBAMBIENT] = "calibambient",
+	[IIO_CHAN_INFO_ZEROPOINT] = "zeropoint",
 };
 /**
  * iio_device_id() - query the unique ID for the device
diff --git a/include/linux/iio/types.h b/include/linux/iio/types.h
index a7aa91f3a8dc..27143b03909d 100644
--- a/include/linux/iio/types.h
+++ b/include/linux/iio/types.h
@@ -63,6 +63,7 @@  enum iio_chan_info_enum {
 	IIO_CHAN_INFO_OVERSAMPLING_RATIO,
 	IIO_CHAN_INFO_THERMOCOUPLE_TYPE,
 	IIO_CHAN_INFO_CALIBAMBIENT,
+	IIO_CHAN_INFO_ZEROPOINT,
 };
 
 #endif /* _IIO_TYPES_H_ */