iio:core: fix IIO_VAL_FRACTIONAL sign handling

7985e7c100 ("iio: Introduce a new fractional value type") introduced a
new IIO_VAL_FRACTIONAL value type meant to represent rational type numbers
expressed by a numerator and denominator combination.

Formating of IIO_VAL_FRACTIONAL values relies upon do_div() usage. This
fails handling negative values properly since parameters are reevaluated
as unsigned values.
Fix this by using div_s64_rem() instead. Computed integer part will carry
properly signed value. Formatted fractional part will always be positive.

Fixes: 7985e7c100 ("iio: Introduce a new fractional value type")
Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
Reviewed-by: Lars-Peter Clausen <lars@metafoo.de>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by Gregor Boirie and committed by Jonathan Cameron 171c0091 5dba4b14

Changed files
+2 -3
drivers
+2 -3
drivers/iio/industrialio-core.c
··· 613 613 return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); 614 614 case IIO_VAL_FRACTIONAL: 615 615 tmp = div_s64((s64)vals[0] * 1000000000LL, vals[1]); 616 - vals[1] = do_div(tmp, 1000000000LL); 617 - vals[0] = tmp; 618 - return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); 616 + vals[0] = (int)div_s64_rem(tmp, 1000000000, &vals[1]); 617 + return sprintf(buf, "%d.%09u\n", vals[0], abs(vals[1])); 619 618 case IIO_VAL_FRACTIONAL_LOG2: 620 619 tmp = (s64)vals[0] * 1000000000LL >> vals[1]; 621 620 vals[1] = do_div(tmp, 1000000000LL);