summaryrefslogtreecommitdiffstats
path: root/include/asm-generic/bitio.h
blob: 99b85da59c6db221b1d7f63f1419c410d46afa2f (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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// SPDX-License-Identifier: GPL-2.0-only

#ifndef __ASM_GENERIC_BITIO_H
#define __ASM_GENERIC_BITIO_H

#include <asm/io.h>

/*
 * Clear and set bits in one shot. These macros can be used to clear and
 * set multiple bits in a register using a single call. These macros can
 * also be used to set a multiple-bit bit pattern using a mask, by
 * specifying the mask in the 'clear' parameter and the new bit pattern
 * in the 'set' parameter.
 */

#ifndef out_arch
#define out_arch(type,endian,a,v)	__raw_write##type(cpu_to_##endian(v),a)
#endif

#ifndef in_arch
#define in_arch(type,endian,a)		endian##_to_cpu(__raw_read##type(a))
#endif

#ifndef out_le64
#define out_le64(a,v)	out_arch(q,le64,a,v)
#endif

#ifndef out_le32
#define out_le32(a,v)	out_arch(l,le32,a,v)
#endif

#ifndef out_le16
#define out_le16(a,v)	out_arch(w,le16,a,v)
#endif

#ifndef in_le64
#define in_le64(a)	in_arch(q,le64,a)
#endif

#ifndef in_le32
#define in_le32(a)	in_arch(l,le32,a)
#endif

#ifndef in_le16
#define in_le16(a)	in_arch(w,le16,a)
#endif

#ifndef out_be32
#define out_be32(a,v)	out_arch(l,be32,a,v)
#endif

#ifndef out_be16
#define out_be16(a,v)	out_arch(w,be16,a,v)
#endif

#ifndef in_be32
#define in_be32(a)	in_arch(l,be32,a)
#endif

#ifndef in_be16
#define in_be16(a)	in_arch(w,be16,a)
#endif

#ifndef out_8
#define out_8(a,v)	__raw_writeb(v,a)
#endif

#ifndef in_8
#define in_8(a)		__raw_readb(a)
#endif

#ifndef clrbits
#define clrbits(type, addr, clear) \
	out_##type((addr), in_##type(addr) & ~(clear))
#endif

#ifndef setbits
#define setbits(type, addr, set) \
	out_##type((addr), in_##type(addr) | (set))
#endif

#define clrsetbits(type, addr, clear, set) \
	out_##type((addr), (in_##type(addr) & ~(clear)) | (set))

#ifndef clrbits_be32
#define clrbits_be32(addr, clear) clrbits(be32, addr, clear)
#endif

#ifndef setbits_be32
#define setbits_be32(addr, set) setbits(be32, addr, set)
#endif

#ifndef clrsetbits_be32
#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
#endif

#ifndef clrbits_le32
#define clrbits_le32(addr, clear) clrbits(le32, addr, clear)
#endif

#ifndef setbits_le32
#define setbits_le32(addr, set) setbits(le32, addr, set)
#endif

#ifndef clrsetbits_le32
#define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
#endif

#ifndef clrbits_be16
#define clrbits_be16(addr, clear) clrbits(be16, addr, clear)
#endif

#ifndef setbits_be16
#define setbits_be16(addr, set) setbits(be16, addr, set)
#endif

#ifndef clrsetbits_be16
#define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
#endif

#ifndef clrbits_le16
#define clrbits_le16(addr, clear) clrbits(le16, addr, clear)
#endif

#ifndef setbits_le16
#define setbits_le16(addr, set) setbits(le16, addr, set)
#endif

#ifndef clrsetbits_le16
#define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set)
#endif

#ifndef clrbits_8
#define clrbits_8(addr, clear) clrbits(8, addr, clear)
#endif

#ifndef setbits_8
#define setbits_8(addr, set) setbits(8, addr, set)
#endif

#ifndef clrsetbits_8
#define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
#endif

#endif /* __ASM_GENERIC_IO_H */