Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iio: adc: ad7606: move 'val' pointer to ad7606_scan_direct()

The ad7606_scan_direct() function returns 'int', which is fine for 16-bit
samples.
But when going to 18-bit samples, these need to be implemented as 32-bit
(or int) type.

In that case when getting samples (which can be negative), we'd get random
error codes.
So, the easiest thing is to just move the 'val' pointer to
'ad7606_scan_direct()'. This doesn't qualify as a fix, it's just a
preparation for 18-bit ADCs (of the AD7606 family).

Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Alexandru Ardelean <aardelean@baylibre.com>
Link: https://patch.msgid.link/20240919130444.2100447-3-aardelean@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Alexandru Ardelean and committed by
Jonathan Cameron
d2041446 300a90a6

+7 -5
+7 -5
drivers/iio/adc/ad7606.c
··· 114 114 return IRQ_HANDLED; 115 115 } 116 116 117 - static int ad7606_scan_direct(struct iio_dev *indio_dev, unsigned int ch) 117 + static int ad7606_scan_direct(struct iio_dev *indio_dev, unsigned int ch, 118 + int *val) 118 119 { 119 120 struct ad7606_state *st = iio_priv(indio_dev); 120 121 int ret; ··· 129 128 } 130 129 131 130 ret = ad7606_read_samples(st); 132 - if (ret == 0) 133 - ret = st->data[ch]; 131 + if (ret) 132 + goto error_ret; 133 + 134 + *val = sign_extend32(st->data[ch], 15); 134 135 135 136 error_ret: 136 137 gpiod_set_value(st->gpio_convst, 0); ··· 152 149 switch (m) { 153 150 case IIO_CHAN_INFO_RAW: 154 151 iio_device_claim_direct_scoped(return -EBUSY, indio_dev) { 155 - ret = ad7606_scan_direct(indio_dev, chan->address); 152 + ret = ad7606_scan_direct(indio_dev, chan->address, val); 156 153 if (ret < 0) 157 154 return ret; 158 - *val = (short) ret; 159 155 return IIO_VAL_INT; 160 156 } 161 157 unreachable();