summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2012-03-04 21:09:11 +0000
committerArnd Bergmann <arnd@arndb.de>2012-03-04 21:20:46 +0000
commit709baa67c676a187a63c0f0f40efceb3fb1eef72 (patch)
tree0a2b8bab5ac4f52069a1e50d20028ae44d8c256a /lib
parent281a9f78eaa5d0d78bd0e3acd181a24d3bad28e3 (diff)
parent8c690fdf465be9d97229f6bb0e6346624d6753a9 (diff)
Merge tag 'tegra-soc2' of git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra into tegra/soc2
From: Olof Johansson <olof@lixom.net> Tegra 30 SMP support I did this as a separate topic branch because it depends on both the soc and the soc-drivers branch, so it brings both of those in as a base. This branch contains work to enable SMP support on Tegra30 and reworks some of the SMP bringup for T20 as well. It also contains a device tree patch that builds on top of the SMP/clock changes in the rest of the branch, so it made more sense to apply it here than deal with the merge conflicts back and forth. * tag 'tegra-soc2' of git://git.kernel.org/pub/scm/linux/kernel/git/olof/tegra: ARM: dt: Explicitly configure all serial ports on Tegra Cardhu ARM: tegra: support for secondary cores on Tegra30 ARM: tegra: support for Tegra30 CPU powerdomains ARM: tegra: add support for Tegra30 powerdomains ARM: tegra: export tegra_powergate_is_powered() ARM: tegra: prepare powergate.c for multiple variants ARM: tegra: rework Tegra secondary CPU core bringup ARM: tegra: functions to access the flowcontroller ARM: tegra: initialize Tegra chipid early ARM: tegra: export Tegra chipid ARM: tegra: cleanup use of chipid register Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'lib')
-rw-r--r--lib/kstrtox.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/lib/kstrtox.c b/lib/kstrtox.c
index 7a94c8f14e29..b1dd3e7d88cb 100644
--- a/lib/kstrtox.c
+++ b/lib/kstrtox.c
@@ -44,12 +44,13 @@ const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
*
* Don't you dare use this function.
*/
-unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *res)
+unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *p)
{
+ unsigned long long res;
unsigned int rv;
int overflow;
- *res = 0;
+ res = 0;
rv = 0;
overflow = 0;
while (*s) {
@@ -64,12 +65,19 @@ unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long
if (val >= base)
break;
- if (*res > div_u64(ULLONG_MAX - val, base))
- overflow = 1;
- *res = *res * base + val;
+ /*
+ * Check for overflow only if we are within range of
+ * it in the max base we support (16)
+ */
+ if (unlikely(res & (~0ull << 60))) {
+ if (res > div_u64(ULLONG_MAX - val, base))
+ overflow = 1;
+ }
+ res = res * base + val;
rv++;
s++;
}
+ *p = res;
if (overflow)
rv |= KSTRTOX_OVERFLOW;
return rv;