]> git.itanic.dy.fi Git - linux-stable/commitdiff
iio: gts-helper: Fix division loop
authorMatti Vaittinen <mazziesaccount@gmail.com>
Mon, 12 Feb 2024 11:20:09 +0000 (13:20 +0200)
committerSasha Levin <sashal@kernel.org>
Tue, 26 Mar 2024 22:17:29 +0000 (18:17 -0400)
[ Upstream commit bb76cc45dcdfcd962a5994b8fe19ab74fc6c3c3a ]

The loop based 64bit division may run for a long time when dividend is a
lot bigger than the divider. Replace the division loop by the
div64_u64() which implementation may be significantly faster.

Tested-by: Subhajit Ghosh <subhajit.ghosh@tweaklogic.com>
Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Fixes: 38416c28e168 ("iio: light: Add gain-time-scale helpers")
Link: https://lore.kernel.org/r/Zcn-6e-0-nh2WcfU@drtxq0yyyyyyyyyyyyyby-3.rev.dnainternet.fi
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/iio/industrialio-gts-helper.c

index 7653261d2dc2bf4cb916f9ca30b239261597a018..b51eb6cb766f3fab9e824a7de8afe488b8c43e1f 100644 (file)
 static int iio_gts_get_gain(const u64 max, const u64 scale)
 {
        u64 full = max;
-       int tmp = 1;
 
        if (scale > full || !scale)
                return -EINVAL;
 
-       if (U64_MAX - full < scale) {
-               /* Risk of overflow */
-               if (full - scale < scale)
-                       return 1;
-
-               full -= scale;
-               tmp++;
-       }
-
-       while (full > scale * (u64)tmp)
-               tmp++;
-
-       return tmp;
+       return div64_u64(full, scale);
 }
 
 /**