diff options
author | Fabio Estevam <fabio.estevam@freescale.com> | 2015-11-05 12:43:38 -0200 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2015-11-05 10:52:34 -0500 |
commit | de4d2e9e7ce0f9fda76f07bafafefa10f01a9605 (patch) | |
tree | f467257112f0f644afb4b58c776612ad1dea1f8a /include/linux | |
parent | 61a177767cfcaa231b9e16d1d462a12ad472d777 (diff) |
bitops: Add fls_long and __ffs64
Add fls_long and __ffs64 support to align with the kernel bitops
implementation.
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/bitops.h | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/include/linux/bitops.h b/include/linux/bitops.h index 7b4011f0a3..1b2e4915a0 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h @@ -2,6 +2,7 @@ #define _LINUX_BITOPS_H #include <asm/types.h> +#include <linux/compiler.h> #define BIT(nr) (1UL << (nr)) #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) @@ -139,6 +140,32 @@ static inline unsigned int generic_hweight8(unsigned int w) # define fls generic_fls #endif +static inline unsigned fls_long(unsigned long l) +{ + if (sizeof(l) == 4) + return fls(l); + return fls64(l); +} + +/** + * __ffs64 - find first set bit in a 64 bit word + * @word: The 64 bit word + * + * On 64 bit arches this is a synomyn for __ffs + * The result is not defined if no bits are set, so check that @word + * is non-zero before calling this. + */ +static inline unsigned long __ffs64(u64 word) +{ +#if BITS_PER_LONG == 32 + if (((u32)word) == 0UL) + return __ffs((u32)(word >> 32)) + 32; +#elif BITS_PER_LONG != 64 +#error BITS_PER_LONG not 32 or 64 +#endif + return __ffs((unsigned long)word); +} + /** * __set_bit - Set a bit in memory * @nr: the bit to set |