aboutsummaryrefslogtreecommitdiffstats
path: root/lib/div64.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dtor@insightbb.com>2007-05-01 00:24:54 -0400
committerDmitry Torokhov <dtor@insightbb.com>2007-05-01 00:24:54 -0400
commitbc95f3669f5e6f63cf0b84fe4922c3c6dd4aa775 (patch)
tree427fcf2a7287c16d4b5aa6cbf494d59579a6a8b1 /lib/div64.c
parent3d29cdff999c37b3876082278a8134a0642a02cd (diff)
parentdc87c3985e9b442c60994308a96f887579addc39 (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts: drivers/usb/input/Makefile drivers/usb/input/gtco.c
Diffstat (limited to 'lib/div64.c')
-rw-r--r--lib/div64.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/lib/div64.c b/lib/div64.c
index 365719f84832..b71cf93c529a 100644
--- a/lib/div64.c
+++ b/lib/div64.c
@@ -23,7 +23,7 @@
23/* Not needed on 64bit architectures */ 23/* Not needed on 64bit architectures */
24#if BITS_PER_LONG == 32 24#if BITS_PER_LONG == 32
25 25
26uint32_t __div64_32(uint64_t *n, uint32_t base) 26uint32_t __attribute__((weak)) __div64_32(uint64_t *n, uint32_t base)
27{ 27{
28 uint64_t rem = *n; 28 uint64_t rem = *n;
29 uint64_t b = base; 29 uint64_t b = base;
@@ -58,4 +58,24 @@ uint32_t __div64_32(uint64_t *n, uint32_t base)
58 58
59EXPORT_SYMBOL(__div64_32); 59EXPORT_SYMBOL(__div64_32);
60 60
61/* 64bit divisor, dividend and result. dynamic precision */
62uint64_t div64_64(uint64_t dividend, uint64_t divisor)
63{
64 uint32_t high, d;
65
66 high = divisor >> 32;
67 if (high) {
68 unsigned int shift = fls(high);
69
70 d = divisor >> shift;
71 dividend >>= shift;
72 } else
73 d = divisor;
74
75 do_div(dividend, d);
76
77 return dividend;
78}
79EXPORT_SYMBOL(div64_64);
80
61#endif /* BITS_PER_LONG == 32 */ 81#endif /* BITS_PER_LONG == 32 */