iio: core: Introduce _zeropoint for differential channels
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 26 Jun 2022 12:29:32 +0000 (13:29 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 15 Aug 2022 21:30:01 +0000 (22:30 +0100)
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>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20220626122938.582107-12-jic23@kernel.org
Documentation/ABI/testing/sysfs-bus-iio
drivers/iio/industrialio-core.c
include/linux/iio/types.h

index 979f2e2b44f66d2110e237f36cf104c4b8a1f6b2..80e8a38d1ee2f633737a5e2f78c262a96a5d94af 100644 (file)
@@ -207,6 +207,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: 6.1
+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
index 40ebc63b7919bbd724baa54e8549e2af31ccd804..67d3d01d2dacc8ff2a0c79d838734fb0d6b66241 100644 (file)
@@ -168,6 +168,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
index a7aa91f3a8dc7c161093f79e2cce34acacb49751..27143b03909d0e31340b8c0dad901466dbf28234 100644 (file)
@@ -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_ */