mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 10:43:43 +00:00
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:
parent
8456a9f072
commit
0fb11344bb
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user