blob: 1f286e71c21fb3fd3944b8656c2789b9fe5865b5 [file] [log] [blame]
Robin Getz96f10502009-09-24 14:11:24 +00001/*
2 * Copyright 2004-2009 Analog Devices Inc.
3 *
4 * Licensed under the GPL-2 or later.
5 */
6
Bryan Wu1394f032007-05-06 14:50:22 -07007#ifndef __BFIN_SPINLOCK_H
8#define __BFIN_SPINLOCK_H
9
Mike Frysinger3d150632009-06-13 11:21:51 -040010#ifndef CONFIG_SMP
11# include <asm-generic/spinlock.h>
12#else
13
Graf Yang6b3087c2009-01-07 23:14:39 +080014#include <asm/atomic.h>
Bryan Wu1394f032007-05-06 14:50:22 -070015
Graf Yang6b3087c2009-01-07 23:14:39 +080016asmlinkage int __raw_spin_is_locked_asm(volatile int *ptr);
17asmlinkage void __raw_spin_lock_asm(volatile int *ptr);
18asmlinkage int __raw_spin_trylock_asm(volatile int *ptr);
19asmlinkage void __raw_spin_unlock_asm(volatile int *ptr);
Graf Yang71a66282010-03-12 04:24:21 +000020asmlinkage void __raw_read_lock_asm(volatile int *ptr);
21asmlinkage int __raw_read_trylock_asm(volatile int *ptr);
22asmlinkage void __raw_read_unlock_asm(volatile int *ptr);
23asmlinkage void __raw_write_lock_asm(volatile int *ptr);
24asmlinkage int __raw_write_trylock_asm(volatile int *ptr);
25asmlinkage void __raw_write_unlock_asm(volatile int *ptr);
Graf Yang6b3087c2009-01-07 23:14:39 +080026
Thomas Gleixner0199c4e2009-12-02 20:01:25 +010027static inline int arch_spin_is_locked(arch_spinlock_t *lock)
Graf Yang6b3087c2009-01-07 23:14:39 +080028{
29 return __raw_spin_is_locked_asm(&lock->lock);
30}
31
Thomas Gleixner0199c4e2009-12-02 20:01:25 +010032static inline void arch_spin_lock(arch_spinlock_t *lock)
Graf Yang6b3087c2009-01-07 23:14:39 +080033{
34 __raw_spin_lock_asm(&lock->lock);
35}
36
Thomas Gleixner0199c4e2009-12-02 20:01:25 +010037#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
Graf Yang6b3087c2009-01-07 23:14:39 +080038
Thomas Gleixner0199c4e2009-12-02 20:01:25 +010039static inline int arch_spin_trylock(arch_spinlock_t *lock)
Graf Yang6b3087c2009-01-07 23:14:39 +080040{
41 return __raw_spin_trylock_asm(&lock->lock);
42}
43
Thomas Gleixner0199c4e2009-12-02 20:01:25 +010044static inline void arch_spin_unlock(arch_spinlock_t *lock)
Graf Yang6b3087c2009-01-07 23:14:39 +080045{
46 __raw_spin_unlock_asm(&lock->lock);
47}
48
Thomas Gleixner0199c4e2009-12-02 20:01:25 +010049static inline void arch_spin_unlock_wait(arch_spinlock_t *lock)
Graf Yang6b3087c2009-01-07 23:14:39 +080050{
Thomas Gleixner0199c4e2009-12-02 20:01:25 +010051 while (arch_spin_is_locked(lock))
Graf Yang6b3087c2009-01-07 23:14:39 +080052 cpu_relax();
53}
54
Thomas Gleixnere5931942009-12-03 20:08:46 +010055static inline int arch_read_can_lock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080056{
57 return __raw_uncached_fetch_asm(&rw->lock) > 0;
58}
59
Thomas Gleixnere5931942009-12-03 20:08:46 +010060static inline int arch_write_can_lock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080061{
62 return __raw_uncached_fetch_asm(&rw->lock) == RW_LOCK_BIAS;
63}
64
Thomas Gleixnere5931942009-12-03 20:08:46 +010065static inline void arch_read_lock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080066{
Graf Yang71a66282010-03-12 04:24:21 +000067 __raw_read_lock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080068}
69
Graf Yang54d756e2009-09-21 11:51:31 +000070#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
71
Thomas Gleixnere5931942009-12-03 20:08:46 +010072static inline int arch_read_trylock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080073{
Graf Yang71a66282010-03-12 04:24:21 +000074 return __raw_read_trylock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080075}
76
Thomas Gleixnere5931942009-12-03 20:08:46 +010077static inline void arch_read_unlock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080078{
Graf Yang71a66282010-03-12 04:24:21 +000079 __raw_read_unlock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080080}
81
Thomas Gleixnere5931942009-12-03 20:08:46 +010082static inline void arch_write_lock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080083{
Graf Yang71a66282010-03-12 04:24:21 +000084 __raw_write_lock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080085}
86
Graf Yang54d756e2009-09-21 11:51:31 +000087#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
88
Thomas Gleixnere5931942009-12-03 20:08:46 +010089static inline int arch_write_trylock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080090{
Graf Yang71a66282010-03-12 04:24:21 +000091 return __raw_write_trylock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080092}
93
Thomas Gleixnere5931942009-12-03 20:08:46 +010094static inline void arch_write_unlock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080095{
Graf Yang71a66282010-03-12 04:24:21 +000096 __raw_write_unlock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080097}
98
Thomas Gleixner0199c4e2009-12-02 20:01:25 +010099#define arch_spin_relax(lock) cpu_relax()
100#define arch_read_relax(lock) cpu_relax()
101#define arch_write_relax(lock) cpu_relax()
Graf Yang6b3087c2009-01-07 23:14:39 +0800102
Mike Frysinger3d150632009-06-13 11:21:51 -0400103#endif
104
Graf Yang6b3087c2009-01-07 23:14:39 +0800105#endif /* !__BFIN_SPINLOCK_H */