1/* 2 * bitops.h: Bit string operations on the Sparc. 3 * 4 * Copyright 1995 David S. Miller (davem@caip.rutgers.edu) 5 * Copyright 1996 Eddie C. Dost (ecd@skynet.be) 6 * Copyright 2001 Anton Blanchard (anton@samba.org) 7 */ 8 9#ifndef _SPARC_BITOPS_H 10#define _SPARC_BITOPS_H 11 12#include <linux/compiler.h> 13#include <asm/byteorder.h> 14 15#ifdef __KERNEL__ 16 17#ifndef _LINUX_BITOPS_H 18#error only <linux/bitops.h> can be included directly 19#endif 20 21unsigned long ___set_bit(unsigned long *addr, unsigned long mask); 22unsigned long ___clear_bit(unsigned long *addr, unsigned long mask); 23unsigned long ___change_bit(unsigned long *addr, unsigned long mask); 24 25/* 26 * Set bit 'nr' in 32-bit quantity at address 'addr' where bit '0' 27 * is in the highest of the four bytes and bit '31' is the high bit 28 * within the first byte. Sparc is BIG-Endian. Unless noted otherwise 29 * all bit-ops return 0 if bit was previously clear and != 0 otherwise. 30 */ 31static inline int test_and_set_bit(unsigned long nr, volatile unsigned long *addr) 32{ 33 unsigned long *ADDR, mask; 34 35 ADDR = ((unsigned long *) addr) + (nr >> 5); 36 mask = 1 << (nr & 31); 37 38 return ___set_bit(ADDR, mask) != 0; 39} 40 41static inline void set_bit(unsigned long nr, volatile unsigned long *addr) 42{ 43 unsigned long *ADDR, mask; 44 45 ADDR = ((unsigned long *) addr) + (nr >> 5); 46 mask = 1 << (nr & 31); 47 48 (void) ___set_bit(ADDR, mask); 49} 50 51static inline int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr) 52{ 53 unsigned long *ADDR, mask; 54 55 ADDR = ((unsigned long *) addr) + (nr >> 5); 56 mask = 1 << (nr & 31); 57 58 return ___clear_bit(ADDR, mask) != 0; 59} 60 61static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) 62{ 63 unsigned long *ADDR, mask; 64 65 ADDR = ((unsigned long *) addr) + (nr >> 5); 66 mask = 1 << (nr & 31); 67 68 (void) ___clear_bit(ADDR, mask); 69} 70 71static inline int test_and_change_bit(unsigned long nr, volatile unsigned long *addr) 72{ 73 unsigned long *ADDR, mask; 74 75 ADDR = ((unsigned long *) addr) + (nr >> 5); 76 mask = 1 << (nr & 31); 77 78 return ___change_bit(ADDR, mask) != 0; 79} 80 81static inline void change_bit(unsigned long nr, volatile unsigned long *addr) 82{ 83 unsigned long *ADDR, mask; 84 85 ADDR = ((unsigned long *) addr) + (nr >> 5); 86 mask = 1 << (nr & 31); 87 88 (void) ___change_bit(ADDR, mask); 89} 90 91#include <asm-generic/bitops/non-atomic.h> 92 93#include <asm-generic/bitops/ffz.h> 94#include <asm-generic/bitops/__ffs.h> 95#include <asm-generic/bitops/sched.h> 96#include <asm-generic/bitops/ffs.h> 97#include <asm-generic/bitops/fls.h> 98#include <asm-generic/bitops/__fls.h> 99#include <asm-generic/bitops/fls64.h> 100#include <asm-generic/bitops/hweight.h> 101#include <asm-generic/bitops/lock.h> 102#include <asm-generic/bitops/find.h> 103#include <asm-generic/bitops/le.h> 104#include <asm-generic/bitops/ext2-atomic.h> 105 106#endif /* __KERNEL__ */ 107 108#endif /* defined(_SPARC_BITOPS_H) */ 109