1 | /*
2 | bitops.h
3 | --------
4 | $Id: bitops.h,v 1.3 2003/07/06 12:28:03 stewart Exp $
5 |
6 | functions similar to those present in include/asm/bitops.h
7 | There is no *real* guarantee of being atomic, except for the
8 | "we're not doing threads so go away" thing.
9 |
10 | (C)2003 Stewart Smith
11 | Distributed under the GNU Public License.
12 |
13 | Some data structures have been constructed out of those
14 | present in the Linux Kernel (v2.5.69). They are copyright
15 | of their respective owners.
16 |
17 | The API here is very much based on Linux kernel stuff.
18 | Except that we don't do inline ASM to do this 'atomic' stuff.
19 | bah - we live on the edge baby!
20 | */
21 |
22 | #ifndef __BITOPS_H__
23 | #define __BITOPS_H__
24 |
25 | #define ADDR (* (volatile long *) addr)
26 |
27 | static inline void set_bit(int nr, volatile void * addr)
28 | {
29 | ADDR = ADDR | 1UL << nr;
30 | }
31 |
32 | static inline int test_and_set_bit(int nr, volatile void * addr)
33 | {
34 | int oldbit;
35 | oldbit = ADDR & 1UL << nr;
36 | set_bit(nr,addr);
37 | return oldbit;
38 | }
39 |
40 | static inline void clear_bit(int nr,volatile void * addr)
41 | {
42 | ADDR = ADDR & ~(1UL << nr);
43 | }
44 |
45 | static inline int test_and_clear_bit(int nr,volatile void * addr)
46 | {
47 | int oldbit;
48 | oldbit = ADDR & (1UL << nr);
49 | clear_bit(nr,addr);
50 | return oldbit;
51 | }
52 |
53 | static inline int test_bit(int nr,volatile void * addr)
54 | {
55 | return ADDR & (1UL << nr);
56 | }
57 |
58 | #endif