diff options
Diffstat (limited to 'arch/blackfin/include/asm/bitops.h')
| -rw-r--r-- | arch/blackfin/include/asm/bitops.h | 81 |
1 files changed, 57 insertions, 24 deletions
diff --git a/arch/blackfin/include/asm/bitops.h b/arch/blackfin/include/asm/bitops.h index a2ff3fb3568..b298b654a26 100644 --- a/arch/blackfin/include/asm/bitops.h +++ b/arch/blackfin/include/asm/bitops.h @@ -7,22 +7,38 @@ #ifndef _BLACKFIN_BITOPS_H #define _BLACKFIN_BITOPS_H -#ifndef CONFIG_SMP -# include <asm-generic/bitops.h> -#else +#include <linux/compiler.h> + +#include <asm-generic/bitops/__ffs.h> +#include <asm-generic/bitops/ffz.h> +#include <asm-generic/bitops/fls.h> +#include <asm-generic/bitops/__fls.h> +#include <asm-generic/bitops/fls64.h> +#include <asm-generic/bitops/find.h> #ifndef _LINUX_BITOPS_H #error only <linux/bitops.h> can be included directly #endif -#include <linux/compiler.h> -#include <asm/byteorder.h> /* swab32 */ - -#include <asm-generic/bitops/ffs.h> -#include <asm-generic/bitops/__ffs.h> #include <asm-generic/bitops/sched.h> -#include <asm-generic/bitops/ffz.h> +#include <asm-generic/bitops/ffs.h> +#include <asm-generic/bitops/const_hweight.h> +#include <asm-generic/bitops/lock.h> + +#include <asm-generic/bitops/ext2-atomic.h> + +#include <asm/barrier.h> + +#ifndef CONFIG_SMP +#include <linux/irqflags.h> +/* + * clear_bit may not imply a memory barrier + */ +#include <asm-generic/bitops/atomic.h> +#include <asm-generic/bitops/non-atomic.h> +#else +#include <asm/byteorder.h> /* swab32 */ #include <linux/linkage.h> asmlinkage int __raw_bit_set_asm(volatile unsigned long *addr, int nr); @@ -81,27 +97,44 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr) return __raw_bit_test_toggle_asm(a, nr & 0x1f); } +#define test_bit __skip_test_bit +#include <asm-generic/bitops/non-atomic.h> +#undef test_bit + +#endif /* CONFIG_SMP */ + +/* Needs to be after test_bit and friends */ +#include <asm-generic/bitops/le.h> + /* - * clear_bit() doesn't provide any barrier for the compiler. + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word */ -#define smp_mb__before_clear_bit() barrier() -#define smp_mb__after_clear_bit() barrier() - -#include <asm-generic/bitops/non-atomic.h> -#include <asm-generic/bitops/find.h> -#include <asm-generic/bitops/hweight.h> -#include <asm-generic/bitops/lock.h> +static inline unsigned int __arch_hweight32(unsigned int w) +{ + unsigned int res; -#include <asm-generic/bitops/ext2-atomic.h> -#include <asm-generic/bitops/ext2-non-atomic.h> + __asm__ ("%0.l = ONES %1;" + "%0 = %0.l (Z);" + : "=d" (res) : "d" (w)); + return res; +} -#include <asm-generic/bitops/minix.h> +static inline unsigned int __arch_hweight64(__u64 w) +{ + return __arch_hweight32((unsigned int)(w >> 32)) + + __arch_hweight32((unsigned int)w); +} -#include <asm-generic/bitops/fls.h> -#include <asm-generic/bitops/__fls.h> -#include <asm-generic/bitops/fls64.h> +static inline unsigned int __arch_hweight16(unsigned int w) +{ + return __arch_hweight32(w & 0xffff); +} -#endif /* CONFIG_SMP */ +static inline unsigned int __arch_hweight8(unsigned int w) +{ + return __arch_hweight32(w & 0xff); +} #endif /* _BLACKFIN_BITOPS_H */ |
