at v2.6.12 93 lines 2.5 kB view raw
1/* 2 * linux/include/asm-arm26/atomic.h 3 * 4 * Copyright (c) 1996 Russell King. 5 * Modified for arm26 by Ian Molton 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 * 11 * Changelog: 12 * 25-11-2004 IM Updated for 2.6.9 13 * 27-06-1996 RMK Created 14 * 13-04-1997 RMK Made functions atomic! 15 * 07-12-1997 RMK Upgraded for v2.1. 16 * 26-08-1998 PJB Added #ifdef __KERNEL__ 17 * 18 * FIXME - its probably worth seeing what these compile into... 19 */ 20#ifndef __ASM_ARM_ATOMIC_H 21#define __ASM_ARM_ATOMIC_H 22 23#include <linux/config.h> 24 25#ifdef CONFIG_SMP 26#error SMP is NOT supported 27#endif 28 29typedef struct { volatile int counter; } atomic_t; 30 31#define ATOMIC_INIT(i) { (i) } 32 33#ifdef __KERNEL__ 34#include <asm/system.h> 35 36#define atomic_read(v) ((v)->counter) 37#define atomic_set(v,i) (((v)->counter) = (i)) 38 39static inline int atomic_add_return(int i, atomic_t *v) 40{ 41 unsigned long flags; 42 int val; 43 44 local_irq_save(flags); 45 val = v->counter; 46 v->counter = val += i; 47 local_irq_restore(flags); 48 49 return val; 50} 51 52static inline int atomic_sub_return(int i, atomic_t *v) 53{ 54 unsigned long flags; 55 int val; 56 57 local_irq_save(flags); 58 val = v->counter; 59 v->counter = val -= i; 60 local_irq_restore(flags); 61 62 return val; 63} 64 65static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) 66{ 67 unsigned long flags; 68 69 local_irq_save(flags); 70 *addr &= ~mask; 71 local_irq_restore(flags); 72} 73 74#define atomic_add(i, v) (void) atomic_add_return(i, v) 75#define atomic_inc(v) (void) atomic_add_return(1, v) 76#define atomic_sub(i, v) (void) atomic_sub_return(i, v) 77#define atomic_dec(v) (void) atomic_sub_return(1, v) 78 79#define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0) 80#define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0) 81#define atomic_inc_return(v) (atomic_add_return(1, v)) 82#define atomic_dec_return(v) (atomic_sub_return(1, v)) 83 84#define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0) 85 86/* Atomic operations are already serializing on ARM26 */ 87#define smp_mb__before_atomic_dec() barrier() 88#define smp_mb__after_atomic_dec() barrier() 89#define smp_mb__before_atomic_inc() barrier() 90#define smp_mb__after_atomic_inc() barrier() 91 92#endif 93#endif