2
* (C) Copyright 2010 Samsung Electronics
3
* Minkyu Kang <mk7.kang@samsung.com>
5
* SPDX-License-Identifier: GPL-2.0+
8
#ifndef __ASM_ARCH_GPIO_H
9
#define __ASM_ARCH_GPIO_H
12
struct s5p_gpio_bank {
18
unsigned int pdn_pull;
19
unsigned char res1[8];
22
struct exynos4_gpio_part1 {
23
struct s5p_gpio_bank a0;
24
struct s5p_gpio_bank a1;
25
struct s5p_gpio_bank b;
26
struct s5p_gpio_bank c0;
27
struct s5p_gpio_bank c1;
28
struct s5p_gpio_bank d0;
29
struct s5p_gpio_bank d1;
30
struct s5p_gpio_bank e0;
31
struct s5p_gpio_bank e1;
32
struct s5p_gpio_bank e2;
33
struct s5p_gpio_bank e3;
34
struct s5p_gpio_bank e4;
35
struct s5p_gpio_bank f0;
36
struct s5p_gpio_bank f1;
37
struct s5p_gpio_bank f2;
38
struct s5p_gpio_bank f3;
41
struct exynos4_gpio_part2 {
42
struct s5p_gpio_bank j0;
43
struct s5p_gpio_bank j1;
44
struct s5p_gpio_bank k0;
45
struct s5p_gpio_bank k1;
46
struct s5p_gpio_bank k2;
47
struct s5p_gpio_bank k3;
48
struct s5p_gpio_bank l0;
49
struct s5p_gpio_bank l1;
50
struct s5p_gpio_bank l2;
51
struct s5p_gpio_bank y0;
52
struct s5p_gpio_bank y1;
53
struct s5p_gpio_bank y2;
54
struct s5p_gpio_bank y3;
55
struct s5p_gpio_bank y4;
56
struct s5p_gpio_bank y5;
57
struct s5p_gpio_bank y6;
58
struct s5p_gpio_bank res1[80];
59
struct s5p_gpio_bank x0;
60
struct s5p_gpio_bank x1;
61
struct s5p_gpio_bank x2;
62
struct s5p_gpio_bank x3;
65
struct exynos4_gpio_part3 {
66
struct s5p_gpio_bank z;
69
struct exynos4x12_gpio_part1 {
70
struct s5p_gpio_bank a0;
71
struct s5p_gpio_bank a1;
72
struct s5p_gpio_bank b;
73
struct s5p_gpio_bank c0;
74
struct s5p_gpio_bank c1;
75
struct s5p_gpio_bank d0;
76
struct s5p_gpio_bank d1;
77
struct s5p_gpio_bank res1[0x5];
78
struct s5p_gpio_bank f0;
79
struct s5p_gpio_bank f1;
80
struct s5p_gpio_bank f2;
81
struct s5p_gpio_bank f3;
82
struct s5p_gpio_bank res2[0x2];
83
struct s5p_gpio_bank j0;
84
struct s5p_gpio_bank j1;
87
struct exynos4x12_gpio_part2 {
88
struct s5p_gpio_bank res1[0x2];
89
struct s5p_gpio_bank k0;
90
struct s5p_gpio_bank k1;
91
struct s5p_gpio_bank k2;
92
struct s5p_gpio_bank k3;
93
struct s5p_gpio_bank l0;
94
struct s5p_gpio_bank l1;
95
struct s5p_gpio_bank l2;
96
struct s5p_gpio_bank y0;
97
struct s5p_gpio_bank y1;
98
struct s5p_gpio_bank y2;
99
struct s5p_gpio_bank y3;
100
struct s5p_gpio_bank y4;
101
struct s5p_gpio_bank y5;
102
struct s5p_gpio_bank y6;
103
struct s5p_gpio_bank res2[0x3];
104
struct s5p_gpio_bank m0;
105
struct s5p_gpio_bank m1;
106
struct s5p_gpio_bank m2;
107
struct s5p_gpio_bank m3;
108
struct s5p_gpio_bank m4;
109
struct s5p_gpio_bank res3[0x48];
110
struct s5p_gpio_bank x0;
111
struct s5p_gpio_bank x1;
112
struct s5p_gpio_bank x2;
113
struct s5p_gpio_bank x3;
116
struct exynos4x12_gpio_part3 {
117
struct s5p_gpio_bank z;
120
struct exynos4x12_gpio_part4 {
121
struct s5p_gpio_bank v0;
122
struct s5p_gpio_bank v1;
123
struct s5p_gpio_bank res1[0x1];
124
struct s5p_gpio_bank v2;
125
struct s5p_gpio_bank v3;
126
struct s5p_gpio_bank res2[0x1];
127
struct s5p_gpio_bank v4;
130
struct exynos5420_gpio_part1 {
131
struct s5p_gpio_bank a0;
132
struct s5p_gpio_bank a1;
133
struct s5p_gpio_bank a2;
134
struct s5p_gpio_bank b0;
135
struct s5p_gpio_bank b1;
136
struct s5p_gpio_bank b2;
137
struct s5p_gpio_bank b3;
138
struct s5p_gpio_bank b4;
139
struct s5p_gpio_bank h0;
142
struct exynos5420_gpio_part2 {
143
struct s5p_gpio_bank y7; /* 0x1340_0000 */
144
struct s5p_gpio_bank res[0x5f]; /* */
145
struct s5p_gpio_bank x0; /* 0x1340_0C00 */
146
struct s5p_gpio_bank x1; /* 0x1340_0C20 */
147
struct s5p_gpio_bank x2; /* 0x1340_0C40 */
148
struct s5p_gpio_bank x3; /* 0x1340_0C60 */
151
struct exynos5420_gpio_part3 {
152
struct s5p_gpio_bank c0;
153
struct s5p_gpio_bank c1;
154
struct s5p_gpio_bank c2;
155
struct s5p_gpio_bank c3;
156
struct s5p_gpio_bank c4;
157
struct s5p_gpio_bank d1;
158
struct s5p_gpio_bank y0;
159
struct s5p_gpio_bank y1;
160
struct s5p_gpio_bank y2;
161
struct s5p_gpio_bank y3;
162
struct s5p_gpio_bank y4;
163
struct s5p_gpio_bank y5;
164
struct s5p_gpio_bank y6;
167
struct exynos5420_gpio_part4 {
168
struct s5p_gpio_bank e0; /* 0x1400_0000 */
169
struct s5p_gpio_bank e1; /* 0x1400_0020 */
170
struct s5p_gpio_bank f0; /* 0x1400_0040 */
171
struct s5p_gpio_bank f1; /* 0x1400_0060 */
172
struct s5p_gpio_bank g0; /* 0x1400_0080 */
173
struct s5p_gpio_bank g1; /* 0x1400_00A0 */
174
struct s5p_gpio_bank g2; /* 0x1400_00C0 */
175
struct s5p_gpio_bank j4; /* 0x1400_00E0 */
178
struct exynos5420_gpio_part5 {
179
struct s5p_gpio_bank z0; /* 0x0386_0000 */
182
struct exynos5_gpio_part1 {
183
struct s5p_gpio_bank a0;
184
struct s5p_gpio_bank a1;
185
struct s5p_gpio_bank a2;
186
struct s5p_gpio_bank b0;
187
struct s5p_gpio_bank b1;
188
struct s5p_gpio_bank b2;
189
struct s5p_gpio_bank b3;
190
struct s5p_gpio_bank c0;
191
struct s5p_gpio_bank c1;
192
struct s5p_gpio_bank c2;
193
struct s5p_gpio_bank c3;
194
struct s5p_gpio_bank d0;
195
struct s5p_gpio_bank d1;
196
struct s5p_gpio_bank y0;
197
struct s5p_gpio_bank y1;
198
struct s5p_gpio_bank y2;
199
struct s5p_gpio_bank y3;
200
struct s5p_gpio_bank y4;
201
struct s5p_gpio_bank y5;
202
struct s5p_gpio_bank y6;
203
struct s5p_gpio_bank res1[0x3];
204
struct s5p_gpio_bank c4;
205
struct s5p_gpio_bank res2[0x48];
206
struct s5p_gpio_bank x0;
207
struct s5p_gpio_bank x1;
208
struct s5p_gpio_bank x2;
209
struct s5p_gpio_bank x3;
212
struct exynos5_gpio_part2 {
213
struct s5p_gpio_bank e0;
214
struct s5p_gpio_bank e1;
215
struct s5p_gpio_bank f0;
216
struct s5p_gpio_bank f1;
217
struct s5p_gpio_bank g0;
218
struct s5p_gpio_bank g1;
219
struct s5p_gpio_bank g2;
220
struct s5p_gpio_bank h0;
221
struct s5p_gpio_bank h1;
224
struct exynos5_gpio_part3 {
225
struct s5p_gpio_bank v0;
226
struct s5p_gpio_bank v1;
227
struct s5p_gpio_bank res1[0x1];
228
struct s5p_gpio_bank v2;
229
struct s5p_gpio_bank v3;
230
struct s5p_gpio_bank res2[0x1];
231
struct s5p_gpio_bank v4;
234
struct exynos5_gpio_part4 {
235
struct s5p_gpio_bank z;
239
void s5p_gpio_cfg_pin(struct s5p_gpio_bank *bank, int gpio, int cfg);
240
void s5p_gpio_direction_output(struct s5p_gpio_bank *bank, int gpio, int en);
241
void s5p_gpio_direction_input(struct s5p_gpio_bank *bank, int gpio);
242
void s5p_gpio_set_value(struct s5p_gpio_bank *bank, int gpio, int en);
243
unsigned int s5p_gpio_get_value(struct s5p_gpio_bank *bank, int gpio);
244
void s5p_gpio_set_pull(struct s5p_gpio_bank *bank, int gpio, int mode);
245
void s5p_gpio_set_drv(struct s5p_gpio_bank *bank, int gpio, int mode);
246
void s5p_gpio_set_rate(struct s5p_gpio_bank *bank, int gpio, int mode);
248
/* GPIO pins per bank */
249
#define GPIO_PER_BANK 8
250
#define S5P_GPIO_PART_SHIFT (24)
251
#define S5P_GPIO_PART_MASK (0xff)
252
#define S5P_GPIO_BANK_SHIFT (8)
253
#define S5P_GPIO_BANK_MASK (0xffff)
254
#define S5P_GPIO_PIN_MASK (0xff)
256
#define S5P_GPIO_SET_PART(x) \
257
(((x) & S5P_GPIO_PART_MASK) << S5P_GPIO_PART_SHIFT)
259
#define S5P_GPIO_GET_PART(x) \
260
(((x) >> S5P_GPIO_PART_SHIFT) & S5P_GPIO_PART_MASK)
262
#define S5P_GPIO_SET_PIN(x) \
263
((x) & S5P_GPIO_PIN_MASK)
265
#define EXYNOS4_GPIO_SET_BANK(part, bank) \
266
((((unsigned)&(((struct exynos4_gpio_part##part *) \
267
EXYNOS4_GPIO_PART##part##_BASE)->bank) \
268
- EXYNOS4_GPIO_PART##part##_BASE) \
269
& S5P_GPIO_BANK_MASK) << S5P_GPIO_BANK_SHIFT)
271
#define EXYNOS4X12_GPIO_SET_BANK(part, bank) \
272
((((unsigned)&(((struct exynos4x12_gpio_part##part *) \
273
EXYNOS4X12_GPIO_PART##part##_BASE)->bank) \
274
- EXYNOS4X12_GPIO_PART##part##_BASE) \
275
& S5P_GPIO_BANK_MASK) << S5P_GPIO_BANK_SHIFT)
277
#define EXYNOS5_GPIO_SET_BANK(part, bank) \
278
((((unsigned)&(((struct exynos5420_gpio_part##part *) \
279
EXYNOS5420_GPIO_PART##part##_BASE)->bank) \
280
- EXYNOS5_GPIO_PART##part##_BASE) \
281
& S5P_GPIO_BANK_MASK) << S5P_GPIO_BANK_SHIFT)
283
#define EXYNOS5420_GPIO_SET_BANK(part, bank) \
284
((((unsigned)&(((struct exynos5420_gpio_part##part *) \
285
EXYNOS5420_GPIO_PART##part##_BASE)->bank) \
286
- EXYNOS5420_GPIO_PART##part##_BASE) \
287
& S5P_GPIO_BANK_MASK) << S5P_GPIO_BANK_SHIFT)
289
#define exynos4_gpio_get(part, bank, pin) \
290
(S5P_GPIO_SET_PART(part) | \
291
EXYNOS4_GPIO_SET_BANK(part, bank) | \
292
S5P_GPIO_SET_PIN(pin))
294
#define exynos4x12_gpio_get(part, bank, pin) \
295
(S5P_GPIO_SET_PART(part) | \
296
EXYNOS4X12_GPIO_SET_BANK(part, bank) | \
297
S5P_GPIO_SET_PIN(pin))
299
#define exynos5420_gpio_get(part, bank, pin) \
300
(S5P_GPIO_SET_PART(part) | \
301
EXYNOS5420_GPIO_SET_BANK(part, bank) | \
302
S5P_GPIO_SET_PIN(pin))
304
#define exynos5_gpio_get(part, bank, pin) \
305
(S5P_GPIO_SET_PART(part) | \
306
EXYNOS5_GPIO_SET_BANK(part, bank) | \
307
S5P_GPIO_SET_PIN(pin))
309
static inline unsigned int s5p_gpio_base(int gpio)
311
unsigned gpio_part = S5P_GPIO_GET_PART(gpio);
315
return samsung_get_base_gpio_part1();
317
return samsung_get_base_gpio_part2();
319
return samsung_get_base_gpio_part3();
321
return samsung_get_base_gpio_part4();
328
/* Pin configurations */
329
#define GPIO_INPUT 0x0
330
#define GPIO_OUTPUT 0x1
332
#define GPIO_FUNC(x) (x)
335
#define GPIO_PULL_NONE 0x0
336
#define GPIO_PULL_DOWN 0x1
337
#define GPIO_PULL_UP 0x3
339
/* Drive Strength level */
340
#define GPIO_DRV_1X 0x0
341
#define GPIO_DRV_3X 0x1
342
#define GPIO_DRV_2X 0x2
343
#define GPIO_DRV_4X 0x3
344
#define GPIO_DRV_FAST 0x0
345
#define GPIO_DRV_SLOW 0x1