Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 127022
b: refs/heads/master
c: 6b3087c
h: refs/heads/master
v: v3
  • Loading branch information
Graf Yang authored and Bryan Wu committed Jan 7, 2009
1 parent 79852d6 commit 2fe4e35
Show file tree
Hide file tree
Showing 26 changed files with 1,436 additions and 193 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c51b4488cd5bff08ed5690a8f303ff7f0894da2a
refs/heads/master: 6b3087c64a92a36ae20d33479b4df6d7afc910d4
119 changes: 95 additions & 24 deletions trunk/arch/blackfin/include/asm/atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,80 @@
*/

#define ATOMIC_INIT(i) { (i) }

#define atomic_read(v) ((v)->counter)
#define atomic_set(v, i) (((v)->counter) = i)

static __inline__ void atomic_add(int i, atomic_t * v)
#ifdef CONFIG_SMP

#define atomic_read(v) __raw_uncached_fetch_asm(&(v)->counter)

asmlinkage int __raw_uncached_fetch_asm(const volatile int *ptr);

asmlinkage int __raw_atomic_update_asm(volatile int *ptr, int value);

asmlinkage int __raw_atomic_clear_asm(volatile int *ptr, int value);

asmlinkage int __raw_atomic_set_asm(volatile int *ptr, int value);

asmlinkage int __raw_atomic_xor_asm(volatile int *ptr, int value);

asmlinkage int __raw_atomic_test_asm(const volatile int *ptr, int value);

static inline void atomic_add(int i, atomic_t *v)
{
__raw_atomic_update_asm(&v->counter, i);
}

static inline void atomic_sub(int i, atomic_t *v)
{
__raw_atomic_update_asm(&v->counter, -i);
}

static inline int atomic_add_return(int i, atomic_t *v)
{
return __raw_atomic_update_asm(&v->counter, i);
}

static inline int atomic_sub_return(int i, atomic_t *v)
{
return __raw_atomic_update_asm(&v->counter, -i);
}

static inline void atomic_inc(volatile atomic_t *v)
{
__raw_atomic_update_asm(&v->counter, 1);
}

static inline void atomic_dec(volatile atomic_t *v)
{
__raw_atomic_update_asm(&v->counter, -1);
}

static inline void atomic_clear_mask(int mask, atomic_t *v)
{
__raw_atomic_clear_asm(&v->counter, mask);
}

static inline void atomic_set_mask(int mask, atomic_t *v)
{
__raw_atomic_set_asm(&v->counter, mask);
}

static inline int atomic_test_mask(int mask, atomic_t *v)
{
return __raw_atomic_test_asm(&v->counter, mask);
}

/* Atomic operations are already serializing */
#define smp_mb__before_atomic_dec() barrier()
#define smp_mb__after_atomic_dec() barrier()
#define smp_mb__before_atomic_inc() barrier()
#define smp_mb__after_atomic_inc() barrier()

#else /* !CONFIG_SMP */

#define atomic_read(v) ((v)->counter)

static inline void atomic_add(int i, atomic_t *v)
{
long flags;

Expand All @@ -28,7 +97,7 @@ static __inline__ void atomic_add(int i, atomic_t * v)
local_irq_restore(flags);
}

static __inline__ void atomic_sub(int i, atomic_t * v)
static inline void atomic_sub(int i, atomic_t *v)
{
long flags;

Expand All @@ -38,7 +107,7 @@ static __inline__ void atomic_sub(int i, atomic_t * v)

}

static inline int atomic_add_return(int i, atomic_t * v)
static inline int atomic_add_return(int i, atomic_t *v)
{
int __temp = 0;
long flags;
Expand All @@ -52,8 +121,7 @@ static inline int atomic_add_return(int i, atomic_t * v)
return __temp;
}

#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
static inline int atomic_sub_return(int i, atomic_t * v)
static inline int atomic_sub_return(int i, atomic_t *v)
{
int __temp = 0;
long flags;
Expand All @@ -66,7 +134,7 @@ static inline int atomic_sub_return(int i, atomic_t * v)
return __temp;
}

static __inline__ void atomic_inc(volatile atomic_t * v)
static inline void atomic_inc(volatile atomic_t *v)
{
long flags;

Expand All @@ -75,20 +143,7 @@ static __inline__ void atomic_inc(volatile atomic_t * v)
local_irq_restore(flags);
}

#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))

#define atomic_add_unless(v, a, u) \
({ \
int c, old; \
c = atomic_read(v); \
while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
c = old; \
c != (u); \
})
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)

static __inline__ void atomic_dec(volatile atomic_t * v)
static inline void atomic_dec(volatile atomic_t *v)
{
long flags;

Expand All @@ -97,7 +152,7 @@ static __inline__ void atomic_dec(volatile atomic_t * v)
local_irq_restore(flags);
}

static __inline__ void atomic_clear_mask(unsigned int mask, atomic_t * v)
static inline void atomic_clear_mask(unsigned int mask, atomic_t *v)
{
long flags;

Expand All @@ -106,7 +161,7 @@ static __inline__ void atomic_clear_mask(unsigned int mask, atomic_t * v)
local_irq_restore(flags);
}

static __inline__ void atomic_set_mask(unsigned int mask, atomic_t * v)
static inline void atomic_set_mask(unsigned int mask, atomic_t *v)
{
long flags;

Expand All @@ -121,9 +176,25 @@ static __inline__ void atomic_set_mask(unsigned int mask, atomic_t * v)
#define smp_mb__before_atomic_inc() barrier()
#define smp_mb__after_atomic_inc() barrier()

#endif /* !CONFIG_SMP */

#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
#define atomic_dec_return(v) atomic_sub_return(1,(v))
#define atomic_inc_return(v) atomic_add_return(1,(v))

#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n)))
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))

#define atomic_add_unless(v, a, u) \
({ \
int c, old; \
c = atomic_read(v); \
while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
c = old; \
c != (u); \
})
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)

/*
* atomic_inc_and_test - increment and test
* @v: pointer of type atomic_t
Expand Down
5 changes: 3 additions & 2 deletions trunk/arch/blackfin/include/asm/bfin-global.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@
# define DMA_UNCACHED_REGION (0)
#endif

extern void bfin_setup_caches(unsigned int cpu);
extern void bfin_setup_cpudata(unsigned int cpu);

extern unsigned long get_cclk(void);
extern unsigned long get_sclk(void);
extern unsigned long sclk_to_usecs(unsigned long sclk);
Expand All @@ -58,8 +61,6 @@ extern void dump_bfin_trace_buffer(void);

/* init functions only */
extern int init_arch_irq(void);
extern void bfin_icache_init(void);
extern void bfin_dcache_init(void);
extern void init_exception_vectors(void);
extern void program_IAR(void);

Expand Down
Loading

0 comments on commit 2fe4e35

Please sign in to comment.