diff options
| author | Simon Horman <horms+renesas@verge.net.au> | 2019-03-25 12:35:53 -0400 |
|---|---|---|
| committer | Geert Uytterhoeven <geert+renesas@glider.be> | 2019-04-02 03:50:48 -0400 |
| commit | cb8be119d21d8a0affc3598a928dd0baf5da238f (patch) | |
| tree | a9cad79fb039220cd64061c02f34afc3eecb5a84 /include/linux/math64.h | |
| parent | e0836e36384321ab1b4af05ab441c0c59a972596 (diff) | |
math64: New DIV64_U64_ROUND_CLOSEST helper
Provide DIV64_U64_ROUND_CLOSEST helper which performs division rounded to
the closest integer using an unsigned 64bit dividend and divisor.
This will be used in a follow-up patch to allow calculation of clock
divisors with high frequency parents in the R-Car Gen3 CPG MSSR driver
where overflow occurs if either the dividend or divisor is 32bit.
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Diffstat (limited to 'include/linux/math64.h')
| -rw-r--r-- | include/linux/math64.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/include/linux/math64.h b/include/linux/math64.h index bb2c84afb80c..65bef21cdddb 100644 --- a/include/linux/math64.h +++ b/include/linux/math64.h | |||
| @@ -284,4 +284,17 @@ static inline u64 mul_u64_u32_div(u64 a, u32 mul, u32 divisor) | |||
| 284 | #define DIV64_U64_ROUND_UP(ll, d) \ | 284 | #define DIV64_U64_ROUND_UP(ll, d) \ |
| 285 | ({ u64 _tmp = (d); div64_u64((ll) + _tmp - 1, _tmp); }) | 285 | ({ u64 _tmp = (d); div64_u64((ll) + _tmp - 1, _tmp); }) |
| 286 | 286 | ||
| 287 | /** | ||
| 288 | * DIV64_U64_ROUND_CLOSEST - unsigned 64bit divide with 64bit divisor rounded to nearest integer | ||
| 289 | * @dividend: unsigned 64bit dividend | ||
| 290 | * @divisor: unsigned 64bit divisor | ||
| 291 | * | ||
| 292 | * Divide unsigned 64bit dividend by unsigned 64bit divisor | ||
| 293 | * and round to closest integer. | ||
| 294 | * | ||
| 295 | * Return: dividend / divisor rounded to nearest integer | ||
| 296 | */ | ||
| 297 | #define DIV64_U64_ROUND_CLOSEST(dividend, divisor) \ | ||
| 298 | ({ u64 _tmp = (divisor); div64_u64((dividend) + _tmp / 2, _tmp); }) | ||
| 299 | |||
| 287 | #endif /* _LINUX_MATH64_H */ | 300 | #endif /* _LINUX_MATH64_H */ |
