iio: adc: ad7606: use realbits for sign-extending in scan_direct

Currently the 'ad7606' driver supports parts with 18 and 16 bits
resolutions.
But when adding support for AD7607 (which has a 14-bit resolution) we
should check for the 'realbits' field, to be able to sign-extend correctly.

Signed-off-by: Alexandru Ardelean <aardelean@baylibre.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20241025095939.271811-3-aardelean@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
Alexandru Ardelean 2024-10-25 12:59:36 +03:00 committed by Jonathan Cameron
parent 8456a9f072
commit 0fb11344bb

View File

@ -568,7 +568,7 @@ static int ad7606_scan_direct(struct iio_dev *indio_dev, unsigned int ch,
int *val)
{
struct ad7606_state *st = iio_priv(indio_dev);
unsigned int storagebits = st->chip_info->channels[1].scan_type.storagebits;
unsigned int realbits = st->chip_info->channels[1].scan_type.realbits;
const struct iio_chan_spec *chan;
int ret;
@ -603,15 +603,15 @@ static int ad7606_scan_direct(struct iio_dev *indio_dev, unsigned int ch,
chan = &indio_dev->channels[ch + 1];
if (chan->scan_type.sign == 'u') {
if (storagebits > 16)
if (realbits > 16)
*val = st->data.buf32[ch];
else
*val = st->data.buf16[ch];
} else {
if (storagebits > 16)
*val = sign_extend32(st->data.buf32[ch], 17);
if (realbits > 16)
*val = sign_extend32(st->data.buf32[ch], realbits - 1);
else
*val = sign_extend32(st->data.buf16[ch], 15);
*val = sign_extend32(st->data.buf16[ch], realbits - 1);
}
error_ret: