lkml.org 
[lkml]   [2021]   [Dec]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v10 05/14] iio: afe: rescale: add INT_PLUS_{MICRO,NANO} support
    Date
    From: Liam Beguin <lvb@xiphos.com>

    Some ADCs use IIO_VAL_INT_PLUS_{NANO,MICRO} scale types.
    Add support for these to allow using the iio-rescaler with them.

    Signed-off-by: Liam Beguin <lvb@xiphos.com>
    ---
    drivers/iio/afe/iio-rescale.c | 35 +++++++++++++++++++++++++++++++++++
    1 file changed, 35 insertions(+)

    diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
    index d0669fd8eac5..190a83e08008 100644
    --- a/drivers/iio/afe/iio-rescale.c
    +++ b/drivers/iio/afe/iio-rescale.c
    @@ -17,11 +17,15 @@
    #include <linux/of_device.h>
    #include <linux/platform_device.h>
    #include <linux/property.h>
    +#include <linux/units.h>

    int rescale_process_scale(struct rescale *rescale, int scale_type,
    int *val, int *val2)
    {
    unsigned long long tmp;
    + s32 rem;
    + u32 mult;
    + u32 neg;

    switch (scale_type) {
    case IIO_VAL_FRACTIONAL:
    @@ -40,6 +44,37 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,
    tmp *= rescale->numerator;
    do_div(tmp, 1000000000LL);
    *val = tmp;
    + return scale_type;
    + case IIO_VAL_INT_PLUS_NANO:
    + case IIO_VAL_INT_PLUS_MICRO:
    + mult = scale_type == IIO_VAL_INT_PLUS_NANO ? NANO : MICRO;
    +
    + /*
    + * For IIO_VAL_INT_PLUS_{MICRO,NANO} scale types if either *val
    + * OR *val2 is negative the schan scale is negative, i.e.
    + * *val = 1 and *val2 = -0.5 yields -1.5 not -0.5.
    + */
    + neg = *val < 0 || *val2 < 0;
    +
    + tmp = (s64)abs(*val) * abs(rescale->numerator);
    + *val = div_s64_rem(tmp, abs(rescale->denominator), &rem);
    +
    + tmp = (s64)rem * mult + (s64)abs(*val2) * abs(rescale->numerator);
    + tmp = div_s64(tmp, abs(rescale->denominator));
    +
    + *val += div_s64_rem(tmp, mult, val2);
    +
    + /*
    + * If only one of the rescaler elements or the schan scale is
    + * negative, the combined scale is negative.
    + */
    + if (neg ^ ((rescale->numerator < 0) ^ (rescale->denominator < 0))) {
    + if (*val)
    + *val = -*val;
    + else
    + *val2 = -*val2;
    + }
    +
    return scale_type;
    default:
    return -EOPNOTSUPP;
    --
    2.34.0
    \
     
     \ /
      Last update: 2021-12-19 23:40    [W:4.252 / U:1.236 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site