drivers/wifi: Remove unnecessary data structure copy
[coreboot2.git] / src / soc / mediatek / mt8196 / gpio_eint.c
blobf24860d12844cc98c728cb1a7555e721c99fd243
1 /* SPDX-License-Identifier: GPL-2.0-only */
3 /*
4 * This file is created based on MT8196_EINT_Datasheet
5 * Chapter number: 1
6 */
8 #include <console/console.h>
9 #include <soc/addressmap.h>
10 #include <soc/gpio.h>
12 enum {
13 EINT_INVALID = 0,
14 EINT_E,
15 EINT_S,
16 EINT_W,
17 EINT_N,
18 EINT_C,
21 struct eint_info {
22 uint8_t instance;
23 uint8_t index;
26 static struct eint_info eint_data[] = {
27 /* instance, index */
28 [0] = { EINT_W, 0 },
29 [1] = { EINT_W, 1 },
30 [2] = { EINT_W, 16 },
31 [3] = { EINT_W, 17 },
32 [4] = { EINT_W, 2 },
33 [5] = { EINT_W, 3 },
34 [6] = { EINT_W, 4 },
35 [7] = { EINT_W, 5 },
36 [8] = { EINT_W, 6 },
37 [9] = { EINT_W, 18 },
38 [10] = { EINT_W, 7 },
39 [11] = { EINT_W, 8 },
40 [12] = { EINT_W, 9 },
41 [13] = { EINT_S, 4 },
42 [14] = { EINT_E, 0 },
43 [15] = { EINT_S, 5 },
44 [16] = { EINT_S, 6 },
45 [17] = { EINT_S, 7 },
46 [18] = { EINT_S, 8 },
47 [19] = { EINT_S, 9 },
48 [20] = { EINT_E, 1 },
49 [21] = { EINT_E, 10 },
50 [22] = { EINT_E, 11 },
51 [23] = { EINT_E, 12 },
52 [24] = { EINT_E, 13 },
53 [25] = { EINT_E, 14 },
54 [26] = { EINT_E, 15 },
55 [27] = { EINT_E, 2 },
56 [28] = { EINT_E, 16 },
57 [29] = { EINT_E, 17 },
58 [30] = { EINT_E, 18 },
59 [31] = { EINT_E, 3 },
60 [32] = { EINT_E, 19 },
61 [33] = { EINT_E, 20 },
62 [34] = { EINT_E, 21 },
63 [35] = { EINT_E, 22 },
64 [36] = { EINT_E, 23 },
65 [37] = { EINT_E, 24 },
66 [38] = { EINT_E, 25 },
67 [39] = { EINT_W, 10 },
68 [40] = { EINT_W, 11 },
69 [41] = { EINT_W, 12 },
70 [42] = { EINT_W, 13 },
71 [43] = { EINT_W, 14 },
72 [44] = { EINT_W, 19 },
73 [45] = { EINT_W, 20 },
74 [46] = { EINT_W, 21 },
75 [47] = { EINT_W, 22 },
76 [48] = { EINT_W, 23 },
77 [49] = { EINT_W, 24 },
78 [50] = { EINT_W, 25 },
79 [51] = { EINT_W, 26 },
80 [60] = { EINT_W, 27 },
81 [61] = { EINT_W, 28 },
82 [62] = { EINT_W, 29 },
83 [63] = { EINT_W, 30 },
84 [64] = { EINT_W, 31 },
85 [65] = { EINT_W, 32 },
86 [70] = { EINT_W, 33 },
87 [71] = { EINT_W, 34 },
88 [72] = { EINT_W, 35 },
89 [73] = { EINT_W, 36 },
90 [74] = { EINT_W, 37 },
91 [79] = { EINT_W, 38 },
92 [80] = { EINT_W, 39 },
93 [81] = { EINT_W, 40 },
94 [82] = { EINT_W, 41 },
95 [83] = { EINT_W, 42 },
96 [84] = { EINT_W, 43 },
97 [85] = { EINT_W, 44 },
98 [86] = { EINT_W, 45 },
99 [87] = { EINT_W, 46 },
100 [88] = { EINT_W, 47 },
101 [89] = { EINT_W, 48 },
102 [90] = { EINT_W, 49 },
103 [91] = { EINT_W, 50 },
104 [92] = { EINT_W, 15 },
105 [93] = { EINT_W, 51 },
106 [94] = { EINT_W, 52 },
107 [95] = { EINT_W, 53 },
108 [96] = { EINT_W, 54 },
109 [97] = { EINT_W, 55 },
110 [98] = { EINT_W, 56 },
111 [103] = { EINT_W, 57 },
112 [106] = { EINT_S, 10 },
113 [107] = { EINT_S, 11 },
114 [108] = { EINT_S, 12 },
115 [109] = { EINT_S, 13 },
116 [110] = { EINT_S, 0 },
117 [111] = { EINT_S, 1 },
118 [112] = { EINT_S, 2 },
119 [113] = { EINT_S, 3 },
120 [114] = { EINT_S, 14 },
121 [115] = { EINT_S, 15 },
122 [116] = { EINT_S, 16 },
123 [117] = { EINT_S, 17 },
124 [118] = { EINT_S, 18 },
125 [119] = { EINT_S, 19 },
126 [120] = { EINT_S, 20 },
127 [121] = { EINT_S, 21 },
128 [122] = { EINT_S, 22 },
129 [125] = { EINT_S, 23 },
130 [126] = { EINT_S, 24 },
131 [127] = { EINT_S, 25 },
132 [128] = { EINT_S, 26 },
133 [129] = { EINT_S, 27 },
134 [130] = { EINT_S, 28 },
135 [137] = { EINT_E, 26 },
136 [138] = { EINT_E, 27 },
137 [139] = { EINT_E, 28 },
138 [140] = { EINT_E, 29 },
139 [141] = { EINT_E, 30 },
140 [142] = { EINT_E, 31 },
141 [143] = { EINT_E, 32 },
142 [144] = { EINT_E, 33 },
143 [145] = { EINT_E, 34 },
144 [146] = { EINT_E, 35 },
145 [147] = { EINT_E, 36 },
146 [148] = { EINT_E, 4 },
147 [149] = { EINT_E, 37 },
148 [150] = { EINT_E, 5 },
149 [151] = { EINT_E, 38 },
150 [152] = { EINT_E, 39 },
151 [153] = { EINT_E, 40 },
152 [154] = { EINT_E, 41 },
153 [155] = { EINT_E, 42 },
154 [156] = { EINT_E, 43 },
155 [157] = { EINT_E, 44 },
156 [158] = { EINT_E, 45 },
157 [159] = { EINT_E, 46 },
158 [160] = { EINT_E, 47 },
159 [161] = { EINT_E, 48 },
160 [162] = { EINT_E, 49 },
161 [163] = { EINT_E, 50 },
162 [164] = { EINT_E, 51 },
163 [165] = { EINT_E, 52 },
164 [166] = { EINT_E, 53 },
165 [167] = { EINT_E, 54 },
166 [168] = { EINT_E, 55 },
167 [169] = { EINT_E, 56 },
168 [170] = { EINT_E, 57 },
169 [171] = { EINT_E, 58 },
170 [172] = { EINT_E, 6 },
171 [173] = { EINT_E, 7 },
172 [174] = { EINT_E, 8 },
173 [175] = { EINT_E, 9 },
174 [178] = { EINT_E, 59 },
175 [179] = { EINT_E, 60 },
176 [180] = { EINT_E, 61 },
177 [181] = { EINT_E, 62 },
178 [182] = { EINT_E, 63 },
179 [183] = { EINT_E, 64 },
180 [184] = { EINT_E, 65 },
181 [185] = { EINT_E, 66 },
182 [186] = { EINT_N, 6 },
183 [187] = { EINT_N, 7 },
184 [192] = { EINT_N, 8 },
185 [193] = { EINT_N, 9 },
186 [196] = { EINT_N, 10 },
187 [197] = { EINT_N, 11 },
188 [204] = { EINT_N, 12 },
189 [205] = { EINT_N, 13 },
190 [206] = { EINT_N, 14 },
191 [207] = { EINT_N, 0 },
192 [208] = { EINT_N, 1 },
193 [209] = { EINT_N, 2 },
194 [210] = { EINT_N, 15 },
195 [211] = { EINT_N, 3 },
196 [212] = { EINT_N, 4 },
197 [213] = { EINT_N, 5 },
198 [216] = { EINT_N, 16 },
199 [217] = { EINT_N, 17 },
200 [218] = { EINT_N, 18 },
201 [219] = { EINT_N, 19 },
202 [220] = { EINT_N, 20 },
203 [221] = { EINT_N, 21 },
204 [222] = { EINT_N, 22 },
205 [223] = { EINT_N, 23 },
206 [224] = { EINT_N, 24 },
207 [225] = { EINT_N, 25 },
208 [226] = { EINT_N, 26 },
209 [227] = { EINT_N, 27 },
210 [228] = { EINT_N, 28 },
211 [229] = { EINT_N, 29 },
212 [241] = { EINT_N, 30 },
213 [242] = { EINT_N, 31 },
214 [243] = { EINT_N, 32 },
215 [245] = { EINT_N, 45 },
216 [251] = { EINT_E, 67 },
217 [252] = { EINT_E, 68 },
218 [253] = { EINT_E, 69 },
219 [254] = { EINT_E, 70 },
220 [255] = { EINT_E, 71 },
221 [256] = { EINT_E, 72 },
222 [257] = { EINT_E, 73 },
223 [258] = { EINT_E, 74 },
224 [259] = { EINT_N, 33 },
225 [260] = { EINT_N, 34 },
226 [261] = { EINT_N, 35 },
227 [262] = { EINT_N, 36 },
228 [263] = { EINT_N, 37 },
229 [264] = { EINT_N, 38 },
230 [265] = { EINT_N, 39 },
231 [266] = { EINT_N, 40 },
232 [267] = { EINT_N, 41 },
233 [268] = { EINT_N, 42 },
234 [269] = { EINT_N, 43 },
235 [270] = { EINT_N, 44 },
236 [271] = { EINT_C, 0 },
237 [272] = { EINT_C, 1 },
238 [273] = { EINT_C, 2 },
239 [274] = { EINT_C, 3 },
240 [275] = { EINT_C, 4 },
241 [276] = { EINT_C, 5 },
242 [277] = { EINT_C, 6 },
243 [278] = { EINT_C, 7 },
244 [279] = { EINT_C, 8 },
245 [280] = { EINT_C, 9 },
246 [281] = { EINT_C, 10 },
247 [282] = { EINT_C, 11 },
248 [283] = { EINT_C, 12 },
249 [284] = { EINT_C, 13 },
250 [285] = { EINT_C, 14 },
251 [286] = { EINT_C, 15 },
252 [287] = { EINT_C, 16 },
253 [288] = { EINT_C, 17 },
254 [289] = { EINT_C, 18 },
255 [290] = { EINT_C, 19 },
256 [291] = { EINT_C, 20 },
257 [292] = { EINT_C, 21 },
259 _Static_assert(ARRAY_SIZE(eint_data) == 293, "Incorrect eint_data size");
261 void gpio_calc_eint_pos_bit(gpio_t gpio, u32 *pos, u32 *bit)
263 uint32_t idx = gpio.id;
265 *pos = 0;
266 *bit = 0;
268 if (idx >= ARRAY_SIZE(eint_data))
269 return;
271 uint8_t index = eint_data[idx].index;
273 *pos = index / MAX_EINT_REG_BITS;
274 *bit = index % MAX_EINT_REG_BITS;
277 struct eint_regs *gpio_get_eint_reg(gpio_t gpio)
279 uint32_t idx = gpio.id;
280 uintptr_t addr;
282 if (idx >= ARRAY_SIZE(eint_data))
283 return NULL;
285 switch (eint_data[idx].instance) {
286 case EINT_E:
287 addr = EINT_E_BASE;
288 break;
289 case EINT_S:
290 addr = EINT_S_BASE;
291 break;
292 case EINT_W:
293 addr = EINT_W_BASE;
294 break;
295 case EINT_N:
296 addr = EINT_N_BASE;
297 break;
298 case EINT_C:
299 addr = EINT_C_BASE;
300 break;
301 default:
302 printk(BIOS_ERR, "%s: Failed to look up a valid EINT base for %d\n",
303 __func__, idx);
304 return NULL;
307 return (void *)addr;