On Thu, 20 Aug 2020 11:09:44 -0700
Anand Ashok Dumbre <[email protected]> wrote:

> This patch fixes IIO_VAL_FRACTIONAL calculation for negative
> values where the exponent is 0.
> 
> Signed-off-by: Anand Ashok Dumbre <[email protected]>
Hi,

I would thrown in an example for this description. 
Also useful to know if there is a existing driver that is broken
and hence we need to backport this.
If that is the case, please try to figure out an appropriate fixes
tag.

Comments inline + the email footer issue needs sorting out.

Thanks,

Jonathan

> ---
>  drivers/iio/industrialio-core.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
> index f72c2dc..cd43b17 100644
> --- a/drivers/iio/industrialio-core.c
> +++ b/drivers/iio/industrialio-core.c
> @@ -554,6 +554,7 @@ static ssize_t __iio_format_value(char *buf, size_t len, 
> unsigned int type,
>  {
>         unsigned long long tmp;
>         int tmp0, tmp1;
> +       s64 tmp2;
>         bool scale_db = false;
> 
>         switch (type) {
> @@ -576,10 +577,13 @@ static ssize_t __iio_format_value(char *buf, size_t 
> len, unsigned int type,
>                 else
>                         return snprintf(buf, len, "%d.%09u", vals[0], 
> vals[1]);
>         case IIO_VAL_FRACTIONAL:
> -               tmp = div_s64((s64)vals[0] * 1000000000LL, vals[1]);
> +               tmp2 = div_s64((s64)vals[0] * 1000000000LL, vals[1]);
>                 tmp1 = vals[1];
> -               tmp0 = (int)div_s64_rem(tmp, 1000000000, &tmp1);
> -               return snprintf(buf, len, "%d.%09u", tmp0, abs(tmp1));
> +               tmp0 = (int)div_s64_rem(tmp2, 1000000000, &tmp1);
> +               if ((tmp2 < 0) && (tmp0 == 0))
> +                       return snprintf(buf, len, "-%d.%09u", tmp0, 
> abs(tmp1));

Given tmp0 == 0, this might be clearer as
                          return snprintf(buf, len, "-0.%09u", abs(tmp1));

> +               else
> +                       return snprintf(buf, len, "%d.%09u", tmp0, abs(tmp1));
>         case IIO_VAL_FRACTIONAL_LOG2:
>                 tmp = shift_right((s64)vals[0] * 1000000000LL, vals[1]);
>                 tmp0 = (int)div_s64_rem(tmp, 1000000000LL, &tmp1);
> --
> 2.7.4
> 
> This email and any attachments are intended for the sole use of the named 
> recipient(s) and contain(s) confidential information that may be proprietary, 
> privileged or copyrighted under applicable law. If you are not the intended 
> recipient, do not read, copy, or forward this email message or any 
> attachments. Delete this email message and any attachments immediately.

As Andy said, this footer is a problem...  

Reply via email to