diff options
Diffstat (limited to 'lib/div64.c')
| -rw-r--r-- | lib/div64.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/lib/div64.c b/lib/div64.c index b71cf93c529a..bb5bd0c0f030 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,10 +57,31 @@ 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 | #ifndef div64_u64 |
| 82 | u64 div64_u64(u64 dividend, u64 divisor) | ||
| 63 | { | 83 | { |
| 64 | uint32_t high, d; | 84 | u32 high, d; |
| 65 | 85 | ||
| 66 | high = divisor >> 32; | 86 | high = divisor >> 32; |
| 67 | if (high) { | 87 | if (high) { |
| @@ -72,10 +92,9 @@ uint64_t div64_64(uint64_t dividend, uint64_t divisor) | |||
| 72 | } else | 92 | } else |
| 73 | d = divisor; | 93 | d = divisor; |
| 74 | 94 | ||
| 75 | do_div(dividend, d); | 95 | return div_u64(dividend, d); |
| 76 | |||
| 77 | return dividend; | ||
| 78 | } | 96 | } |
| 79 | EXPORT_SYMBOL(div64_64); | 97 | EXPORT_SYMBOL(div64_u64); |
| 98 | #endif | ||
| 80 | 99 | ||
| 81 | #endif /* BITS_PER_LONG == 32 */ | 100 | #endif /* BITS_PER_LONG == 32 */ |
