From: Xu Rao The LTC2473 reports its differential conversion result as an unsigned 16-bit value spanning -VREF to +VREF. The IIO scale is consequently reported as 2 * VREF divided by 2^16. IIO offsets are expressed in raw codes, but the driver currently returns -LTC2471_VREF, which is a millivolt value. This makes the processed reading incorrect: with a 1.25 V reference, the midpoint raw code is shifted by 1250 instead of 32768 codes. Return the raw-code offset so that the midpoint maps to 0 mV and the endpoints map to -VREF and +VREF as intended. The single-ended LTC2471 does not expose the offset attribute and is unaffected. Fixes: 1d3eacbfa644 ("iio: Add LTC2471/LTC2473 driver") Cc: stable@vger.kernel.org Reviewed-by: Joshua Crofts Reviewed-by: Nuno Sá Signed-off-by: Xu Rao --- Changes in v3: - Add Reviewed-by tags from Nuno Sá and Joshua Crofts. - Move the AI assistance disclosure out of the commit message. - No code changes from v2. Changes in v2: - Replace the raw -32768 literal with the named LTC2473_DIFF_OFFSET macro. The supplied fix was reviewed and this commit message prepared with OpenCode AI assistance. drivers/iio/adc/ltc2471.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/iio/adc/ltc2471.c b/drivers/iio/adc/ltc2471.c index 369af700969f..eb418c0fa732 100644 --- a/drivers/iio/adc/ltc2471.c +++ b/drivers/iio/adc/ltc2471.c @@ -25,6 +25,7 @@ struct ltc2471_data { /* Reference voltage is 1.25V */ #define LTC2471_VREF 1250 +#define LTC2473_DIFF_OFFSET (-32768) /* Read two bytes from the I2C bus to obtain the ADC result */ static int ltc2471_get_value(struct i2c_client *client) @@ -69,7 +70,7 @@ static int ltc2471_read_raw(struct iio_dev *indio_dev, case IIO_CHAN_INFO_OFFSET: /* Only differential chip has this property */ - *val = -LTC2471_VREF; + *val = LTC2473_DIFF_OFFSET; return IIO_VAL_INT; default: -- 2.50.1