spinlock.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #ifndef __BFIN_SPINLOCK_H
  2. #define __BFIN_SPINLOCK_H
  3. #ifndef CONFIG_SMP
  4. # include <asm-generic/spinlock.h>
  5. #else
  6. #include <asm/atomic.h>
  7. asmlinkage int __raw_spin_is_locked_asm(volatile int *ptr);
  8. asmlinkage void __raw_spin_lock_asm(volatile int *ptr);
  9. asmlinkage int __raw_spin_trylock_asm(volatile int *ptr);
  10. asmlinkage void __raw_spin_unlock_asm(volatile int *ptr);
  11. asmlinkage void __raw_read_lock_asm(volatile int *ptr);
  12. asmlinkage int __raw_read_trylock_asm(volatile int *ptr);
  13. asmlinkage void __raw_read_unlock_asm(volatile int *ptr);
  14. asmlinkage void __raw_write_lock_asm(volatile int *ptr);
  15. asmlinkage int __raw_write_trylock_asm(volatile int *ptr);
  16. asmlinkage void __raw_write_unlock_asm(volatile int *ptr);
  17. static inline int __raw_spin_is_locked(raw_spinlock_t *lock)
  18. {
  19. return __raw_spin_is_locked_asm(&lock->lock);
  20. }
  21. static inline void __raw_spin_lock(raw_spinlock_t *lock)
  22. {
  23. __raw_spin_lock_asm(&lock->lock);
  24. }
  25. #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
  26. static inline int __raw_spin_trylock(raw_spinlock_t *lock)
  27. {
  28. return __raw_spin_trylock_asm(&lock->lock);
  29. }
  30. static inline void __raw_spin_unlock(raw_spinlock_t *lock)
  31. {
  32. __raw_spin_unlock_asm(&lock->lock);
  33. }
  34. static inline void __raw_spin_unlock_wait(raw_spinlock_t *lock)
  35. {
  36. while (__raw_spin_is_locked(lock))
  37. cpu_relax();
  38. }
  39. static inline int __raw_read_can_lock(raw_rwlock_t *rw)
  40. {
  41. return __raw_uncached_fetch_asm(&rw->lock) > 0;
  42. }
  43. static inline int __raw_write_can_lock(raw_rwlock_t *rw)
  44. {
  45. return __raw_uncached_fetch_asm(&rw->lock) == RW_LOCK_BIAS;
  46. }
  47. static inline void __raw_read_lock(raw_rwlock_t *rw)
  48. {
  49. __raw_read_lock_asm(&rw->lock);
  50. }
  51. static inline int __raw_read_trylock(raw_rwlock_t *rw)
  52. {
  53. return __raw_read_trylock_asm(&rw->lock);
  54. }
  55. static inline void __raw_read_unlock(raw_rwlock_t *rw)
  56. {
  57. __raw_read_unlock_asm(&rw->lock);
  58. }
  59. static inline void __raw_write_lock(raw_rwlock_t *rw)
  60. {
  61. __raw_write_lock_asm(&rw->lock);
  62. }
  63. static inline int __raw_write_trylock(raw_rwlock_t *rw)
  64. {
  65. return __raw_write_trylock_asm(&rw->lock);
  66. }
  67. static inline void __raw_write_unlock(raw_rwlock_t *rw)
  68. {
  69. __raw_write_unlock_asm(&rw->lock);
  70. }
  71. #define _raw_spin_relax(lock) cpu_relax()
  72. #define _raw_read_relax(lock) cpu_relax()
  73. #define _raw_write_relax(lock) cpu_relax()
  74. #endif
  75. #endif /* !__BFIN_SPINLOCK_H */