126333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#ifndef _ASM_GENERIC_BITOPS_LOCK_H_
226333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#define _ASM_GENERIC_BITOPS_LOCK_H_
326333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin
426333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin/**
526333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * test_and_set_bit_lock - Set a bit and return its old value, for lock
626333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @nr: Bit to set
726333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @addr: Address to count from
826333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin *
926333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * This operation is atomic and provides acquire barrier semantics.
1026333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * It can be used to implement bit locks.
1126333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin */
1226333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#define test_and_set_bit_lock(nr, addr)	test_and_set_bit(nr, addr)
1326333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin
1426333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin/**
1526333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * clear_bit_unlock - Clear a bit in memory, for unlock
1626333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @nr: the bit to set
1726333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @addr: the address to start counting from
1826333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin *
1926333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * This operation is atomic and provides release barrier semantics.
2026333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin */
2126333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#define clear_bit_unlock(nr, addr)	\
2226333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggindo {					\
234e857c58efeb99393cba5a5d0d8ec7117183137cPeter Zijlstra	smp_mb__before_atomic();	\
2426333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin	clear_bit(nr, addr);		\
2526333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin} while (0)
2626333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin
2726333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin/**
2826333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * __clear_bit_unlock - Clear a bit in memory, for unlock
2926333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @nr: the bit to set
3026333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * @addr: the address to start counting from
3126333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin *
3226333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * This operation is like clear_bit_unlock, however it is not atomic.
3326333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * It does provide release barrier semantics so it can be used to unlock
3426333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * a bit lock, however it would only be used if no other CPU can modify
3526333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * any bits in the memory until the lock is released (a good example is
3626333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin * if the bit lock itself protects access to the other bits in the word).
3726333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin */
3826333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#define __clear_bit_unlock(nr, addr)	\
3926333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggindo {					\
4026333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin	smp_mb();			\
4126333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin	__clear_bit(nr, addr);		\
4226333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin} while (0)
4326333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin
4426333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin#endif /* _ASM_GENERIC_BITOPS_LOCK_H_ */
4526333576fd0d0b52f6e4025c5aded97e188bdd44Nick Piggin
46