mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
iio: afe: rescale: Accept only offset channels
commitbee448390eupstream. As noted by Jonathan Cameron: it is perfectly legal for a channel to have an offset but no scale in addition to the raw interface. The conversion will imply that scale is 1:1. Make rescale_configure_channel() accept just scale, or just offset to process a channel. When a user asks for IIO_CHAN_INFO_OFFSET in rescale_read_raw() we now have to deal with the fact that OFFSET could be present but SCALE missing. Add code to simply scale 1:1 in this case. Link: https://lore.kernel.org/linux-iio/CACRpkdZXBjHU4t-GVOCFxRO-AHGxKnxMeHD2s4Y4PuC29gBq6g@mail.gmail.com/ Fixes:53ebee9499("iio: afe: iio-rescale: Support processed channels") Fixes:9decacd8b3("iio: afe: rescale: Fix boolean logic bug") Reported-by: Jonathan Cameron <jic23@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Peter Rosin <peda@axentia.se> Link: https://lore.kernel.org/r/20230902-iio-rescale-only-offset-v2-1-988b807754c8@linaro.org Cc: <Stable@vger.kernel.org> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
9236d2ea64
commit
7a641bc52f
@@ -214,8 +214,18 @@ static int rescale_read_raw(struct iio_dev *indio_dev,
|
|||||||
return ret < 0 ? ret : -EOPNOTSUPP;
|
return ret < 0 ? ret : -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = iio_read_channel_scale(rescale->source, &scale, &scale2);
|
if (iio_channel_has_info(rescale->source->channel,
|
||||||
return rescale_process_offset(rescale, ret, scale, scale2,
|
IIO_CHAN_INFO_SCALE)) {
|
||||||
|
ret = iio_read_channel_scale(rescale->source, &scale, &scale2);
|
||||||
|
return rescale_process_offset(rescale, ret, scale, scale2,
|
||||||
|
schan_off, val, val2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we get here we have no scale so scale 1:1 but apply
|
||||||
|
* rescaler and offset, if any.
|
||||||
|
*/
|
||||||
|
return rescale_process_offset(rescale, IIO_VAL_FRACTIONAL, 1, 1,
|
||||||
schan_off, val, val2);
|
schan_off, val, val2);
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -280,8 +290,9 @@ static int rescale_configure_channel(struct device *dev,
|
|||||||
chan->type = rescale->cfg->type;
|
chan->type = rescale->cfg->type;
|
||||||
|
|
||||||
if (iio_channel_has_info(schan, IIO_CHAN_INFO_RAW) &&
|
if (iio_channel_has_info(schan, IIO_CHAN_INFO_RAW) &&
|
||||||
iio_channel_has_info(schan, IIO_CHAN_INFO_SCALE)) {
|
(iio_channel_has_info(schan, IIO_CHAN_INFO_SCALE) ||
|
||||||
dev_info(dev, "using raw+scale source channel\n");
|
iio_channel_has_info(schan, IIO_CHAN_INFO_OFFSET))) {
|
||||||
|
dev_info(dev, "using raw+scale/offset source channel\n");
|
||||||
} else if (iio_channel_has_info(schan, IIO_CHAN_INFO_PROCESSED)) {
|
} else if (iio_channel_has_info(schan, IIO_CHAN_INFO_PROCESSED)) {
|
||||||
dev_info(dev, "using processed channel\n");
|
dev_info(dev, "using processed channel\n");
|
||||||
rescale->chan_processed = true;
|
rescale->chan_processed = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user