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 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 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 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 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 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