lkml.org 
[lkml]   [2021]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 03/14] iio: inkern: make a best effort on offset calculation
    Date
    From: Liam Beguin <lvb@xiphos.com>

    iio_convert_raw_to_processed_unlocked() assumes the offset is an
    integer. Make a best effort to get a valid offset value for fractional
    cases without breaking implicit truncations.

    Fixes: 48e44ce0f881 ("iio:inkern: Add function to read the processed value")
    Signed-off-by: Liam Beguin <lvb@xiphos.com>
    ---
    drivers/iio/inkern.c | 32 +++++++++++++++++++++++++++-----
    1 file changed, 27 insertions(+), 5 deletions(-)

    diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c
    index b69027690ed5..5e74d8983874 100644
    --- a/drivers/iio/inkern.c
    +++ b/drivers/iio/inkern.c
    @@ -578,13 +578,35 @@ EXPORT_SYMBOL_GPL(iio_read_channel_average_raw);
    static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan,
    int raw, int *processed, unsigned int scale)
    {
    - int scale_type, scale_val, scale_val2, offset;
    + int scale_type, scale_val, scale_val2;
    + int offset_type, offset_val, offset_val2;
    s64 raw64 = raw;
    - int ret;

    - ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_OFFSET);
    - if (ret >= 0)
    - raw64 += offset;
    + offset_type = iio_channel_read(chan, &offset_val, &offset_val2,
    + IIO_CHAN_INFO_OFFSET);
    + if (offset_type >= 0) {
    + switch (offset_type) {
    + case IIO_VAL_INT:
    + break;
    + case IIO_VAL_INT_PLUS_MICRO:
    + case IIO_VAL_INT_PLUS_NANO:
    + /*
    + * Both IIO_VAL_INT_PLUS_MICRO and IIO_VAL_INT_PLUS_NANO
    + * implicitely truncate the offset to it's integer form.
    + */
    + break;
    + case IIO_VAL_FRACTIONAL:
    + offset_val /= offset_val2;
    + break;
    + case IIO_VAL_FRACTIONAL_LOG2:
    + offset_val /= (1 << offset_val2);
    + break;
    + default:
    + return -EINVAL;
    + }
    +
    + raw64 += offset_val;
    + }

    scale_type = iio_channel_read(chan, &scale_val, &scale_val2,
    IIO_CHAN_INFO_SCALE);
    --
    2.32.0.452.g940fe202adcb
    \
     
     \ /
      Last update: 2021-08-20 21:18    [W:3.502 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site