blob: 47d5a0b1465acb2ba902085a1f346a2db7c6538a [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
Thomas Gleixnere5931942009-12-03 20:08:46 +010070static inline int arch_read_trylock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080071{
Graf Yang71a66282010-03-12 04:24:21 +000072 return __raw_read_trylock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080073}
74
Thomas Gleixnere5931942009-12-03 20:08:46 +010075static inline void arch_read_unlock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080076{
Graf Yang71a66282010-03-12 04:24:21 +000077 __raw_read_unlock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080078}
79
Thomas Gleixnere5931942009-12-03 20:08:46 +010080static inline void arch_write_lock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080081{
Graf Yang71a66282010-03-12 04:24:21 +000082 __raw_write_lock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080083}
84
Thomas Gleixnere5931942009-12-03 20:08:46 +010085static inline int arch_write_trylock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080086{
Graf Yang71a66282010-03-12 04:24:21 +000087 return __raw_write_trylock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080088}
89
Thomas Gleixnere5931942009-12-03 20:08:46 +010090static inline void arch_write_unlock(arch_rwlock_t *rw)
Graf Yang6b3087c2009-01-07 23:14:39 +080091{
Graf Yang71a66282010-03-12 04:24:21 +000092 __raw_write_unlock_asm(&rw->lock);
Graf Yang6b3087c2009-01-07 23:14:39 +080093}
94
Thomas Gleixner0199c4e2009-12-02 20:01:25 +010095#define arch_spin_relax(lock) cpu_relax()
96#define arch_read_relax(lock) cpu_relax()
97#define arch_write_relax(lock) cpu_relax()
Graf Yang6b3087c2009-01-07 23:14:39 +080098
Mike Frysinger3d150632009-06-13 11:21:51 -040099#endif
100
Graf Yang6b3087c2009-01-07 23:14:39 +0800101#endif /* !__BFIN_SPINLOCK_H */