Thread (20 messages) 20 messages, 3 authors, 2021-07-13

Re: [PATCH v4 05/10] iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support

From: Peter Rosin <hidden>
Date: 2021-07-10 08:14:31
Also in: linux-iio, lkml


On 2021-07-09 21:30, Liam Beguin wrote:
On Fri Jul 9, 2021 at 12:29 PM EDT, Peter Rosin wrote:
quoted

On 2021-07-06 18:09, Liam Beguin wrote:
quoted
From: Liam Beguin <redacted>

Add IIO_VAL_INT_PLUS_{NANO,MICRO} scaling support.
Scale the integer part and the decimal parts individually and keep the
original scaling type.

Signed-off-by: Liam Beguin <redacted>
---
 drivers/iio/afe/iio-rescale.c | 8 ++++++++
 1 file changed, 8 insertions(+)
diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
index ba3bdcc69b16..1d0e24145d87 100644
--- a/drivers/iio/afe/iio-rescale.c
+++ b/drivers/iio/afe/iio-rescale.c
@@ -89,7 +89,15 @@ static int rescale_read_raw(struct iio_dev *indio_dev,
 			do_div(tmp, 1000000000LL);
 			*val = tmp;
 			return ret;
+		case IIO_VAL_INT_PLUS_NANO:
+		case IIO_VAL_INT_PLUS_MICRO:
+			tmp = (s64)*val * rescale->numerator;
+			*val = div_s64(tmp, rescale->denominator);
+			tmp = (s64)*val2 * rescale->numerator;
+			*val2 = div_s64(tmp, rescale->denominator);
Hi Peter,
quoted
Hi!

You are losing precision, and you are not mormalising after the
calculation.
Can you elaborate a little on what you mean here?

Do you mean that I should make sure that *val2, the PLUS_{NANO,MICRO}
part, doesn't contain an integer part? And if so transfer that part back
to *val?
Yes. On 32-bit, you will easily wrap, especially for PLUS_NANO. You'd
only need a scale factor of 10 or so and a fractional part above .5 to
hit the roof (10 * 500000000 > 2^32).

But I also mean that you are losing precision when you are scaling
the integer part and the fractional part separately. That deserves
at least a comment, but ideally it should be handled correctly.
quoted
I think it's better to not even attempt this given that the results can
be
really poor.
Unfortunatelly, I'm kinda stuck with this as some of my ADC use these
types.
Ok. Crap. :-)

Cheers,
Peter
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help