|
@@ -19,119 +19,10 @@
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#include <arch/bitops.h>
|
|
#include <arch/bitops.h>
|
|
-#include <linux/atomic.h>
|
|
|
|
#include <linux/compiler.h>
|
|
#include <linux/compiler.h>
|
|
#include <asm/barrier.h>
|
|
#include <asm/barrier.h>
|
|
|
|
|
|
-/*
|
|
|
|
- * set_bit - Atomically set a bit in memory
|
|
|
|
- * @nr: the bit to set
|
|
|
|
- * @addr: the address to start counting from
|
|
|
|
- *
|
|
|
|
- * This function is atomic and may not be reordered. See __set_bit()
|
|
|
|
- * if you do not require the atomic guarantees.
|
|
|
|
- * Note that @nr may be almost arbitrarily large; this function is not
|
|
|
|
- * restricted to acting on a single-word quantity.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-#define set_bit(nr, addr) (void)test_and_set_bit(nr, addr)
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * clear_bit - Clears a bit in memory
|
|
|
|
- * @nr: Bit to clear
|
|
|
|
- * @addr: Address to start counting from
|
|
|
|
- *
|
|
|
|
- * clear_bit() is atomic and may not be reordered. However, it does
|
|
|
|
- * not contain a memory barrier, so if it is used for locking purposes,
|
|
|
|
- * you should call smp_mb__before_atomic() and/or smp_mb__after_atomic()
|
|
|
|
- * in order to ensure changes are visible on other processors.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-#define clear_bit(nr, addr) (void)test_and_clear_bit(nr, addr)
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * change_bit - Toggle a bit in memory
|
|
|
|
- * @nr: Bit to change
|
|
|
|
- * @addr: Address to start counting from
|
|
|
|
- *
|
|
|
|
- * change_bit() is atomic and may not be reordered.
|
|
|
|
- * Note that @nr may be almost arbitrarily large; this function is not
|
|
|
|
- * restricted to acting on a single-word quantity.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-#define change_bit(nr, addr) (void)test_and_change_bit(nr, addr)
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * test_and_set_bit - Set a bit and return its old value
|
|
|
|
- * @nr: Bit to set
|
|
|
|
- * @addr: Address to count from
|
|
|
|
- *
|
|
|
|
- * This operation is atomic and cannot be reordered.
|
|
|
|
- * It also implies a memory barrier.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-static inline int test_and_set_bit(int nr, volatile unsigned long *addr)
|
|
|
|
-{
|
|
|
|
- unsigned int mask, retval;
|
|
|
|
- unsigned long flags;
|
|
|
|
- unsigned int *adr = (unsigned int *)addr;
|
|
|
|
-
|
|
|
|
- adr += nr >> 5;
|
|
|
|
- mask = 1 << (nr & 0x1f);
|
|
|
|
- cris_atomic_save(addr, flags);
|
|
|
|
- retval = (mask & *adr) != 0;
|
|
|
|
- *adr |= mask;
|
|
|
|
- cris_atomic_restore(addr, flags);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * test_and_clear_bit - Clear a bit and return its old value
|
|
|
|
- * @nr: Bit to clear
|
|
|
|
- * @addr: Address to count from
|
|
|
|
- *
|
|
|
|
- * This operation is atomic and cannot be reordered.
|
|
|
|
- * It also implies a memory barrier.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)
|
|
|
|
-{
|
|
|
|
- unsigned int mask, retval;
|
|
|
|
- unsigned long flags;
|
|
|
|
- unsigned int *adr = (unsigned int *)addr;
|
|
|
|
-
|
|
|
|
- adr += nr >> 5;
|
|
|
|
- mask = 1 << (nr & 0x1f);
|
|
|
|
- cris_atomic_save(addr, flags);
|
|
|
|
- retval = (mask & *adr) != 0;
|
|
|
|
- *adr &= ~mask;
|
|
|
|
- cris_atomic_restore(addr, flags);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * test_and_change_bit - Change a bit and return its old value
|
|
|
|
- * @nr: Bit to change
|
|
|
|
- * @addr: Address to count from
|
|
|
|
- *
|
|
|
|
- * This operation is atomic and cannot be reordered.
|
|
|
|
- * It also implies a memory barrier.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-static inline int test_and_change_bit(int nr, volatile unsigned long *addr)
|
|
|
|
-{
|
|
|
|
- unsigned int mask, retval;
|
|
|
|
- unsigned long flags;
|
|
|
|
- unsigned int *adr = (unsigned int *)addr;
|
|
|
|
- adr += nr >> 5;
|
|
|
|
- mask = 1 << (nr & 0x1f);
|
|
|
|
- cris_atomic_save(addr, flags);
|
|
|
|
- retval = (mask & *adr) != 0;
|
|
|
|
- *adr ^= mask;
|
|
|
|
- cris_atomic_restore(addr, flags);
|
|
|
|
- return retval;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
|
|
+#include <asm-generic/bitops/atomic.h>
|
|
#include <asm-generic/bitops/non-atomic.h>
|
|
#include <asm-generic/bitops/non-atomic.h>
|
|
|
|
|
|
/*
|
|
/*
|