Commit 7985e7c1003bc5cdfa20755f8cfdada946ed8e18
Committed by
Jonathan Cameron
1 parent
ca7d1b32d2
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
iio: Introduce a new fractional value type
Currently IIO uses a decimal fixed point representations for real type numbers. This patch introduces a new representation for rational type numbers. The number will be expressed by specifying a numerator and denominator. For converting a raw value to a processed value multiply it by the numerator and divide it by the denominator. The reasoning for introducing this new type is that for a lot of devices the scale can be represented easily by a fractional number, but it is not possible to represent it as fixed point number without rounding. E.g. for a simple DAC the scale is often the reference voltage divided by the number of possible values (Usually 2**n_bits - 1). Each driver currently implements the conversion of this fraction to a fixed point number on its own. Also when it comes to the in-kernel interface this allows to directly use the fractional factors to convert a raw value to a processed value. This should on one hand require less instructions and on the other hand increase the precision. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Showing 2 changed files with 7 additions and 0 deletions Side-by-side Diff
drivers/iio/industrialio-core.c
... | ... | @@ -366,6 +366,7 @@ |
366 | 366 | { |
367 | 367 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); |
368 | 368 | struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); |
369 | + unsigned long long tmp; | |
369 | 370 | int val, val2; |
370 | 371 | bool scale_db = false; |
371 | 372 | int ret = indio_dev->info->read_raw(indio_dev, this_attr->c, |
... | ... | @@ -391,6 +392,11 @@ |
391 | 392 | return sprintf(buf, "-%d.%09u\n", val, -val2); |
392 | 393 | else |
393 | 394 | return sprintf(buf, "%d.%09u\n", val, val2); |
395 | + case IIO_VAL_FRACTIONAL: | |
396 | + tmp = div_s64((s64)val * 1000000000LL, val2); | |
397 | + val2 = do_div(tmp, 1000000000LL); | |
398 | + val = tmp; | |
399 | + return sprintf(buf, "%d.%09u\n", val, val2); | |
394 | 400 | default: |
395 | 401 | return 0; |
396 | 402 | } |