iio: Improve iio_read_channel_processed_scale() precision

Before this change iio_read_channel_processed_scale() always assumes that
channels which advertise IIO_CHAN_INFO_PROCESSED capability return
IIO_VAL_INT on success.

Ignoring any fractional values from drivers which return
IIO_VAL_INT_PLUS_MICRO / IIO_VAL_INT_PLUS_NANO. These fractional values
might become non fractional after scaling so these should be taken into
account for better precision.

Use the new iio_multiply_value() helper to do proper scaling taking
the fractionional values into account.

Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Hans de Goede <hansg@kernel.org>
Link: https://patch.msgid.link/20250831104825.15097-5-hansg@kernel.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
pull/1354/merge
Hans de Goede 2025-08-31 12:48:23 +02:00 committed by Jonathan Cameron
parent cec1aec9c4
commit 05f958d003
1 changed files with 3 additions and 4 deletions

View File

@ -726,20 +726,19 @@ int iio_read_channel_processed_scale(struct iio_channel *chan, int *val,
unsigned int scale) unsigned int scale)
{ {
struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
int ret; int ret, pval, pval2;
guard(mutex)(&iio_dev_opaque->info_exist_lock); guard(mutex)(&iio_dev_opaque->info_exist_lock);
if (!chan->indio_dev->info) if (!chan->indio_dev->info)
return -ENODEV; return -ENODEV;
if (iio_channel_has_info(chan->channel, IIO_CHAN_INFO_PROCESSED)) { if (iio_channel_has_info(chan->channel, IIO_CHAN_INFO_PROCESSED)) {
ret = iio_channel_read(chan, val, NULL, ret = iio_channel_read(chan, &pval, &pval2,
IIO_CHAN_INFO_PROCESSED); IIO_CHAN_INFO_PROCESSED);
if (ret < 0) if (ret < 0)
return ret; return ret;
*val *= scale;
return ret; return iio_multiply_value(val, scale, ret, pval, pval2);
} else { } else {
ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW); ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW);
if (ret < 0) if (ret < 0)