diff options
Diffstat (limited to 'lib/div64.c')
-rw-r--r-- | lib/div64.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/lib/div64.c b/lib/div64.c index b71cf93c529a..689bd76833fa 100644 --- a/lib/div64.c +++ b/lib/div64.c | |||
@@ -16,9 +16,8 @@ | |||
16 | * assembly versions such as arch/ppc/lib/div64.S and arch/sh/lib/div64.S. | 16 | * assembly versions such as arch/ppc/lib/div64.S and arch/sh/lib/div64.S. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/types.h> | ||
20 | #include <linux/module.h> | 19 | #include <linux/module.h> |
21 | #include <asm/div64.h> | 20 | #include <linux/math64.h> |
22 | 21 | ||
23 | /* Not needed on 64bit architectures */ | 22 | /* Not needed on 64bit architectures */ |
24 | #if BITS_PER_LONG == 32 | 23 | #if BITS_PER_LONG == 32 |
@@ -58,6 +57,26 @@ uint32_t __attribute__((weak)) __div64_32(uint64_t *n, uint32_t base) | |||
58 | 57 | ||
59 | EXPORT_SYMBOL(__div64_32); | 58 | EXPORT_SYMBOL(__div64_32); |
60 | 59 | ||
60 | #ifndef div_s64_rem | ||
61 | s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder) | ||
62 | { | ||
63 | u64 quotient; | ||
64 | |||
65 | if (dividend < 0) { | ||
66 | quotient = div_u64_rem(-dividend, abs(divisor), (u32 *)remainder); | ||
67 | *remainder = -*remainder; | ||
68 | if (divisor > 0) | ||
69 | quotient = -quotient; | ||
70 | } else { | ||
71 | quotient = div_u64_rem(dividend, abs(divisor), (u32 *)remainder); | ||
72 | if (divisor < 0) | ||
73 | quotient = -quotient; | ||
74 | } | ||
75 | return quotient; | ||
76 | } | ||
77 | EXPORT_SYMBOL(div_s64_rem); | ||
78 | #endif | ||
79 | |||
61 | /* 64bit divisor, dividend and result. dynamic precision */ | 80 | /* 64bit divisor, dividend and result. dynamic precision */ |
62 | uint64_t div64_64(uint64_t dividend, uint64_t divisor) | 81 | uint64_t div64_64(uint64_t dividend, uint64_t divisor) |
63 | { | 82 | { |