Linux IIO development
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: linux-iio@vger.kernel.org
Cc: Andy Shevchenko <andy.shevchenko@gmail.com>,
	Peter Rosin <peda@axentia.se>,
	Michael Hennerich <michael.hennerich@analog.com>,
	Lars-Peter Clausen <lars@metafoo.de>,
	Vincent Whitchurch <vincent.whitchurch@axis.com>,
	Jonathan Cameron <Jonathan.Cameron@huawei.com>
Subject: Re: [PATCH v3 01/17] iio: core: Increase precision of IIO_VAL_FRACTIONAL_LOG2 when possible
Date: Sun, 7 Aug 2022 14:28:02 +0100	[thread overview]
Message-ID: <20220807142802.2c094f9f@jic23-huawei> (raw)
In-Reply-To: <20220626122938.582107-2-jic23@kernel.org>

On Sun, 26 Jun 2022 13:29:22 +0100
Jonathan Cameron <jic23@kernel.org> wrote:

> From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> 
> With some high resolution sensors such as the ad7746 the build up of error
> when multiplying the _raw and _scale values together can be significant.
> Reduce this affect by providing additional resolution in both calculation
> and formatting of result. If overflow would occur with a 1e12 multiplier,
> fall back to the 1e9 used before this patch and 9 decimal places.
> 
> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
I want to leave this patch on the list a little longer on basis it may have
side effects in other drivers (hopefully not bad ones!)

However, the only patch that needs this in the series is the roadtest tests
in the final patch.  Those are obviously dependent on roadtest going upstream
so no rush their.  As such I'm going to see if I can pick up the reset of the
series (2-16 - minor mods as per Andy's comments).

Thanks,

Jonathan

> ---
>  drivers/iio/industrialio-core.c | 31 +++++++++++++++++++++++--------
>  1 file changed, 23 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
> index dc3e1cb9bfbd..8225d0c43010 100644
> --- a/drivers/iio/industrialio-core.c
> +++ b/drivers/iio/industrialio-core.c
> @@ -18,6 +18,7 @@
>  #include <linux/poll.h>
>  #include <linux/property.h>
>  #include <linux/sched.h>
> +#include <linux/units.h>
>  #include <linux/wait.h>
>  #include <linux/cdev.h>
>  #include <linux/slab.h>
> @@ -674,14 +675,28 @@ static ssize_t __iio_format_value(char *buf, size_t offset, unsigned int type,
>  		else
>  			return sysfs_emit_at(buf, offset, "%d.%09u", tmp0,
>  					     abs(tmp1));
> -	case IIO_VAL_FRACTIONAL_LOG2:
> -		tmp2 = shift_right((s64)vals[0] * 1000000000LL, vals[1]);
> -		tmp0 = (int)div_s64_rem(tmp2, 1000000000LL, &tmp1);
> -		if (tmp0 == 0 && tmp2 < 0)
> -			return sysfs_emit_at(buf, offset, "-0.%09u", abs(tmp1));
> -		else
> -			return sysfs_emit_at(buf, offset, "%d.%09u", tmp0,
> -					     abs(tmp1));
> +	case IIO_VAL_FRACTIONAL_LOG2: {
> +		u64 t1, t2, mult;
> +		int integer, precision;
> +		bool neg = vals[0] < 0;
> +
> +		if (vals[0] > ULLONG_MAX / PICO) {
> +			mult = NANO;
> +			precision = 9;
> +		} else {
> +			mult = PICO;
> +			precision = 12;
> +		}
> +		t1 = shift_right((u64)abs(vals[0]) * mult, vals[1]);
> +		integer = (int)div64_u64_rem(t1, mult, &t2);
> +		if (integer == 0 && neg)
> +			return sysfs_emit_at(buf, offset, "-0.%0*llu",
> +					     precision, abs(t2));
> +		if (neg)
> +			integer *= -1;
> +		return sysfs_emit_at(buf, offset, "%d.%0*llu", integer,
> +				     precision, abs(t2));
> +	}
>  	case IIO_VAL_INT_MULTIPLE:
>  	{
>  		int i;


  reply	other threads:[~2022-08-07 13:17 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-26 12:29 [PATCH v3 00/17] staging/iio: Clean up AD7746 CDC driver and move from staging Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 01/17] iio: core: Increase precision of IIO_VAL_FRACTIONAL_LOG2 when possible Jonathan Cameron
2022-08-07 13:28   ` Jonathan Cameron [this message]
2022-06-26 12:29 ` [PATCH v3 02/17] iio: ABI: Fix wrong format of differential capacitance channel ABI Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 03/17] staging: iio: cdc: ad7746: Use explicit be24 handling Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 04/17] staging: iio: cdc: ad7746: Push handling of supply voltage scale to userspace Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 05/17] staging: iio: cdc: ad7746: Use local buffer for multi byte reads Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 06/17] staging: iio: cdc: ad7746: Factor out ad7746_read_channel() Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 07/17] staging: iio: cdc: ad7764: Push locking down into case statements in read/write_raw Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 08/17] staging: iio: cdc: ad7746: Break up use of chan->address and use FIELD_PREP etc Jonathan Cameron
2022-06-28 12:15   ` Andy Shevchenko
2022-08-07 13:40     ` Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 09/17] staging: iio: cdc: ad7746: Drop unused i2c_set_clientdata() Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 10/17] staging: iio: cdc: ad7746: Use _raw and _scale for temperature channels Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 11/17] iio: core: Introduce _zeropoint for differential channels Jonathan Cameron
2022-06-28 12:17   ` Andy Shevchenko
2022-07-18 18:02     ` Jonathan Cameron
2022-08-07 13:46       ` Jonathan Cameron
2022-08-07 13:50         ` Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 12/17] staging: iio: cdc: ad7746: Switch from _offset to " Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 13/17] staging: iio: cdc: ad7746: Use read_avail() rather than opencoding Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 14/17] staging: iio: ad7746: White space cleanup Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 15/17] iio: cdc: ad7746: Add device specific ABI documentation Jonathan Cameron
2022-06-28 12:19   ` Andy Shevchenko
2022-06-26 12:29 ` [PATCH v3 16/17] iio: cdc: ad7746: Move driver out of staging Jonathan Cameron
2022-06-26 12:29 ` [PATCH v3 17/17] RFC: iio: cdc: ad7746: Add roadtest Jonathan Cameron
2022-06-28 12:21 ` [PATCH v3 00/17] staging/iio: Clean up AD7746 CDC driver and move from staging Andy Shevchenko
2022-08-07 14:06   ` Jonathan Cameron

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220807142802.2c094f9f@jic23-huawei \
    --to=jic23@kernel.org \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=lars@metafoo.de \
    --cc=linux-iio@vger.kernel.org \
    --cc=michael.hennerich@analog.com \
    --cc=peda@axentia.se \
    --cc=vincent.whitchurch@axis.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox