1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * linux/include/asm-arm/atomic.h 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 1996 Russell King. 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 2002 Deep Blue Solutions Ltd. 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This program is free software; you can redistribute it and/or modify 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it under the terms of the GNU General Public License version 2 as 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * published by the Free Software Foundation. 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __ASM_ARM_ATOMIC_H 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __ASM_ARM_ATOMIC_H 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/compiler.h> 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct { volatile int counter; } atomic_t; 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ATOMIC_INIT(i) { (i) } 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_read(v) ((v)->counter) 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if __LINUX_ARM_ARCH__ >= 6 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ARMv6 UP and SMP safe atomic ops. We use load exclusive and 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * store exclusive to ensure that these are atomic. We may loop 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to ensure that the update happens. Writing to 'v->counter' 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * without using the following operations WILL break the atomic 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * nature of these ops. 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void atomic_set(atomic_t *v, int i) 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tmp; 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__("@ atomic_set\n" 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1: ldrex %0, [%1]\n" 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" strex %0, %2, [%1]\n" 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq %0, #0\n" 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bne 1b" 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&r" (tmp) 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (&v->counter), "r" (i) 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "cc"); 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_add_return(int i, atomic_t *v) 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tmp; 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int result; 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__("@ atomic_add_return\n" 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1: ldrex %0, [%2]\n" 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" add %0, %0, %3\n" 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" strex %1, %0, [%2]\n" 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq %1, #0\n" 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bne 1b" 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&r" (result), "=&r" (tmp) 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (&v->counter), "Ir" (i) 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "cc"); 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return result; 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_sub_return(int i, atomic_t *v) 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tmp; 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int result; 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__("@ atomic_sub_return\n" 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1: ldrex %0, [%2]\n" 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" sub %0, %0, %3\n" 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" strex %1, %0, [%2]\n" 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq %1, #0\n" 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bne 1b" 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&r" (result), "=&r" (tmp) 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (&v->counter), "Ir" (i) 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "cc"); 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return result; 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_cmpxchg(atomic_t *ptr, int old, int new) 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long oldval, res; 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru do { 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__("@ atomic_cmpxchg\n" 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "ldrex %1, [%2]\n" 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "mov %0, #0\n" 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "teq %1, %3\n" 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "strexeq %0, %4, [%2]\n" 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&r" (res), "=&r" (oldval) 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (&ptr->counter), "Ir" (old), "r" (new) 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "cc"); 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } while (res); 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return oldval; 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tmp, tmp2; 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__("@ atomic_clear_mask\n" 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru"1: ldrex %0, %2\n" 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bic %0, %0, %3\n" 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" strex %1, %0, %2\n" 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" teq %1, #0\n" 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru" bne 1b" 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&r" (tmp), "=&r" (tmp2) 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "r" (addr), "Ir" (mask) 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "cc"); 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* ARM_ARCH_6 */ 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/system.h> 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#error SMP not supported on pre-ARMv6 CPUs 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_set(v,i) (((v)->counter) = (i)) 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_add_return(int i, atomic_t *v) 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags; 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int val; 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_save(flags); 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru val = v->counter; 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru v->counter = val += i; 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_restore(flags); 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return val; 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_sub_return(int i, atomic_t *v) 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags; 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int val; 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_save(flags); 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru val = v->counter; 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru v->counter = val -= i; 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_restore(flags); 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return val; 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_cmpxchg(atomic_t *v, int old, int new) 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int ret; 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags; 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_save(flags); 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret = v->counter; 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (likely(ret == old)) 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru v->counter = new; 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_restore(flags); 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags; 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_save(flags); 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *addr &= ~mask; 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_restore(flags); 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __LINUX_ARM_ARCH__ */ 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_xchg(v, new) (xchg(&((v)->counter), new)) 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int atomic_add_unless(atomic_t *v, int a, int u) 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int c, old; 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru c = atomic_read(v); 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru while (c != u && (old = atomic_cmpxchg((v), c, c + a)) != c) 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru c = old; 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return c != u; 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_add(i, v) (void) atomic_add_return(i, v) 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_inc(v) (void) atomic_add_return(1, v) 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_sub(i, v) (void) atomic_sub_return(i, v) 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_dec(v) (void) atomic_sub_return(1, v) 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0) 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0) 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_inc_return(v) (atomic_add_return(1, v)) 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_dec_return(v) (atomic_sub_return(1, v)) 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0) 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0) 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Atomic operations are already serializing on ARM */ 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define smp_mb__before_atomic_dec() barrier() 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define smp_mb__after_atomic_dec() barrier() 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define smp_mb__before_atomic_inc() barrier() 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define smp_mb__after_atomic_inc() barrier() 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm-generic/atomic.h> 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 212