Blame view

include/asm-xtensa/semaphore.h 2.2 KB
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  /*
   * linux/include/asm-xtensa/semaphore.h
   *
   * This file is subject to the terms and conditions of the GNU General Public
   * License.  See the file "COPYING" in the main directory of this archive
   * for more details.
   *
   * Copyright (C) 2001 - 2005 Tensilica Inc.
   */
  
  #ifndef _XTENSA_SEMAPHORE_H
  #define _XTENSA_SEMAPHORE_H
  
  #include <asm/atomic.h>
  #include <asm/system.h>
  #include <linux/wait.h>
  #include <linux/rwsem.h>
  
  struct semaphore {
  	atomic_t count;
  	int sleepers;
  	wait_queue_head_t wait;
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
23
  };
288a60cf4   Chris Zankel   [PATCH] xtensa: r...
24
25
26
27
28
29
  #define __SEMAPHORE_INITIALIZER(name,n)					\
  {									\
  	.count		= ATOMIC_INIT(n),				\
  	.sleepers	= 0,						\
  	.wait		= __WAIT_QUEUE_HEAD_INITIALIZER((name).wait)	\
  }
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
30

288a60cf4   Chris Zankel   [PATCH] xtensa: r...
31
  #define __DECLARE_SEMAPHORE_GENERIC(name,count) 			\
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
32
33
34
35
  	struct semaphore name = __SEMAPHORE_INITIALIZER(name,count)
  
  #define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
  #define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
d99cf715a   Adrian Bunk   [PATCH] xtensa: r...
36
  static inline void sema_init (struct semaphore *sem, int val)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
37
  {
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
38
  	atomic_set(&sem->count, val);
aa3a6f456   Arthur Othieno   [PATCH] xtensa: s...
39
  	sem->sleepers = 0;
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
40
  	init_waitqueue_head(&sem->wait);
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  }
  
  static inline void init_MUTEX (struct semaphore *sem)
  {
  	sema_init(sem, 1);
  }
  
  static inline void init_MUTEX_LOCKED (struct semaphore *sem)
  {
  	sema_init(sem, 0);
  }
  
  asmlinkage void __down(struct semaphore * sem);
  asmlinkage int  __down_interruptible(struct semaphore * sem);
  asmlinkage int  __down_trylock(struct semaphore * sem);
  asmlinkage void __up(struct semaphore * sem);
  
  extern spinlock_t semaphore_wake_lock;
d99cf715a   Adrian Bunk   [PATCH] xtensa: r...
59
  static inline void down(struct semaphore * sem)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
60
  {
288a60cf4   Chris Zankel   [PATCH] xtensa: r...
61
  	might_sleep();
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
62
63
64
65
  
  	if (atomic_sub_return(1, &sem->count) < 0)
  		__down(sem);
  }
d99cf715a   Adrian Bunk   [PATCH] xtensa: r...
66
  static inline int down_interruptible(struct semaphore * sem)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
67
68
  {
  	int ret = 0;
288a60cf4   Chris Zankel   [PATCH] xtensa: r...
69
70
  
  	might_sleep();
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
71
72
73
74
75
  
  	if (atomic_sub_return(1, &sem->count) < 0)
  		ret = __down_interruptible(sem);
  	return ret;
  }
d99cf715a   Adrian Bunk   [PATCH] xtensa: r...
76
  static inline int down_trylock(struct semaphore * sem)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
77
78
  {
  	int ret = 0;
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
79
80
81
82
83
84
85
86
87
88
  
  	if (atomic_sub_return(1, &sem->count) < 0)
  		ret = __down_trylock(sem);
  	return ret;
  }
  
  /*
   * Note! This is subtle. We jump to wake people up only if
   * the semaphore was negative (== somebody was waiting on it).
   */
d99cf715a   Adrian Bunk   [PATCH] xtensa: r...
89
  static inline void up(struct semaphore * sem)
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
90
  {
9a8fd5589   Chris Zankel   [PATCH] xtensa: A...
91
92
93
94
95
  	if (atomic_add_return(1, &sem->count) <= 0)
  		__up(sem);
  }
  
  #endif /* _XTENSA_SEMAPHORE_H */