Merge tag 'docs-4.11' of git://git.lwn.net/linux
[linux-2.6-block.git] / arch / blackfin / include / asm / spinlock.h
CommitLineData
96f1050d 1/*
96956450
MF
2 * Copyright 2004-2009 Analog Devices Inc.
3 *
4 * Licensed under the GPL-2 or later.
5 */
96f1050d 6
1394f032
BW
7#ifndef __BFIN_SPINLOCK_H
8#define __BFIN_SPINLOCK_H
9
3d150630
MF
10#ifndef CONFIG_SMP
11# include <asm-generic/spinlock.h>
12#else
13
60063497 14#include <linux/atomic.h>
726328d9
PZ
15#include <asm/processor.h>
16#include <asm/barrier.h>
1394f032 17
6b3087c6
GY
18asmlinkage int __raw_spin_is_locked_asm(volatile int *ptr);
19asmlinkage void __raw_spin_lock_asm(volatile int *ptr);
20asmlinkage int __raw_spin_trylock_asm(volatile int *ptr);
21asmlinkage void __raw_spin_unlock_asm(volatile int *ptr);
71a66287
GY
22asmlinkage void __raw_read_lock_asm(volatile int *ptr);
23asmlinkage int __raw_read_trylock_asm(volatile int *ptr);
24asmlinkage void __raw_read_unlock_asm(volatile int *ptr);
25asmlinkage void __raw_write_lock_asm(volatile int *ptr);
26asmlinkage int __raw_write_trylock_asm(volatile int *ptr);
27asmlinkage void __raw_write_unlock_asm(volatile int *ptr);
6b3087c6 28
0199c4e6 29static inline int arch_spin_is_locked(arch_spinlock_t *lock)
6b3087c6
GY
30{
31 return __raw_spin_is_locked_asm(&lock->lock);
32}
33
0199c4e6 34static inline void arch_spin_lock(arch_spinlock_t *lock)
6b3087c6
GY
35{
36 __raw_spin_lock_asm(&lock->lock);
37}
38
0199c4e6 39#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
6b3087c6 40
0199c4e6 41static inline int arch_spin_trylock(arch_spinlock_t *lock)
6b3087c6
GY
42{
43 return __raw_spin_trylock_asm(&lock->lock);
44}
45
0199c4e6 46static inline void arch_spin_unlock(arch_spinlock_t *lock)
6b3087c6
GY
47{
48 __raw_spin_unlock_asm(&lock->lock);
49}
50
0199c4e6 51static inline void arch_spin_unlock_wait(arch_spinlock_t *lock)
6b3087c6 52{
726328d9 53 smp_cond_load_acquire(&lock->lock, !VAL);
6b3087c6
GY
54}
55
e5931943 56static inline int arch_read_can_lock(arch_rwlock_t *rw)
6b3087c6
GY
57{
58 return __raw_uncached_fetch_asm(&rw->lock) > 0;
59}
60
e5931943 61static inline int arch_write_can_lock(arch_rwlock_t *rw)
6b3087c6
GY
62{
63 return __raw_uncached_fetch_asm(&rw->lock) == RW_LOCK_BIAS;
64}
65
e5931943 66static inline void arch_read_lock(arch_rwlock_t *rw)
6b3087c6 67{
71a66287 68 __raw_read_lock_asm(&rw->lock);
6b3087c6
GY
69}
70
54d756ed
GY
71#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
72
e5931943 73static inline int arch_read_trylock(arch_rwlock_t *rw)
6b3087c6 74{
71a66287 75 return __raw_read_trylock_asm(&rw->lock);
6b3087c6
GY
76}
77
e5931943 78static inline void arch_read_unlock(arch_rwlock_t *rw)
6b3087c6 79{
71a66287 80 __raw_read_unlock_asm(&rw->lock);
6b3087c6
GY
81}
82
e5931943 83static inline void arch_write_lock(arch_rwlock_t *rw)
6b3087c6 84{
71a66287 85 __raw_write_lock_asm(&rw->lock);
6b3087c6
GY
86}
87
54d756ed
GY
88#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
89
e5931943 90static inline int arch_write_trylock(arch_rwlock_t *rw)
6b3087c6 91{
71a66287 92 return __raw_write_trylock_asm(&rw->lock);
6b3087c6
GY
93}
94
e5931943 95static inline void arch_write_unlock(arch_rwlock_t *rw)
6b3087c6 96{
71a66287 97 __raw_write_unlock_asm(&rw->lock);
6b3087c6
GY
98}
99
0199c4e6
TG
100#define arch_spin_relax(lock) cpu_relax()
101#define arch_read_relax(lock) cpu_relax()
102#define arch_write_relax(lock) cpu_relax()
6b3087c6 103
3d150630
MF
104#endif
105
6b3087c6 106#endif /* !__BFIN_SPINLOCK_H */