Message ID | 1404390870-24062-1-git-send-email-21cnbao@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, 3 Jul 2014 20:34:30 +0800 Barry Song <21cnbao@gmail.com> wrote: > Get square root of a 64-bit digit on 32bit platforms. CSR SiRFSoC > touchscreen driver needs it. Looks OK to me. Can this be carried in whatever tree holds the "CSR SiRFSoC touchscreen driver"? -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Jul 08, 2014 at 02:55:01PM -0700, Andrew Morton wrote: > On Thu, 3 Jul 2014 20:34:30 +0800 Barry Song <21cnbao@gmail.com> wrote: > > > Get square root of a 64-bit digit on 32bit platforms. CSR SiRFSoC > > touchscreen driver needs it. > > Looks OK to me. Can this be carried in whatever tree holds the "CSR > SiRFSoC touchscreen driver"? Yeah, I'll pick it up.
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 4c52907..a536c0c 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -418,6 +418,14 @@ struct pid; extern struct pid *session_of_pgrp(struct pid *pgrp); unsigned long int_sqrt(unsigned long); +#ifdef CONFIG_64BIT +static inline unsigned long long int64_sqrt(unsigned long long x) +{ + return int_sqrt(x); +} +#else +unsigned long long int64_sqrt(unsigned long long); +#endif extern void bust_spinlocks(int yes); extern int oops_in_progress; /* If set, an oops, panic(), BUG() or die() is in progress */ diff --git a/lib/int_sqrt.c b/lib/int_sqrt.c index 1ef4cc3..b86cccb 100644 --- a/lib/int_sqrt.c +++ b/lib/int_sqrt.c @@ -36,3 +36,28 @@ unsigned long int_sqrt(unsigned long x) return y; } EXPORT_SYMBOL(int_sqrt); + +#ifndef CONFIG_64BIT +unsigned long long int64_sqrt(unsigned long long x) +{ + unsigned long long b, m, y = 0; + + if (x <= 1) + return x; + + m = 1ULL << (BITS_PER_LONG_LONG - 2); + while (m != 0) { + b = y + m; + y >>= 1; + + if (x >= b) { + x -= b; + y += m; + } + m >>= 2; + } + + return y; +} +EXPORT_SYMBOL(int64_sqrt); +#endif