1#ifndef __V850_SEMAPHORE_H__ 2#define __V850_SEMAPHORE_H__ 3 4#include <linux/linkage.h> 5#include <linux/spinlock.h> 6#include <linux/wait.h> 7#include <linux/rwsem.h> 8 9#include <asm/atomic.h> 10 11struct semaphore { 12 atomic_t count; 13 int sleepers; 14 wait_queue_head_t wait; 15}; 16 17#define __SEMAPHORE_INITIALIZER(name,count) \ 18 { ATOMIC_INIT (count), 0, \ 19 __WAIT_QUEUE_HEAD_INITIALIZER ((name).wait) } 20 21#define __DECLARE_SEMAPHORE_GENERIC(name,count) \ 22 struct semaphore name = __SEMAPHORE_INITIALIZER (name,count) 23 24#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC (name,1) 25#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC (name,0) 26 27static inline void sema_init (struct semaphore *sem, int val) 28{ 29 *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val); 30} 31 32static inline void init_MUTEX (struct semaphore *sem) 33{ 34 sema_init (sem, 1); 35} 36 37static inline void init_MUTEX_LOCKED (struct semaphore *sem) 38{ 39 sema_init (sem, 0); 40} 41 42/* 43 * special register calling convention 44 */ 45asmlinkage void __down_failed (void); 46asmlinkage int __down_interruptible_failed (void); 47asmlinkage int __down_trylock_failed (void); 48asmlinkage void __up_wakeup (void); 49 50extern void __down (struct semaphore * sem); 51extern int __down_interruptible (struct semaphore * sem); 52extern int __down_trylock (struct semaphore * sem); 53extern void __up (struct semaphore * sem); 54 55static inline void down (struct semaphore * sem) 56{ 57 might_sleep(); 58 if (atomic_dec_return (&sem->count) < 0) 59 __down (sem); 60} 61 62static inline int down_interruptible (struct semaphore * sem) 63{ 64 int ret = 0; 65 might_sleep(); 66 if (atomic_dec_return (&sem->count) < 0) 67 ret = __down_interruptible (sem); 68 return ret; 69} 70 71static inline int down_trylock (struct semaphore *sem) 72{ 73 int ret = 0; 74 if (atomic_dec_return (&sem->count) < 0) 75 ret = __down_trylock (sem); 76 return ret; 77} 78 79static inline void up (struct semaphore * sem) 80{ 81 if (atomic_inc_return (&sem->count) <= 0) 82 __up (sem); 83} 84 85#endif /* __V850_SEMAPHORE_H__ */ 86