In case the result is -0.3252 tmp0 is 0 after the div_s64_rem, so tmp0 is
non-negative which results in an output of 0.3252.
Fix this by explicitly handling the negative sign ourselves.

Signed-off-by: Alexander Stein <alexander.st...@systec-electronic.com>
---
Changes in v2:
* Support vals[0] >= and vals[1] < 0 in IIO_VAL_FRACTIONAL
* Note: IIO_VAL_FRACTIONAL is untested, as I lack hardware
* Note2: Currently IIO_VAL_FRACTIONAL is only called with vals[1] from
         in-kernel drivers AFAICS

 drivers/iio/industrialio-core.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index 245b5844028d..247338142c87 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -568,6 +568,7 @@ static ssize_t __iio_format_value(char *buf, size_t len, 
unsigned int type,
 {
        unsigned long long tmp;
        int tmp0, tmp1;
+       char *sign;
        bool scale_db = false;
 
        switch (type) {
@@ -593,11 +594,17 @@ static ssize_t __iio_format_value(char *buf, size_t len, 
unsigned int type,
                tmp = 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));
+               if (vals[1] < 0) {
+                       sign = vals[0] >= 0 ? "-" : "";
+               } else {
+                       sign = vals[0] < 0 ? "-" : "";
+               }
+               return snprintf(buf, len, "%s%u.%09u", sign, abs(tmp0), 
abs(tmp1));
        case IIO_VAL_FRACTIONAL_LOG2:
+               sign = vals[0] < 0 ? "-" : "";
                tmp = shift_right((s64)vals[0] * 1000000000LL, vals[1]);
                tmp0 = (int)div_s64_rem(tmp, 1000000000LL, &tmp1);
-               return snprintf(buf, len, "%d.%09u", tmp0, abs(tmp1));
+               return snprintf(buf, len, "%s%u.%09u", sign, abs(tmp0), 
abs(tmp1));
        case IIO_VAL_INT_MULTIPLE:
        {
                int i;
-- 
2.23.0

Reply via email to