MIPS: BCM63xx: Add serial driver for bcm63xx integrated UART.
[safe/jmp/linux-2.6] / include / linux / spinlock.h
index 252b245..f0ca7a7 100644 (file)
@@ -132,21 +132,17 @@ do {                                                              \
 #endif /*__raw_spin_is_contended*/
 #endif
 
+/* The lock does not imply full memory barrier. */
+#ifndef ARCH_HAS_SMP_MB_AFTER_LOCK
+static inline void smp_mb__after_lock(void) { smp_mb(); }
+#endif
+
 /**
  * spin_unlock_wait - wait until the spinlock gets unlocked
  * @lock: the spinlock in question.
  */
 #define spin_unlock_wait(lock) __raw_spin_unlock_wait(&(lock)->raw_lock)
 
-/*
- * Pull the _spin_*()/_read_*()/_write_*() functions/declarations:
- */
-#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
-# include <linux/spinlock_api_smp.h>
-#else
-# include <linux/spinlock_api_up.h>
-#endif
-
 #ifdef CONFIG_DEBUG_SPINLOCK
  extern void _raw_spin_lock(spinlock_t *lock);
 #define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
@@ -263,50 +259,16 @@ do {                                                              \
 
 #define spin_lock_irq(lock)            _spin_lock_irq(lock)
 #define spin_lock_bh(lock)             _spin_lock_bh(lock)
-
 #define read_lock_irq(lock)            _read_lock_irq(lock)
 #define read_lock_bh(lock)             _read_lock_bh(lock)
-
 #define write_lock_irq(lock)           _write_lock_irq(lock)
 #define write_lock_bh(lock)            _write_lock_bh(lock)
-
-/*
- * We inline the unlock functions in the nondebug case:
- */
-#if defined(CONFIG_DEBUG_SPINLOCK) || defined(CONFIG_PREEMPT) || \
-       !defined(CONFIG_SMP)
-# define spin_unlock(lock)             _spin_unlock(lock)
-# define read_unlock(lock)             _read_unlock(lock)
-# define write_unlock(lock)            _write_unlock(lock)
-# define spin_unlock_irq(lock)         _spin_unlock_irq(lock)
-# define read_unlock_irq(lock)         _read_unlock_irq(lock)
-# define write_unlock_irq(lock)                _write_unlock_irq(lock)
-#else
-# define spin_unlock(lock) \
-    do {__raw_spin_unlock(&(lock)->raw_lock); __release(lock); } while (0)
-# define read_unlock(lock) \
-    do {__raw_read_unlock(&(lock)->raw_lock); __release(lock); } while (0)
-# define write_unlock(lock) \
-    do {__raw_write_unlock(&(lock)->raw_lock); __release(lock); } while (0)
-# define spin_unlock_irq(lock)                 \
-do {                                           \
-       __raw_spin_unlock(&(lock)->raw_lock);   \
-       __release(lock);                        \
-       local_irq_enable();                     \
-} while (0)
-# define read_unlock_irq(lock)                 \
-do {                                           \
-       __raw_read_unlock(&(lock)->raw_lock);   \
-       __release(lock);                        \
-       local_irq_enable();                     \
-} while (0)
-# define write_unlock_irq(lock)                        \
-do {                                           \
-       __raw_write_unlock(&(lock)->raw_lock);  \
-       __release(lock);                        \
-       local_irq_enable();                     \
-} while (0)
-#endif
+#define spin_unlock(lock)              _spin_unlock(lock)
+#define read_unlock(lock)              _read_unlock(lock)
+#define write_unlock(lock)             _write_unlock(lock)
+#define spin_unlock_irq(lock)          _spin_unlock_irq(lock)
+#define read_unlock_irq(lock)          _read_unlock_irq(lock)
+#define write_unlock_irq(lock)         _write_unlock_irq(lock)
 
 #define spin_unlock_irqrestore(lock, flags)            \
        do {                                            \
@@ -375,4 +337,13 @@ extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock);
  */
 #define spin_can_lock(lock)    (!spin_is_locked(lock))
 
+/*
+ * Pull the _spin_*()/_read_*()/_write_*() functions/declarations:
+ */
+#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
+# include <linux/spinlock_api_smp.h>
+#else
+# include <linux/spinlock_api_up.h>
+#endif
+
 #endif /* __LINUX_SPINLOCK_H */