@ -21,6 +21,11 @@
# endif
typedef struct { volatile int counter ; } atomic_t ;
# if BITS_PER_LONG == 32
typedef struct { volatile long long counter ; } atomic64_t ;
# else /* BIT_PER_LONG == 32 */
typedef struct { volatile long counter ; } atomic64_t ;
# endif
# define ATOMIC_INIT(i) { (i) }
@ -28,7 +33,9 @@ typedef struct { volatile int counter; } atomic_t;
# include <asm/proc-armv/system.h>
# define atomic_read(v) ((v)->counter)
# define atomic_set(v,i) (((v)->counter) = (i))
# define atomic_set(v, i) (((v)->counter) = (i))
# define atomic64_read(v) atomic_read(v)
# define atomic64_set(v, i) atomic_set(v, i)
static inline void atomic_add ( int i , volatile atomic_t * v )
{
@ -101,6 +108,65 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
local_irq_restore ( flags ) ;
}
# if BITS_PER_LONG == 32
static inline void atomic64_add ( long long i , volatile atomic64_t * v )
{
unsigned long flags = 0 ;
local_irq_save ( flags ) ;
v - > counter + = i ;
local_irq_restore ( flags ) ;
}
static inline void atomic64_sub ( long long i , volatile atomic64_t * v )
{
unsigned long flags = 0 ;
local_irq_save ( flags ) ;
v - > counter - = i ;
local_irq_restore ( flags ) ;
}
# else /* BIT_PER_LONG == 32 */
static inline void atomic64_add ( long i , volatile atomic64_t * v )
{
unsigned long flags = 0 ;
local_irq_save ( flags ) ;
v - > counter + = i ;
local_irq_restore ( flags ) ;
}
static inline void atomic64_sub ( long i , volatile atomic64_t * v )
{
unsigned long flags = 0 ;
local_irq_save ( flags ) ;
v - > counter - = i ;
local_irq_restore ( flags ) ;
}
# endif
static inline void atomic64_inc ( volatile atomic64_t * v )
{
unsigned long flags = 0 ;
local_irq_save ( flags ) ;
v - > counter + = 1 ;
local_irq_restore ( flags ) ;
}
static inline void atomic64_dec ( volatile atomic64_t * v )
{
unsigned long flags = 0 ;
local_irq_save ( flags ) ;
v - > counter - = 1 ;
local_irq_restore ( flags ) ;
}
/* Atomic operations are already serializing on ARM */
# define smp_mb__before_atomic_dec() barrier()
# define smp_mb__after_atomic_dec() barrier()