1 /*
2 * Copyright 2024 Microchip Technology Inc. and its subsidiaries.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6 #ifndef _MEC_GPIO_API_H
7 #define _MEC_GPIO_API_H
8
9 #include <stdbool.h>
10 #include <stddef.h>
11 #include <stdint.h>
12
13 #include "mec_defs.h"
14 #include "mec_retval.h"
15
16 #ifdef __cplusplus
17 extern "C"
18 {
19 #endif
20
21 #define MEC_GPIO_PORT_0 0
22 #define MEC_GPIO_PORT_1 1
23 #define MEC_GPIO_PORT_2 2
24 #define MEC_GPIO_PORT_3 3
25 #define MEC_GPIO_PORT_4 4
26 #define MEC_GPIO_PORT_5 5
27 #define MEC_GPIO_PORT_MAX 6
28
29 /* GPIO Pin ID enum (octal nomenclature matching spec.) */
30 enum mec_pin_id {
31 /* Port 0(A) */
32 MEC_PIN_0000 = 0,
33 MEC_PIN_0001, MEC_PIN_0002, MEC_PIN_0003, MEC_PIN_0004, MEC_PIN_0005,
34 MEC_PIN_0006, MEC_PIN_0007,
35 MEC_PIN_0010, MEC_PIN_0011, MEC_PIN_0012, MEC_PIN_0013, MEC_PIN_0014,
36 MEC_PIN_0015, MEC_PIN_0016, MEC_PIN_0017,
37 MEC_PIN_0020, MEC_PIN_0021, MEC_PIN_0022, MEC_PIN_0023, MEC_PIN_0024,
38 MEC_PIN_0025, MEC_PIN_0026, MEC_PIN_0027,
39 MEC_PIN_0030, MEC_PIN_0031, MEC_PIN_0032, MEC_PIN_0033, MEC_PIN_0034,
40 MEC_PIN_0035, MEC_PIN_0036, MEC_PIN_0037,
41 /* Port 1(B) */
42 MEC_PIN_0040 = 32U,
43 MEC_PIN_0041, MEC_PIN_0042, MEC_PIN_0043, MEC_PIN_0044, MEC_PIN_0045,
44 MEC_PIN_0046, MEC_PIN_0047,
45 MEC_PIN_0050, MEC_PIN_0051, MEC_PIN_0052, MEC_PIN_0053, MEC_PIN_0054,
46 MEC_PIN_0055, MEC_PIN_0056, MEC_PIN_0057,
47 MEC_PIN_0060, MEC_PIN_0061, MEC_PIN_0062, MEC_PIN_0063, MEC_PIN_0064,
48 MEC_PIN_0065, MEC_PIN_0066, MEC_PIN_0067,
49 MEC_PIN_0070, MEC_PIN_0071, MEC_PIN_0072, MEC_PIN_0073, MEC_PIN_0074,
50 MEC_PIN_0075, MEC_PIN_0076, MEC_PIN_0077,
51 /* Port 2(C) */
52 MEC_PIN_0100 = 64U,
53 MEC_PIN_0101, MEC_PIN_0102, MEC_PIN_0103, MEC_PIN_0104, MEC_PIN_0105,
54 MEC_PIN_0106, MEC_PIN_0107,
55 MEC_PIN_0110, MEC_PIN_0111, MEC_PIN_0112, MEC_PIN_0113, MEC_PIN_0114,
56 MEC_PIN_0115, MEC_PIN_0116, MEC_PIN_0117,
57 MEC_PIN_0120, MEC_PIN_0121, MEC_PIN_0122, MEC_PIN_0123, MEC_PIN_0124,
58 MEC_PIN_0125, MEC_PIN_0126, MEC_PIN_0127,
59 MEC_PIN_0130, MEC_PIN_0131, MEC_PIN_0132, MEC_PIN_0133, MEC_PIN_0134,
60 MEC_PIN_0135, MEC_PIN_0136, MEC_PIN_0137,
61 /* Port 3(D) */
62 MEC_PIN_0140 = 96U,
63 MEC_PIN_0141, MEC_PIN_0142, MEC_PIN_0143, MEC_PIN_0144, MEC_PIN_0145,
64 MEC_PIN_0146, MEC_PIN_0147,
65 MEC_PIN_0150, MEC_PIN_0151, MEC_PIN_0152, MEC_PIN_0153, MEC_PIN_0154,
66 MEC_PIN_0155, MEC_PIN_0156, MEC_PIN_0157,
67 MEC_PIN_0160, MEC_PIN_0161, MEC_PIN_0162, MEC_PIN_0163, MEC_PIN_0164,
68 MEC_PIN_0165, MEC_PIN_0166, MEC_PIN_0167,
69 MEC_PIN_0170, MEC_PIN_0171, MEC_PIN_0172, MEC_PIN_0173, MEC_PIN_0174,
70 MEC_PIN_0175, MEC_PIN_0176, MEC_PIN_0177,
71 /* Port 4(E) */
72 MEC_PIN_0200 = 128U,
73 MEC_PIN_0201, MEC_PIN_0202, MEC_PIN_0203, MEC_PIN_0204, MEC_PIN_0205,
74 MEC_PIN_0206, MEC_PIN_0207,
75 MEC_PIN_0210, MEC_PIN_0211, MEC_PIN_0212, MEC_PIN_0213, MEC_PIN_0214,
76 MEC_PIN_0215, MEC_PIN_0216, MEC_PIN_0217,
77 MEC_PIN_0220, MEC_PIN_0221, MEC_PIN_0222, MEC_PIN_0223, MEC_PIN_0224,
78 MEC_PIN_0225, MEC_PIN_0226, MEC_PIN_0227,
79 MEC_PIN_0230, MEC_PIN_0231, MEC_PIN_0232, MEC_PIN_0233, MEC_PIN_0234,
80 MEC_PIN_0235, MEC_PIN_0236, MEC_PIN_0237,
81 /* Port 5(F) */
82 MEC_PIN_0240 = 160U,
83 MEC_PIN_0241, MEC_PIN_0242, MEC_PIN_0243, MEC_PIN_0244, MEC_PIN_0245,
84 MEC_PIN_0246, MEC_PIN_0247,
85 MEC_PIN_0250, MEC_PIN_0251, MEC_PIN_0252, MEC_PIN_0253, MEC_PIN_0254,
86 MEC_PIN_0255, MEC_PIN_0256, MEC_PIN_0257,
87 MEC_PIN_0260, MEC_PIN_0261, MEC_PIN_0262, MEC_PIN_0263, MEC_PIN_0264,
88 MEC_PIN_0265, MEC_PIN_0266, MEC_PIN_0267,
89 MEC_PIN_0270, MEC_PIN_0271, MEC_PIN_0272, MEC_PIN_0273, MEC_PIN_0274,
90 MEC_PIN_0275, MEC_PIN_0276, MEC_PIN_0277,
91 MEC_PIN_MAX
92 };
93
94 typedef enum mec_pin_id MEC_GPIO_PIN;
95
96 #define MEC_GPIO_CTRL2_OFS 0x500u
97 #define MEC_GPIO_PARIN_OFS 0x300u
98 #define MEC_GPIO_PAROUT_OFS 0x380u
99 #define MEC_GPIO_LOCK_OFS_HI 0x3fcu
100
101 #define MEC_GPIO_CTRL_BASE_ADDR 0x40081000u
102 #define MEC_GPIO_CTRL2_BASE_ADDR (MEC_GPIO_CTRL_BASE_ADDR + MEC_GPIO_CTRL2_OFS)
103 #define MEC_GPIO_PARIN_BASE_ADDR (MEC_GPIO_CTRL_BASE_ADDR + MEC_GPIO_PARIN_OFS)
104 #define MEC_GPIO_PAROUT_BASE_ADDR (MEC_GPIO_CTRL_BASE_ADDR + MEC_GPIO_PAROUT_OFS)
105 /* NOTE: LOCK0 is at top of range */
106 #define MEC_GPIO_LOCK_TOP_ADDR (MEC_GPIO_CTRL_BASE_ADDR + MEC_GPIO_LOCK_OFS_HI)
107
108 #define MEC_GPIO_CTRL_REG_ADDR(pin_id) (((uint32_t)(pin_id) * 4u) + (MEC_GPIO_CTRL_BASE_ADDR))
109 #define MEC_GPIO_CTRL2_REG_ADDR(pin_id) (MEC_GPIO_CTRL_REG_ADDR(pin_id) + (MEC_GPIO_CTRL2_OFS))
110
111 /*
112 * API
113 */
114
115 /* Place any C interfaces here */
116
117 /* GPIO Pin configuration property ID's and values for use with
118 * mec_gpio_get/set_property
119 */
120
121 #define MEC_GPIO_PUD_PROP_ID 0
122 #define MEC_GPIO_PWRGT_PROP_ID 1
123 #define MEC_GPIO_IDET_PROP_ID 2
124 #define MEC_GPIO_OBUFT_PROP_ID 3
125 #define MEC_GPIO_DIR_PROP_ID 4
126 #define MEC_GPIO_OSEL_PROP_ID 5
127 #define MEC_GPIO_FUNC_POL_PROP_ID 6
128 #define MEC_GPIO_MUX_PROP_ID 7
129 #define MEC_GPIO_INPAD_DIS_PROP_ID 8
130 #define MEC_GPIO_CTRL_OUT_VAL_ID 9
131 #define MEC_GPIO_SLEW_RATE_ID 10
132 #define MEC_GPIO_DRV_STR_ID 11
133 #define MEC_GPIO_MAX_PROP_ID 12
134
135 #define MEC_GPIO_PROP_NO_PUD 0u
136 #define MEC_GPIO_PROP_PULL_UP 0x01u
137 #define MEC_GPIO_PROP_PULL_DN 0x02u
138 #define MEC_GPIO_PROP_REPEATER 0x03u
139
140 #define MEC_GPIO_PROP_PWRGT_VTR 0u
141 #define MEC_GPIO_PROP_PWRGT_VCC 0x01u
142 #define MEC_GPIO_PROP_PWRGT_OFF 0x02u
143
144 #define MEC_GPIO_PROP_IDET_LO_LVL 0u
145 #define MEC_GPIO_PROP_IDET_HI_LVL 0x01u
146 #define MEC_GPIO_PROP_IDET_DIS 0x04u
147 #define MEC_GPIO_PROP_IDET_EDGE_UP 0x0Du
148 #define MEC_GPIO_PROP_IDET_EDGE_DN 0x0Eu
149 #define MEC_GPIO_PROP_IDET_EDGE_BOTH 0x0Fu
150
151 #define MEC_GPIO_PROP_PUSH_PULL 0u
152 #define MEC_GPIO_PROP_OPEN_DRAIN 1u
153
154 #define MEC_GPIO_PROP_DIR_IN 0u
155 #define MEC_GPIO_PROP_DIR_OUT 1u
156
157 #define MEC_GPIO_PROP_OSEL_CTRL 0u
158 #define MEC_GPIO_PROP_OSEL_PAROUT 1u
159
160 #define MEC_GPIO_PROP_FUNC_OUT_NON_INV 0u
161 #define MEC_GPIO_PROP_FUNC_OUT_INV 1u
162
163 #define MEC_GPIO_PROP_MUX_GPIO 0u
164 #define MEC_GPIO_PROP_MUX_FUNC1 1u
165 #define MEC_GPIO_PROP_MUX_FUNC2 2u
166 #define MEC_GPIO_PROP_MUX_FUNC3 3u
167 #define MEC_GPIO_PROP_MUX_FUNC4 4u
168 #define MEC_GPIO_PROP_MUX_FUNC5 5u
169 #define MEC_GPIO_PROP_MUX_FUNC6 6u
170 #define MEC_GPIO_PROP_MUX_FUNC7 7u
171
172 #define MEC_GPIO_PROP_INPAD_EN 0u
173 #define MEC_GPIO_PROP_INPAD_DIS 1u
174
175 enum mec_gpio_drive_str {
176 MEC_GPIO_DRIVE_STR_1X = 0,
177 MEC_GPIO_DRIVE_STR_2X,
178 MEC_GPIO_DRIVE_STR_4X,
179 MEC_GPIO_DRIVE_STR_6X,
180 MEC_GPIO_DRIVE_STR_NUM_ELEM,
181 };
182
183 enum mec_gpio_slew_rate {
184 MEC_GPIO_SLEW_RATE_SLOW = 0,
185 MEC_GPIO_SLEW_RATE_FAST,
186 MEC_GPIO_SLEW_RATE_NUM_ELEM,
187 };
188
189 struct mec_gpio_props {
190 uint8_t prop;
191 uint8_t val;
192 };
193
194 /* Pin configuration using a single 32-bit unsigned word */
195 #define MEC5_GPIO_CFG_PULL_POS 0
196 #define MEC5_GPIO_CFG_PULL_MSK 0x3u
197 #define MEC5_GPIO_CFG_PWR_GATE_POS 2
198 #define MEC5_GPIO_CFG_PWR_GATE_MSK 0xcu
199 #define MEC5_GPIO_CFG_OUT_OPEN_DRAIN_POS 4
200 #define MEC5_GPIO_CFG_OUT_OPEN_DRAIN_MSK 0x10
201 #define MEC5_GPIO_CFG_DIR_OUT_POS 5
202 #define MEC5_GPIO_CFG_DIR_OUT_MSK 0x20u
203 #define MEC5_GPIO_CFG_PAR_OUT_EN_POS 6
204 #define MEC5_GPIO_CFG_PAR_OUT_EN_MSK 0x40
205 #define MEC5_GPIO_CFG_FUNC_INV_POS 7
206 #define MEC5_GPIO_CFG_FUNC_INV_MSK 0x80
207 #define MEC5_GPIO_CFG_FUNC_POS 8
208 #define MEC5_GPIO_CFG_FUNC_MSK 0x700
209 #define MEC5_GPIO_CFG_IDET_POS 12
210 #define MEC5_GPIO_CFG_IDET_MSK 0x7000u
211 #define MEC5_GPIO_CFG_INPAD_DIS_POS 15
212 #define MEC5_GPIO_CFG_INPAD_DIS_MSK 0x8000u
213 #define MEC5_GPIO_CFG_DRV_STR_POS 16
214 #define MEC5_GPIO_CFG_DRV_STR_MSK 0x30000u
215 #define MEC5_GPIO_CFG_SLEW_RATE_POS 18
216 #define MEC5_GPIO_CFG_SLEW_RATE_MSK 0x40000u
217 #define MEC5_GPIO_CFG_SET_OUT_VAL_POS 20
218 #define MEC5_GPIO_CFG_SET_OUT_VAL_MSK 0x100000u
219 #define MEC5_GPIO_CFG_OUT_VAL_POS 21
220 #define MEC5_GPIO_CFG_OUT_VAL_MSK 0x200000u
221
222 /* internal weak pulls */
223 #define MEC5_GPIO_CFG_PULL_NONE 0
224 #define MEC5_GPIO_CFG_PULL_UP 0x1u
225 #define MEC5_GPIO_CFG_PULL_DN 0x2u
226 #define MEC5_GPIO_CFG_PULL_KEEPER 0x3u
227
228 #define MEC5_GPIO_CFG_PWRGT_VTR 0
229 #define MEC5_GPIO_CFG_PWRGT_VCC (1u << MEC5_GPIO_CFG_PWR_GATE_POS)
230 /* turn off HW pin pad logic, etc. */
231 #define MEC5_GPIO_CFG_PWRGT_OFF (2u << MEC5_GPIO_CFG_PWR_GATE_POS)
232
233 #define MEC5_GPIO_CFG_OUT_BUF_PUSH_PULL 0
234 #define MEC5_GPIO_CFG_OUT_BUF_OPEN_DRAIN (1u << MEC5_GPIO_CFG_OUT_OPEN_DRAIN_POS)
235
236 #define MEC5_GPIO_CFG_DIR_INPUT 0
237 #define MEC5_GPIO_CFG_DIR_OUTPUT (1u << MEC5_GPIO_CFG_DIR_OUT_POS)
238
239 /* Enable pin output state to be set by the GPIO parallel output register
240 * containing this pin. Otherwise pin output state set in GPIO pin control
241 * register.
242 */
243 #define MEC5_GPIO_CFG_PAR_OUT_DIS 0
244 #define MEC5_GPIO_CFG_PAR_OUT_EN (1u << MEC5_GPIO_CFG_PAR_OUT_EN_POS)
245
246 /* GPIO HW can invert the input and output of an alternate function.
247 * Does not apply when pin configured as GPIO function.
248 */
249 #define MEC5_GPIO_CFG_FUNC_INV_DIS 0
250 #define MEC5_GPIO_CFG_FUNC_INV_EN (1u << MEC5_GPIO_CFG_FUNC_INV_POS)
251
252 #define MEC5_GPIO_CFG_FUNC_GPIO 0
253 #define MEC5_GPIO_CFG_FUNC_ALT1 (1u << MEC5_GPIO_CFG_FUNC_POS)
254 #define MEC5_GPIO_CFG_FUNC_ALT2 (2u << MEC5_GPIO_CFG_FUNC_POS)
255 #define MEC5_GPIO_CFG_FUNC_ALT3 (3u << MEC5_GPIO_CFG_FUNC_POS)
256 #define MEC5_GPIO_CFG_FUNC_ALT4 (4u << MEC5_GPIO_CFG_FUNC_POS)
257 #define MEC5_GPIO_CFG_FUNC_ALT5 (5u << MEC5_GPIO_CFG_FUNC_POS)
258 #define MEC5_GPIO_CFG_FUNC_ALT6 (6u << MEC5_GPIO_CFG_FUNC_POS)
259 #define MEC5_GPIO_CFG_FUNC_ALT7 (7u << MEC5_GPIO_CFG_FUNC_POS)
260 #define MEC5_GPIO_CFG_FUNC_ALT(n) \
261 (((uint32_t)(n) & 0x7u) << MEC5_GPIO_CFG_FUNC_POS)
262
263 #define MEC5_GPIO_CFG_IDET_DIS 0
264 #define MEC5_GPIO_CFG_IDET_LVL_LO (1u << MEC5_GPIO_CFG_IDET_POS)
265 #define MEC5_GPIO_CFG_IDET_LVL_HI (2u << MEC5_GPIO_CFG_IDET_POS)
266 #define MEC5_GPIO_CFG_IDET_RISING_EDG (3 << MEC5_GPIO_CFG_IDET_POS)
267 #define MEC5_GPIO_CFG_IDET_FALLING_EDG (4u << MEC5_GPIO_CFG_IDET_POS)
268 #define MEC5_GPIO_CFG_IDET_BOTH_EDG (5u << MEC5_GPIO_CFG_IDET_POS)
269
270 /* Set GPIO pad drive strength as a multiple of the base drive strength based
271 * on the pad type.
272 * PIO-12 pads base drive strength is 2mA
273 * PIO-24 pads base drive strength is 4mA
274 */
275 #define MEC5_GPIO_CFG_DRV_STR_1X 0
276 #define MEC5_GPIO_CFG_DRV_STR_2X (1u << MEC5_GPIO_CFG_DRV_STR_POS)
277 #define MEC5_GPIO_CFG_DRV_STR_4X (2u << MEC5_GPIO_CFG_DRV_STR_POS)
278 #define MEC5_GPIO_CFG_DRV_STR_6X (3u << MEC5_GPIO_CFG_DRV_STR_POS)
279
280 /* GPIO pad slew rate. NOTE: eSPI pins do not support slew rate adjustment */
281 #define MEC5_GPIO_CFG_SLEW_RATE_SLOW 0
282 #define MEC5_GPIO_CFG_SLEW_RATE_FAST (1u << MEC5_GPIO_CFG_SLEW_RATE_POS)
283
284 /* Set pin output value before enabling the pin for output.
285 * This property has both an enable flag and output state value.
286 */
287 #define MEC5_GPIO_CFG_SET_OUT_VAL_DIS 0
288 #define MEC5_GPIO_CFG_SET_OUT_VAL_EN (1u << MEC5_GPIO_CFG_SET_OUT_VAL_POS)
289
290 #define MEC5_GPIO_CFG_OUT_VAL_LO 0
291 #define MEC5_GPIO_CFG_OUT_VAL_HI (1u << MEC5_GPIO_CFG_OUT_VAL_POS)
292
293
mec_hal_gpio_pin_num_nc(uint8_t port,uint8_t pin_port_pos)294 static inline uint32_t mec_hal_gpio_pin_num_nc(uint8_t port, uint8_t pin_port_pos)
295 {
296 return ((uint32_t)(port & 0x7u) * 32u) + (pin_port_pos & 0x1fu);
297 }
298
299 int mec_hal_gpio_pin_num(uint8_t port, uint8_t pin_port_pos, uint32_t *pin_num);
300 int mec_hal_gpio_pin_valid(uint32_t pin);
301 int mec_hal_gpio_port_pin_valid(uint8_t port, uint8_t pin_port_pos);
302 int mec_hal_gpio_port_valid_mask(uint8_t port, uint32_t *valid_msk);
303
304 int mec_hal_gpio_pin_config(uint32_t pin, uint32_t config);
305
306 /* Extract property from 32-bit GPIO control value */
307 int mec_hal_gpio_get_ctrl_property(uint32_t ctrl, uint8_t prop_id, uint8_t *prop);
308
309 /* Modify property of 32-bit GPIO control register value passed in ctrl.
310 * Returns modified value. Does not touch HW. If property is out of range,
311 * return unmodified ctrl.
312 */
313 uint32_t mec_hal_gpio_set_ctrl_property(uint32_t ctrl, uint8_t prop_id, uint8_t val);
314
315 /* Get specified property from GPIO Control register */
316 int mec_hal_gpio_get_property(uint32_t pin, uint8_t prop_id, uint8_t *prop);
317 /* Modify specified propertie(s) of GPIO Control register */
318 int mec_hal_gpio_set_property(uint32_t pin, uint8_t prop_id, uint8_t new_val);
319 int mec_hal_gpio_set_props(uint32_t pin, const struct mec_gpio_props *gprops, size_t nprops);
320
321 /* returns 1 if pin direction is configured as output else 0 */
322 int mec_hal_gpio_is_output(uint32_t pin);
323
324 /* disable a pin: turns off input pad */
325 int mec_hal_gpio_disable_input_pad(uint32_t pin);
326 /* enable a pin: turns on input pad */
327 int mec_hal_gpio_enable_input_pad(uint32_t pin);
328
329 /* Check if pin control registers are locked */
330 int mec_hal_gpio_is_locked(uint32_t pin);
331
332 /* Get address of GPIO Control and Control2 registers */
333 uintptr_t mec_hal_gpio_ctrl_addr(uint32_t pin);
334 uintptr_t mec_hal_gpio_ctrl2_addr(uint32_t pin);
335
336 /* Get/Set GPIO Control configuration b[15:0] */
337 int mec_hal_gpio_get_config(uint32_t pin, uint32_t *config);
338 int mec_hal_gpio_set_config(uint32_t pin, uint32_t new_cfg);
339 int mec_hal_gpio_set_config_mask(uint32_t pin, uint32_t new_cfg, uint32_t mask);
340
341 /* Get/Set GPIO Control full register */
342 int mec_hal_gpio_get_ctrl(uint32_t pin, uint32_t *ctrl);
343 int mec_hal_gpio_set_ctrl(uint32_t pin, uint32_t new_ctrl);
344 int mec_hal_gpio_set_ctrl_mask(uint32_t pin, uint32_t val, uint32_t mask);
345
346 uint32_t mec_hal_gpio_get_ctrl_nc(uint32_t pin);
347 void mec_hal_gpio_set_ctrl_nc(uint32_t pin, uint32_t ctrl_val);
348
349 uint32_t mec_hal_gpio_get_ctrl_nc(uint32_t pin);
350 void mec_hal_gpio_set_ctrl_nc(uint32_t pin, uint32_t ctrl_val);
351 uint32_t mec_hal_gpio_port_get_ctrl_nc(uint8_t port, uint8_t port_pin_pos);
352 void mec_hal_gpio_port_set_ctrl_nc(uint8_t port, uint8_t port_pin_pos, uint32_t ctrl_val);
353
354 int mec_hal_gpio_get_ctrl2(uint32_t pin, uint32_t *ctrl2);
355 int mec_hal_gpio_set_ctrl2(uint32_t pin, uint32_t new_ctrl2);
356 int mec_hal_gpio_ctrl2_mask(const uint32_t pin, uint32_t val, uint32_t mask);
357
358 int mec_hal_gpio_get_slew_rate(uint32_t pin);
359 int mec_hal_gpio_set_slew_rate(uint32_t pin, enum mec_gpio_slew_rate slew_rate);
360
361 int mec_hal_gpio_get_drive_strength(uint32_t pin);
362 int mec_hal_gpio_set_drive_strength(uint32_t pin, enum mec_gpio_drive_str drive_str);
363
364 int mec_hal_gpio_alt_out(const uint32_t pin, uint8_t new_val);
365 int mec_hal_gpio_alt_out_toggle(const uint32_t pin);
366
367 int mec_hal_gpio_pad_in(const uint32_t pin, uint8_t *padin);
368
369 int mec_hal_gpio_par_in(const uint32_t pin, uint8_t *pinval);
370 int mec_hal_gpio_par_out(const uint32_t pin, const uint8_t pin_state);
371
372 int mec_hal_gpio_parin_port(const uint8_t port, uint32_t *val);
373 int mec_hal_gpio_parin_by_pin(uint32_t pin, uint32_t *val);
374 int mec_hal_gpio_parout_port_get(const uint8_t port, uint32_t *val);
375 int mec_hal_gpio_parout_port_get_by_pin(uint32_t pin, uint32_t *val);
376 int mec_hal_gpio_parout_port(const uint8_t port, const uint32_t newval);
377 int mec_hal_gpio_parout_port_set_bits(const uint8_t port, const uint32_t mask);
378 int mec_hal_gpio_parout_port_xor(const uint8_t port, const uint32_t xormask);
379 int mec_hal_gpio_parout_port_mask(const uint8_t port, const uint32_t newval,
380 const uint32_t mask);
381
382 int mec_hal_gpio_port_ia_ctrl(uint8_t port, uint8_t enable);
383 int mec_hal_gpio_port_pin_ia_enable(uint8_t port, uint8_t port_pin_pos, uint8_t enable);
384 int mec_hal_gpio_pin_ia_enable(uint8_t pin, uint8_t enable);
385 int mec_hal_gpio_pin_ia_status_clr(uint8_t pin);
386 int mec_hal_gpio_port_pin_ia_status_clr(uint8_t port, uint8_t port_pin_pos);
387 int mec_hal_gpio_port_ia_status(uint8_t port, uint32_t *status);
388 int mec_hal_gpio_port_ia_status_clr_mask(uint8_t port, uint32_t mask);
389 int mec_hal_gpio_port_ia_result(uint8_t port, uint32_t *result);
390
391 /* VCI capable GPIO pins */
392 bool mec_hal_gpio_pin_is_vci_capable(uint16_t pin);
393 int mec_hal_gpio_vci_disable(uint16_t pin);
394 int mec_hal_gpio_vci_get_func(uint16_t pin, uint8_t *func);
395
396 #ifdef __cplusplus
397 }
398 #endif
399
400 #endif /* #ifndef _MEC_GPIO_API_H */
401