summaryrefslogtreecommitdiffstats
path: root/m168_firmware/atomic.h
blob: e88283eed42f3156ed890a55a9cbcc13ad337ebe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#ifndef WIFI_ATOMIC_H_
#define WIFI_ATOMIC_H_

#include "util.h"


static inline void __atomic_bit_clear(uint8_t *d, const uint8_t bit)
{
	*d &= ~(1 << bit);
}

static inline void atomic_bit_clear(uint8_t *d, const uint8_t bit)
{
	uint8_t sreg = irq_disable_save();
	__atomic_bit_clear(d, bit);
	irq_restore(sreg);
}


static inline void __atomic_bit_set(uint8_t *d, const uint8_t bit)
{
	*d |= (1 << bit);
}

static inline void atomic_bit_set(uint8_t *d, const uint8_t bit)
{
	uint8_t sreg = irq_disable_save();
	__atomic_bit_set(d, bit);
	irq_restore(sreg);
}


static inline void __atomic_bit_flip(uint8_t *d, const uint8_t bit)
{
	*d ^= (1 << bit);
}

static inline void atomic_bit_flip(uint8_t *d, const uint8_t bit)
{
	uint8_t sreg = irq_disable_save();
	__atomic_bit_flip(d, bit);
	irq_restore(sreg);
}

static inline bool __atomic_bit_test(const uint8_t *d, const uint8_t bit)
{
	return !!(*d & (1 << bit));
}

static inline bool atomic_bit_test(const uint8_t *d, const uint8_t bit)
{
	/* Reading an 8bit value from SRAM is atomic.
	 * No need to disable IRQs. */
	return __atomic_bit_test(d, bit);
}


static inline bool atomic_bit_test_and_clear(uint8_t *d, const uint8_t bit)
{
	uint8_t sreg;
	bool result;

	sreg = irq_disable_save();
	result = __atomic_bit_test(d, bit);
	__atomic_bit_clear(d, bit);
	irq_restore(sreg);

	return result;
}


#endif /* WIFI_ATOMIC_H_ */
bues.ch cgit interface