1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (C) 2023, Ventana Micro Systems Inc., Andrew Jones <ajones@ventanamicro.com>
4 */
5 #include <bitops.h>
6
set_bit(int nr,volatile unsigned long * addr)7 void set_bit(int nr, volatile unsigned long *addr)
8 {
9 volatile unsigned long *word = addr + BIT_WORD(nr);
10 unsigned long mask = BIT_MASK(nr);
11
12 __sync_or_and_fetch(word, mask);
13 }
14
clear_bit(int nr,volatile unsigned long * addr)15 void clear_bit(int nr, volatile unsigned long *addr)
16 {
17 volatile unsigned long *word = addr + BIT_WORD(nr);
18 unsigned long mask = BIT_MASK(nr);
19
20 __sync_and_and_fetch(word, ~mask);
21 }
22
test_bit(int nr,const volatile unsigned long * addr)23 int test_bit(int nr, const volatile unsigned long *addr)
24 {
25 const volatile unsigned long *word = addr + BIT_WORD(nr);
26 unsigned long mask = BIT_MASK(nr);
27
28 return (*word & mask) != 0;
29 }
30
test_and_set_bit(int nr,volatile unsigned long * addr)31 int test_and_set_bit(int nr, volatile unsigned long *addr)
32 {
33 volatile unsigned long *word = addr + BIT_WORD(nr);
34 unsigned long mask = BIT_MASK(nr);
35 unsigned long old = __sync_fetch_and_or(word, mask);
36
37 return (old & mask) != 0;
38 }
39
test_and_clear_bit(int nr,volatile unsigned long * addr)40 int test_and_clear_bit(int nr, volatile unsigned long *addr)
41 {
42 volatile unsigned long *word = addr + BIT_WORD(nr);
43 unsigned long mask = BIT_MASK(nr);
44 unsigned long old = __sync_fetch_and_and(word, ~mask);
45
46 return (old & mask) != 0;
47 }
48