summaryrefslogtreecommitdiff
path: root/drivers/iio
diff options
context:
space:
mode:
authorCong Nguyen <congnt264@gmail.com>2026-08-10 23:44:46 +0700
committerJonathan Cameron <jonathan.cameron@oss.qualcomm.com>2026-08-31 00:52:40 +0100
commit91908c0a78baddc8572aa3ab69e62ee2eb496ba4 (patch)
tree2d79fac4dfc97dbb05bf8ed9cbee8d67d2547860 /drivers/iio
parentfafefa925ed7ec10383d9bf0378abf878b7f13cb (diff)
iio: adc: max1363: sign-extend bipolar differential channel reads
MAX1363 differential channels are bipolar, but max1363_read_single_chan() masks the raw value to the ADC resolution without sign-extending it. Negative differential readings are therefore reported to userspace as large positive values (e.g. -1 as 4095 on a 12-bit part). Sign-extend the masked value from the resolution bit for differential channels. Single-ended channels are unipolar and are left unchanged. Fixes: d1325cf45077 ("Staging: IIO: max1363 ADC driver") Cc: stable@vger.kernel.org Assisted-by: Claude:claude-opus-4 Signed-off-by: Cong Nguyen <congnt264@gmail.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com> Signed-off-by: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
Diffstat (limited to 'drivers/iio')
-rw-r--r--drivers/iio/adc/max1363.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/iio/adc/max1363.c b/drivers/iio/adc/max1363.c
index 65a2d92bb112..629c53af6472 100644
--- a/drivers/iio/adc/max1363.c
+++ b/drivers/iio/adc/max1363.c
@@ -404,6 +404,14 @@ static int max1363_read_single_chan(struct iio_dev *indio_dev,
data = rxbuf[0];
}
+
+ /*
+ * Differential channels are bipolar and the device returns the sample
+ * in two's complement, so sign-extend it from the resolution bit.
+ */
+ if (chan->differential)
+ data = sign_extend32(data, st->chip_info->bits - 1);
+
*val = data;
return 0;