1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __LINUX_SPINLOCK_UP_H
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __LINUX_SPINLOCK_UP_H
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __LINUX_SPINLOCK_H
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# error "please don't include this file directly"
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * include/linux/spinlock_up.h - UP-debug version of spinlocks.
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Released under the General Public License (GPL).
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * In the debug case, 1 means unlocked, 0 means locked. (the values
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * are inverted, to catch initialization bugs)
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * No atomicity anywhere, we are on UP.
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_DEBUG_SPINLOCK
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_spin_is_locked(x)		((x)->slock == 0)
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __raw_spin_lock(raw_spinlock_t *lock)
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	lock->slock = 0;
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	local_irq_save(flags);
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	lock->slock = 0;
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int __raw_spin_trylock(raw_spinlock_t *lock)
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	char oldval = lock->slock;
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	lock->slock = 0;
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return oldval > 0;
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __raw_spin_unlock(raw_spinlock_t *lock)
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	lock->slock = 1;
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Read-write spinlocks. No debug version.
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_read_lock(lock)		do { (void)(lock); } while (0)
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_write_lock(lock)		do { (void)(lock); } while (0)
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_read_trylock(lock)	({ (void)(lock); 1; })
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_write_trylock(lock)	({ (void)(lock); 1; })
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_read_unlock(lock)		do { (void)(lock); } while (0)
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_write_unlock(lock)	do { (void)(lock); } while (0)
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* DEBUG_SPINLOCK */
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_spin_is_locked(lock)	((void)(lock), 0)
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* for sched.c and kernel_lock.c: */
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define __raw_spin_lock(lock)		do { (void)(lock); } while (0)
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define __raw_spin_unlock(lock)	do { (void)(lock); } while (0)
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define __raw_spin_trylock(lock)	({ (void)(lock); 1; })
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* DEBUG_SPINLOCK */
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_read_can_lock(lock)	(((void)(lock), 1))
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_write_can_lock(lock)	(((void)(lock), 1))
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __raw_spin_unlock_wait(lock) \
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		do { cpu_relax(); } while (__raw_spin_is_locked(lock))
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __LINUX_SPINLOCK_UP_H */
74