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
parent
cec1aec9c4
commit
05f958d003
|
|
@ -726,20 +726,19 @@ int iio_read_channel_processed_scale(struct iio_channel *chan, int *val,
|
|||
unsigned int scale)
|
||||
{
|
||||
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);
|
||||
if (!chan->indio_dev->info)
|
||||
return -ENODEV;
|
||||
|
||||
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);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val *= scale;
|
||||
|
||||
return ret;
|
||||
return iio_multiply_value(val, scale, ret, pval, pval2);
|
||||
} else {
|
||||
ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW);
|
||||
if (ret < 0)
|
||||
|
|
|
|||
Loading…
Reference in New Issue