math64: New DIV_S64_ROUND_CLOSEST helper
authorChunyan Zhang <chunyan.zhang@unisoc.com>
Fri, 24 Jul 2020 12:21:47 +0000 (20:21 +0800)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Mon, 27 Jul 2020 22:47:18 +0000 (00:47 +0200)
Provide DIV_S64_ROUND_CLOSEST helper which uses div_s64 to perform
division rounded to the closest integer using signed 64bit
dividend and signed 32bit divisor.

Signed-off-by: Chunyan Zhang <chunyan.zhang@unisoc.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
include/linux/math64.h

index 11a267413e8e7ddcb538575e2f434072ac4ef957..cd06939894367645302be925fefc6f38efede409 100644 (file)
@@ -279,4 +279,23 @@ static inline u64 mul_u64_u32_div(u64 a, u32 mul, u32 divisor)
 #define DIV64_U64_ROUND_CLOSEST(dividend, divisor)     \
        ({ u64 _tmp = (divisor); div64_u64((dividend) + _tmp / 2, _tmp); })
 
+/*
+ * DIV_S64_ROUND_CLOSEST - signed 64bit divide with 32bit divisor rounded to nearest integer
+ * @dividend: signed 64bit dividend
+ * @divisor: signed 32bit divisor
+ *
+ * Divide signed 64bit dividend by signed 32bit divisor
+ * and round to closest integer.
+ *
+ * Return: dividend / divisor rounded to nearest integer
+ */
+#define DIV_S64_ROUND_CLOSEST(dividend, divisor)(      \
+{                                                      \
+       s64 __x = (dividend);                           \
+       s32 __d = (divisor);                            \
+       ((__x > 0) == (__d > 0)) ?                      \
+               div_s64((__x + (__d / 2)), __d) :       \
+               div_s64((__x - (__d / 2)), __d);        \
+}                                                      \
+)
 #endif /* _LINUX_MATH64_H */