From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757152AbdCXM5M (ORCPT ); Fri, 24 Mar 2017 08:57:12 -0400 Received: from mail.avionic-design.de ([87.253.173.79]:28929 "EHLO mail.avionic-design.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751663AbdCXM5G (ORCPT ); Fri, 24 Mar 2017 08:57:06 -0400 X-Greylist: delayed 906 seconds by postgrey-1.27 at vger.kernel.org; Fri, 24 Mar 2017 08:57:05 EDT From: Nikolaus Schulz To: Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , "open list:IIO SUBSYSTEM AND DRIVERS" , open list CC: Nikolaus Schulz , Subject: [PATCH] iio: core: Fix IIO_VAL_FRACTIONAL_LOG2 for negative values Date: Fri, 24 Mar 2017 13:41:51 +0100 Message-ID: <1490359311-21042-1-git-send-email-nikolaus.schulz@avionic-design.de> X-Mailer: git-send-email 2.1.4 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [91.60.25.6] X-ClientProxiedBy: mail.avionic-design.de (172.17.100.63) To mail.avionic-design.de (172.17.100.63) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fix formatting of negative values of type IIO_VAL_FRACTIONAL_LOG2 by switching from do_div(), which can't handle negative numbers, to div_s64_rem(). Also use shift_right for shifting, which is safe with negative values. Signed-off-by: Nikolaus Schulz Cc: stable@vger.kernel.org --- drivers/iio/industrialio-core.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index d18ded4..3ff91e0 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -610,10 +610,9 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type, tmp0 = (int)div_s64_rem(tmp, 1000000000, &tmp1); return snprintf(buf, len, "%d.%09u", tmp0, abs(tmp1)); case IIO_VAL_FRACTIONAL_LOG2: - tmp = (s64)vals[0] * 1000000000LL >> vals[1]; - tmp1 = do_div(tmp, 1000000000LL); - tmp0 = tmp; - return snprintf(buf, len, "%d.%09u", tmp0, tmp1); + 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)); case IIO_VAL_INT_MULTIPLE: { int i; -- 2.1.4