1 #ifndef __ASM_SPINLOCK_H
2 #define __ASM_SPINLOCK_H
4 #include <asm/system.h>
5 #include <asm/processor.h>
7 #if defined(CONFIG_DEBUG_SPINLOCK)
8 #define SPINLOCK_DEBUG 1
10 #define SPINLOCK_DEBUG 0
14 * Simple spin lock operations.
18 volatile unsigned long lock;
20 volatile unsigned long owner_pc;
21 volatile unsigned long owner_cpu;
27 #define SPINLOCK_DEBUG_INIT , 0, 0
29 #define SPINLOCK_DEBUG_INIT /* */
32 #define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 SPINLOCK_DEBUG_INIT }
34 #define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
35 #define spin_is_locked(x) ((x)->lock != 0)
36 #define spin_unlock_wait(x) do { barrier(); } while(spin_is_locked(x))
40 extern void _spin_lock(spinlock_t *lock);
41 extern void _spin_unlock(spinlock_t *lock);
42 extern int spin_trylock(spinlock_t *lock);
44 #define spin_lock(lp) _spin_lock(lp)
45 #define spin_unlock(lp) _spin_unlock(lp)
47 #else /* ! SPINLOCK_DEBUG */
49 static inline void spin_lock(spinlock_t *lock)
66 : "r"(&lock->lock), "r"(1)
70 static inline void spin_unlock(spinlock_t *lock)
72 __asm__ __volatile__("eieio # spin_unlock": : :"memory");
76 #define spin_trylock(lock) (!test_and_set_bit(0,(lock)))
81 * Read-write spinlocks, allowing multiple readers
82 * but only one writer.
84 * NOTE! it is quite common to have readers in interrupts
85 * but no interrupt writers. For those circumstances we
86 * can "mix" irq-safe locks - any writer needs to get a
87 * irq-safe write-lock, but readers can get non-irqsafe
91 volatile unsigned long lock;
93 volatile unsigned long owner_pc;
98 #define RWLOCK_DEBUG_INIT , 0
100 #define RWLOCK_DEBUG_INIT /* */
103 #define RW_LOCK_UNLOCKED (rwlock_t) { 0 RWLOCK_DEBUG_INIT }
104 #define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
108 extern void _read_lock(rwlock_t *rw);
109 extern void _read_unlock(rwlock_t *rw);
110 extern void _write_lock(rwlock_t *rw);
111 extern void _write_unlock(rwlock_t *rw);
113 #define read_lock(rw) _read_lock(rw)
114 #define write_lock(rw) _write_lock(rw)
115 #define write_unlock(rw) _write_unlock(rw)
116 #define read_unlock(rw) _read_unlock(rw)
118 #else /* ! SPINLOCK_DEBUG */
120 static __inline__ void read_lock(rwlock_t *rw)
124 __asm__ __volatile__(
141 static __inline__ void read_unlock(rwlock_t *rw)
145 __asm__ __volatile__(
146 "eieio # read_unlock\n\
157 static __inline__ void write_lock(rwlock_t *rw)
161 __asm__ __volatile__(
162 "b 2f # write_lock\n\
174 : "r"(&rw->lock), "r"(-1)
178 static __inline__ void write_unlock(rwlock_t *rw)
180 __asm__ __volatile__("eieio # write_unlock": : :"memory");
186 #endif /* __ASM_SPINLOCK_H */
187 #endif /* __KERNEL__ */