blob: d6ff4b59fcb195e03925a773373c2fdfd9e9035f [file] [log] [blame]
Bryan Wu1394f032007-05-06 14:50:22 -07001#ifndef __BFIN_SPINLOCK_H
2#define __BFIN_SPINLOCK_H
3
Mike Frysinger3d150632009-06-13 11:21:51 -04004#ifndef CONFIG_SMP
5# include <asm-generic/spinlock.h>
6#else
7
Graf Yang6b3087c2009-01-07 23:14:39 +08008#include <asm/atomic.h>
Bryan Wu1394f032007-05-06 14:50:22 -07009
Graf Yang6b3087c2009-01-07 23:14:39 +080010asmlinkage int __raw_spin_is_locked_asm(volatile int *ptr);
11asmlinkage void __raw_spin_lock_asm(volatile int *ptr);
12asmlinkage int __raw_spin_trylock_asm(volatile int *ptr);
13asmlinkage void __raw_spin_unlock_asm(volatile int *ptr);
14asmlinkage void __raw_read_lock_asm(volatile int *ptr);
15asmlinkage int __raw_read_trylock_asm(volatile int *ptr);
16asmlinkage void __raw_read_unlock_asm(volatile int *ptr);
17asmlinkage void __raw_write_lock_asm(volatile int *ptr);
18asmlinkage int __raw_write_trylock_asm(volatile int *ptr);
19asmlinkage void __raw_write_unlock_asm(volatile int *ptr);
20
21static inline int __raw_spin_is_locked(raw_spinlock_t *lock)
22{
23 return __raw_spin_is_locked_asm(&lock->lock);
24}
25
26static inline void __raw_spin_lock(raw_spinlock_t *lock)
27{
28 __raw_spin_lock_asm(&lock->lock);
29}
30
31#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
32
33static inline int __raw_spin_trylock(raw_spinlock_t *lock)
34{
35 return __raw_spin_trylock_asm(&lock->lock);
36}
37
38static inline void __raw_spin_unlock(raw_spinlock_t *lock)
39{
40 __raw_spin_unlock_asm(&lock->lock);
41}
42
43static inline void __raw_spin_unlock_wait(raw_spinlock_t *lock)
44{
45 while (__raw_spin_is_locked(lock))
46 cpu_relax();
47}
48
49static inline int __raw_read_can_lock(raw_rwlock_t *rw)
50{
51 return __raw_uncached_fetch_asm(&rw->lock) > 0;
52}
53
54static inline int __raw_write_can_lock(raw_rwlock_t *rw)
55{
56 return __raw_uncached_fetch_asm(&rw->lock) == RW_LOCK_BIAS;
57}
58
59static inline void __raw_read_lock(raw_rwlock_t *rw)
60{
61 __raw_read_lock_asm(&rw->lock);
62}
63
64static inline int __raw_read_trylock(raw_rwlock_t *rw)
65{
66 return __raw_read_trylock_asm(&rw->lock);
67}
68
69static inline void __raw_read_unlock(raw_rwlock_t *rw)
70{
71 __raw_read_unlock_asm(&rw->lock);
72}
73
74static inline void __raw_write_lock(raw_rwlock_t *rw)
75{
76 __raw_write_lock_asm(&rw->lock);
77}
78
79static inline int __raw_write_trylock(raw_rwlock_t *rw)
80{
81 return __raw_write_trylock_asm(&rw->lock);
82}
83
84static inline void __raw_write_unlock(raw_rwlock_t *rw)
85{
86 __raw_write_unlock_asm(&rw->lock);
87}
88
89#define _raw_spin_relax(lock) cpu_relax()
90#define _raw_read_relax(lock) cpu_relax()
91#define _raw_write_relax(lock) cpu_relax()
92
Mike Frysinger3d150632009-06-13 11:21:51 -040093#endif
94
Graf Yang6b3087c2009-01-07 23:14:39 +080095#endif /* !__BFIN_SPINLOCK_H */