Messages in this thread | | | Date | Tue, 21 Jul 2020 01:16:55 +0200 | From | Paul Cercueil <> | Subject | Re: [PATCH 2/2] iio: afe: rescale: Implement write_raw |
| |
Hi Jonathan,
Le sam. 15 févr. 2020 à 18:32, Jonathan Cameron <jic23@kernel.org> a écrit : > On Mon, 10 Feb 2020 19:54:38 -0300 > Paul Cercueil <paul@crapouillou.net> wrote: > >> Implement write_raw by converting the value if writing the scale, or >> just calling the managed channel driver's write_raw otherwise. >> >> Signed-off-by: Paul Cercueil <paul@crapouillou.net> >> --- >> drivers/iio/afe/iio-rescale.c | 22 ++++++++++++++++++++++ >> 1 file changed, 22 insertions(+) >> >> diff --git a/drivers/iio/afe/iio-rescale.c >> b/drivers/iio/afe/iio-rescale.c >> index 95802d9ee25e..a48f6af9316d 100644 >> --- a/drivers/iio/afe/iio-rescale.c >> +++ b/drivers/iio/afe/iio-rescale.c >> @@ -35,6 +35,27 @@ struct rescale { >> int *scale_data; >> }; >> >> +static int rescale_write_raw(struct iio_dev *indio_dev, >> + struct iio_chan_spec const *chan, >> + int val, int val2, long mask) >> +{ >> + struct rescale *rescale = iio_priv(indio_dev); >> + unsigned long long tmp; >> + >> + switch (mask) { >> + case IIO_CHAN_INFO_SCALE: >> + tmp = val * 1000000000LL; >> + do_div(tmp, rescale->numerator); >> + tmp *= rescale->denominator; >> + do_div(tmp, 1000000000LL); >> + return iio_write_channel_attribute(rescale->source, tmp, 0, >> + IIO_CHAN_INFO_SCALE); > > Why is val2 always 0? Won't that only work if the backend device > has integer scales?
Sorry, somehow I didn't see your answer.
Indeed, this will only work if the backend device has integer scales, but what should I do? Just pass 'val2' instead of 0? Will the value be correct if I only apply the scale ratio to 'val'?
Cheers, -Paul
>> + default: >> + return iio_write_channel_attribute(rescale->source, >> + val, val2, mask); >> + } >> +} >> + >> static int rescale_convert(struct rescale *rescale, int type, >> const int val, const int val2, >> int *val_out, int *val2_out) >> @@ -110,6 +131,7 @@ static int rescale_read_avail(struct iio_dev >> *indio_dev, >> } >> >> static const struct iio_info rescale_info = { >> + .write_raw = rescale_write_raw, >> .read_raw = rescale_read_raw, >> .read_avail = rescale_read_avail, >> }; >
| |