atomic-irq.h 1.3 KB
Newer Older
P
Paul Mundt 已提交
1 2 3 4 5 6 7 8 9 10 11 12
#ifndef __ASM_SH_ATOMIC_IRQ_H
#define __ASM_SH_ATOMIC_IRQ_H

/*
 * To get proper branch prediction for the main line, we must branch
 * forward to code at the end of this object's .text section, then
 * branch back to restart the operation.
 */
static inline void atomic_add(int i, atomic_t *v)
{
	unsigned long flags;

13
	raw_local_irq_save(flags);
14
	v->counter += i;
15
	raw_local_irq_restore(flags);
P
Paul Mundt 已提交
16 17 18 19 20 21
}

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

22
	raw_local_irq_save(flags);
23
	v->counter -= i;
24
	raw_local_irq_restore(flags);
P
Paul Mundt 已提交
25 26 27 28 29 30
}

static inline int atomic_add_return(int i, atomic_t *v)
{
	unsigned long temp, flags;

31
	raw_local_irq_save(flags);
32
	temp = v->counter;
P
Paul Mundt 已提交
33
	temp += i;
34
	v->counter = temp;
35
	raw_local_irq_restore(flags);
P
Paul Mundt 已提交
36 37 38 39 40 41 42 43

	return temp;
}

static inline int atomic_sub_return(int i, atomic_t *v)
{
	unsigned long temp, flags;

44
	raw_local_irq_save(flags);
45
	temp = v->counter;
P
Paul Mundt 已提交
46
	temp -= i;
47
	v->counter = temp;
48
	raw_local_irq_restore(flags);
P
Paul Mundt 已提交
49 50 51 52 53 54 55 56

	return temp;
}

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

57
	raw_local_irq_save(flags);
58
	v->counter &= ~mask;
59
	raw_local_irq_restore(flags);
P
Paul Mundt 已提交
60 61 62 63 64 65
}

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

66
	raw_local_irq_save(flags);
67
	v->counter |= mask;
68
	raw_local_irq_restore(flags);
P
Paul Mundt 已提交
69 70 71
}

#endif /* __ASM_SH_ATOMIC_IRQ_H */