1 /*
2  * Copyright (c) 2024 Antmicro <www.antmicro.com>
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_SOC_ARM_XLNX_ZYNQMP_SOC_PINCTRL_H_
8 #define ZEPHYR_SOC_ARM_XLNX_ZYNQMP_SOC_PINCTRL_H_
9 
10 #include <zephyr/devicetree.h>
11 #include <zephyr/sys/util.h>
12 #include <zephyr/types.h>
13 
14 #define MIO_L0_SEL     BIT(1)
15 #define MIO_L1_SEL     BIT(2)
16 #define MIO_L2_SEL     GENMASK(4, 3)
17 #define MIO_L3_SEL     GENMASK(7, 5)
18 
19 /* All other selectors should be zeroed and FIELD_PREP does that */
20 #define UARTX_SEL FIELD_PREP(MIO_L3_SEL, 6)
21 
22 /*
23  * Each peripheral PINCTRL mask is defined as such:
24  * [7 ... 0]  MIO register number
25  * [15 ... 8] Function, mapped as:
26  *     1 - UART
27  *
28  * The function numbers serve as an enumerator in the pinctrl driver
29  * and the defines controling those are listed in `pinctrl-zynqmp.h`.
30  * Currently, one function for UART is specified and subsequent ones
31  * can be added when the need arises.
32  */
33 
34 typedef struct pinctrl_soc_pin_t {
35 	uint32_t pin;
36 	uint32_t func;
37 } pinctrl_soc_pin_t;
38 
39 
40 #define ZYNQMP_GET_PIN(pinctrl)  (pinctrl & 0xff)
41 #define ZYNQMP_GET_FUNC(pinctrl) ((pinctrl >> 8) & 0xff)
42 
43 #define Z_PINCTRL_STATE_PIN_INIT(node_id, prop, idx) \
44 		{ \
45 				.pin = ZYNQMP_GET_PIN(DT_PROP_BY_IDX(node_id, prop, idx)), \
46 				.func = ZYNQMP_GET_FUNC(DT_PROP_BY_IDX(node_id, prop, idx)), \
47 		},
48 
49 #define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) { \
50 				DT_FOREACH_CHILD_VARGS(DT_PHANDLE(node_id, prop), \
51 				DT_FOREACH_PROP_ELEM, pinmux, \
52 				Z_PINCTRL_STATE_PIN_INIT)}
53 
54 #endif
55