1 /*
2  * Copyright (c) Henrik Brix Andersen <henrik@brixandersen.dk>
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_SOC_ARM_XILINX_ZYNQ7000_COMMON_PINCTRL_SOC_H_
8 #define ZEPHYR_SOC_ARM_XILINX_ZYNQ7000_COMMON_PINCTRL_SOC_H_
9 
10 #include <zephyr/devicetree.h>
11 #include <zephyr/sys/util.h>
12 #include <zephyr/types.h>
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 /* MIO_PIN_xx SLCR register fields (from Xilinx UG585 v1.13, B.28 SLCR) */
19 #define MIO_PIN_DISABLE_RCVR_MASK BIT(13)
20 #define MIO_PIN_DISABLE_RCVR(val) FIELD_PREP(MIO_PIN_DISABLE_RCVR_MASK, val)
21 
22 #define MIO_PIN_PULLUP_MASK       BIT(12)
23 #define MIO_PIN_PULLUP(val)       FIELD_PREP(MIO_PIN_PULLUP_MASK, val)
24 
25 #define MIO_PIN_IO_TYPE_MASK      GENMASK(11, 9)
26 #define MIO_PIN_IO_TYPE(val)      FIELD_PREP(MIO_PIN_IO_TYPE_MASK, val)
27 
28 #define MIO_PIN_SPEED_MASK        BIT(8)
29 #define MIO_PIN_SPEED(val)        FIELD_PREP(MIO_PIN_SPEED_MASK, val)
30 
31 #define MIO_PIN_L3_SEL_MASK       GENMASK(7, 5)
32 #define MIO_PIN_L3_SEL(val)       FIELD_PREP(MIO_PIN_L3_SEL_MASK, val)
33 
34 #define MIO_PIN_L2_SEL_MASK       GENMASK(4, 3)
35 #define MIO_PIN_L2_SEL(val)       FIELD_PREP(MIO_PIN_L2_SEL_MASK, val)
36 
37 #define MIO_PIN_L1_SEL_MASK       BIT(2)
38 #define MIO_PIN_L1_SEL(val)       FIELD_PREP(MIO_PIN_L1_SEL_MASK, val)
39 
40 #define MIO_PIN_L0_SEL_MASK       BIT(1)
41 #define MIO_PIN_L0_SEL(val)       FIELD_PREP(MIO_PIN_L0_SEL_MASK, val)
42 
43 #define MIO_PIN_TRI_ENABLE_MASK   BIT(0)
44 #define MIO_PIN_TRI_ENABLE(val)   FIELD_PREP(MIO_PIN_TRI_ENABLE_MASK, val)
45 
46 /* MIO_PIN_xx SLCR register L3..L0 multiplexing fields combined */
47 #define MIO_PIN_LX_SEL_MASK \
48 	(MIO_PIN_L3_SEL_MASK | MIO_PIN_L2_SEL_MASK | MIO_PIN_L1_SEL_MASK | MIO_PIN_L0_SEL_MASK)
49 #define MIO_PIN_LX_SEL(l3, l2, l1, l0) \
50 	(MIO_PIN_L3_SEL(l3) | MIO_PIN_L2_SEL(l2) | MIO_PIN_L1_SEL(l1) | MIO_PIN_L0_SEL(l0))
51 
52 /* MIO pin function multiplexing (from Xilinx UG585 v1.13, B.28 SLCR) */
53 #define MIO_PIN_FUNCTION_ETHERNET0       MIO_PIN_LX_SEL(0x0, 0x0, 0x0, 0x1)
54 #define MIO_PIN_FUNCTION_ETHERNET1       MIO_PIN_LX_SEL(0x0, 0x0, 0x0, 0x1)
55 #define MIO_PIN_FUNCTION_MDIO0           MIO_PIN_LX_SEL(0x4, 0x0, 0x0, 0x0)
56 #define MIO_PIN_FUNCTION_MDIO1           MIO_PIN_LX_SEL(0x5, 0x0, 0x0, 0x0)
57 #define MIO_PIN_FUNCTION_QSPI0           MIO_PIN_LX_SEL(0x0, 0x0, 0x0, 0x1)
58 #define MIO_PIN_FUNCTION_QSPI1           MIO_PIN_LX_SEL(0x0, 0x0, 0x0, 0x1)
59 #define MIO_PIN_FUNCTION_QSPI_FBCLK      MIO_PIN_LX_SEL(0x0, 0x0, 0x0, 0x1)
60 #define MIO_PIN_FUNCTION_QSPI_CS1        MIO_PIN_LX_SEL(0x0, 0x0, 0x0, 0x1)
61 #define MIO_PIN_FUNCTION_SPI0            MIO_PIN_LX_SEL(0x5, 0x0, 0x0, 0x0)
62 #define MIO_PIN_FUNCTION_SPI0_SS         MIO_PIN_LX_SEL(0x5, 0x0, 0x0, 0x0)
63 #define MIO_PIN_FUNCTION_SPI1            MIO_PIN_LX_SEL(0x5, 0x0, 0x0, 0x0)
64 #define MIO_PIN_FUNCTION_SPI1_SS         MIO_PIN_LX_SEL(0x5, 0x0, 0x0, 0x0)
65 #define MIO_PIN_FUNCTION_SDIO0           MIO_PIN_LX_SEL(0x4, 0x0, 0x0, 0x0)
66 #define MIO_PIN_FUNCTION_SDIO0_PC        MIO_PIN_LX_SEL(0x0, 0x3, 0x0, 0x0)
67 #define MIO_PIN_FUNCTION_SDIO1           MIO_PIN_LX_SEL(0x4, 0x0, 0x0, 0x0)
68 #define MIO_PIN_FUNCTION_SDIO1_PC        MIO_PIN_LX_SEL(0x0, 0x3, 0x0, 0x0)
69 #define MIO_PIN_FUNCTION_SMC0_NOR        MIO_PIN_LX_SEL(0x0, 0x1, 0x0, 0x0)
70 #define MIO_PIN_FUNCTION_SMC0_NOR_CS1    MIO_PIN_LX_SEL(0x0, 0x2, 0x0, 0x0)
71 #define MIO_PIN_FUNCTION_SMC0_NOR_ADDR25 MIO_PIN_LX_SEL(0x0, 0x1, 0x0, 0x0)
72 #define MIO_PIN_FUNCTION_SMC0_NAND       MIO_PIN_LX_SEL(0x0, 0x2, 0x0, 0x0)
73 #define MIO_PIN_FUNCTION_CAN0            MIO_PIN_LX_SEL(0x1, 0x0, 0x0, 0x0)
74 #define MIO_PIN_FUNCTION_CAN1            MIO_PIN_LX_SEL(0x1, 0x0, 0x0, 0x0)
75 #define MIO_PIN_FUNCTION_UART0           MIO_PIN_LX_SEL(0x7, 0x0, 0x0, 0x0)
76 #define MIO_PIN_FUNCTION_UART1           MIO_PIN_LX_SEL(0x7, 0x0, 0x0, 0x0)
77 #define MIO_PIN_FUNCTION_I2C0            MIO_PIN_LX_SEL(0x2, 0x0, 0x0, 0x0)
78 #define MIO_PIN_FUNCTION_I2C1            MIO_PIN_LX_SEL(0x2, 0x0, 0x0, 0x0)
79 #define MIO_PIN_FUNCTION_TTC0            MIO_PIN_LX_SEL(0x6, 0x0, 0x0, 0x0)
80 #define MIO_PIN_FUNCTION_TTC1            MIO_PIN_LX_SEL(0x6, 0x0, 0x0, 0x0)
81 #define MIO_PIN_FUNCTION_SWDT0           MIO_PIN_LX_SEL(0x3, 0x0, 0x0, 0x0)
82 #define MIO_PIN_FUNCTION_GPIO0           MIO_PIN_LX_SEL(0x0, 0x0, 0x0, 0x0)
83 #define MIO_PIN_FUNCTION_USB0            MIO_PIN_LX_SEL(0x0, 0x0, 0x1, 0x0)
84 #define MIO_PIN_FUNCTION_USB1            MIO_PIN_LX_SEL(0x0, 0x0, 0x1, 0x0)
85 
86 /* MIO SDIO CD/WP pin selection (from Xilinx UG585 v1.13, B.28 SLCR) */
87 #define MIO_PIN_SPECIAL_FUNCTION_SDIO0_CD 1
88 #define MIO_PIN_SPECIAL_OFFSET_SDIO0_CD   0x0130
89 #define MIO_PIN_SPECIAL_MASK_SDIO0_CD     GENMASK(21, 16)
90 #define MIO_PIN_SPECIAL_SHIFT_SDIO0_CD    16
91 
92 #define MIO_PIN_SPECIAL_FUNCTION_SDIO0_WP 1
93 #define MIO_PIN_SPECIAL_OFFSET_SDIO0_WP   0x0130
94 #define MIO_PIN_SPECIAL_MASK_SDIO0_WP     GENMASK(5, 0)
95 #define MIO_PIN_SPECIAL_SHIFT_SDIO0_WP    0
96 
97 #define MIO_PIN_SPECIAL_FUNCTION_SDIO1_CD 1
98 #define MIO_PIN_SPECIAL_OFFSET_SDIO1_CD   0x0134
99 #define MIO_PIN_SPECIAL_MASK_SDIO1_CD     GENMASK(21, 16)
100 #define MIO_PIN_SPECIAL_SHIFT_SDIO1_CD    16
101 
102 #define MIO_PIN_SPECIAL_FUNCTION_SDIO1_WP 1
103 #define MIO_PIN_SPECIAL_OFFSET_SDIO1_WP   0x0134
104 #define MIO_PIN_SPECIAL_MASK_SDIO1_WP     GENMASK(5, 0)
105 #define MIO_PIN_SPECIAL_SHIFT_SDIO1_WP    0
106 
107 /* MIO pin numbers */
108 #define MIO0   0
109 #define MIO1   1
110 #define MIO2   2
111 #define MIO3   3
112 #define MIO4   4
113 #define MIO5   5
114 #define MIO6   6
115 #define MIO7   7
116 #define MIO8   8
117 #define MIO9   9
118 #define MIO10 10
119 #define MIO11 11
120 #define MIO12 12
121 #define MIO13 13
122 #define MIO14 14
123 #define MIO15 15
124 #define MIO16 16
125 #define MIO17 17
126 #define MIO18 18
127 #define MIO19 19
128 #define MIO20 20
129 #define MIO21 21
130 #define MIO22 22
131 #define MIO23 23
132 #define MIO24 24
133 #define MIO25 25
134 #define MIO26 26
135 #define MIO27 27
136 #define MIO28 28
137 #define MIO29 29
138 #define MIO30 30
139 #define MIO31 31
140 #define MIO32 32
141 #define MIO33 33
142 #define MIO34 34
143 #define MIO35 35
144 #define MIO36 36
145 #define MIO37 37
146 #define MIO38 38
147 #define MIO39 39
148 #define MIO40 40
149 #define MIO41 41
150 #define MIO42 42
151 #define MIO43 43
152 #define MIO44 44
153 #define MIO45 45
154 #define MIO46 46
155 #define MIO47 47
156 #define MIO48 48
157 #define MIO49 49
158 #define MIO50 50
159 #define MIO51 51
160 #define MIO52 52
161 #define MIO53 53
162 
163 /* MIO pin groups (from Xilinx UG585 v1.13, table 2-4 "MIO-at-a-Glance") */
164 #define MIO_GROUP_ETHERNET0_0_GRP_PINS     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27
165 #define MIO_GROUP_ETHERNET1_0_GRP_PINS     28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39
166 #define MIO_GROUP_MDIO0_0_GRP_PINS         52, 53
167 #define MIO_GROUP_MDIO1_0_GRP_PINS         52, 53
168 #define MIO_GROUP_QSPI0_0_GRP_PINS          1,  2,  3,  4,  5,  6
169 #define MIO_GROUP_QSPI1_0_GRP_PINS          9, 10, 11, 12, 13
170 #define MIO_GROUP_QSPI_FBCLK_PINS           8
171 #define MIO_GROUP_QSPI_CS1_GRP_PINS         0
172 #define MIO_GROUP_SPI0_0_GRP_PINS          16, 17, 21
173 #define MIO_GROUP_SPI0_0_SS0_PINS          18
174 #define MIO_GROUP_SPI0_0_SS1_PINS          19
175 #define MIO_GROUP_SPI0_0_SS2_PINS          20
176 #define MIO_GROUP_SPI0_1_GRP_PINS          28, 29, 33
177 #define MIO_GROUP_SPI0_1_SS0_PINS          30
178 #define MIO_GROUP_SPI0_1_SS1_PINS          31
179 #define MIO_GROUP_SPI0_1_SS2_PINS          32
180 #define MIO_GROUP_SPI0_2_GRP_PINS          40, 41, 45
181 #define MIO_GROUP_SPI0_2_SS0_PINS          42
182 #define MIO_GROUP_SPI0_2_SS1_PINS          43
183 #define MIO_GROUP_SPI0_2_SS2_PINS          44
184 #define MIO_GROUP_SPI1_0_GRP_PINS          10, 11, 12
185 #define MIO_GROUP_SPI1_0_SS0_PINS          13
186 #define MIO_GROUP_SPI1_0_SS1_PINS          14
187 #define MIO_GROUP_SPI1_0_SS2_PINS          15
188 #define MIO_GROUP_SPI1_1_GRP_PINS          22, 23, 24
189 #define MIO_GROUP_SPI1_1_SS0_PINS          25
190 #define MIO_GROUP_SPI1_1_SS1_PINS          26
191 #define MIO_GROUP_SPI1_1_SS2_PINS          27
192 #define MIO_GROUP_SPI1_2_GRP_PINS          34, 35, 36
193 #define MIO_GROUP_SPI1_2_SS0_PINS          37
194 #define MIO_GROUP_SPI1_2_SS1_PINS          38
195 #define MIO_GROUP_SPI1_2_SS2_PINS          39
196 #define MIO_GROUP_SPI1_3_GRP_PINS          46, 47, 48
197 #define MIO_GROUP_SPI1_3_SS0_PINS          49
198 #define MIO_GROUP_SPI1_3_SS1_PINS          50
199 #define MIO_GROUP_SPI1_3_SS2_PINS          51
200 #define MIO_GROUP_SDIO0_0_GRP_PINS         16, 17, 18, 19, 20, 21
201 #define MIO_GROUP_SDIO0_1_GRP_PINS         28, 29, 30, 31, 32, 33
202 #define MIO_GROUP_SDIO0_2_GRP_PINS         40, 41, 42, 43, 44, 45
203 #define MIO_GROUP_SDIO1_0_GRP_PINS         10, 11, 12, 13, 14, 15
204 #define MIO_GROUP_SDIO1_1_GRP_PINS         22, 23, 24, 25, 26, 27
205 #define MIO_GROUP_SDIO1_2_GRP_PINS         34, 35, 36, 37, 38, 39
206 #define MIO_GROUP_SDIO1_3_GRP_PINS         46, 47, 48, 49, 50, 51
207 #define MIO_GROUP_SDIO0_EMIO_WP_PINS       54
208 #define MIO_GROUP_SDIO0_EMIO_CD_PINS       55
209 #define MIO_GROUP_SDIO1_EMIO_WP_PINS       56
210 #define MIO_GROUP_SDIO1_EMIO_CD_PINS       57
211 #define MIO_GROUP_SMC0_NOR_PINS             0,  3,  4,  5,  6,  7,  8,  9, 10, 11, 13, 15, \
212 					   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, \
213 					   28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39
214 #define MIO_GROUP_SMC0_NOR_CS1_GRP_PINS     1
215 #define MIO_GROUP_SMC0_NOR_ADDR25_GRP_PINS  1
216 #define MIO_GROUP_SMC0_NAND_PINS            0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, \
217 					   12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23
218 #define MIO_GROUP_CAN0_0_GRP_PINS          10, 11
219 #define MIO_GROUP_CAN0_1_GRP_PINS          14, 15
220 #define MIO_GROUP_CAN0_2_GRP_PINS          18, 19
221 #define MIO_GROUP_CAN0_3_GRP_PINS          22, 23
222 #define MIO_GROUP_CAN0_4_GRP_PINS          26, 27
223 #define MIO_GROUP_CAN0_5_GRP_PINS          30, 31
224 #define MIO_GROUP_CAN0_6_GRP_PINS          34, 35
225 #define MIO_GROUP_CAN0_7_GRP_PINS          38, 39
226 #define MIO_GROUP_CAN0_8_GRP_PINS          42, 43
227 #define MIO_GROUP_CAN0_9_GRP_PINS          46, 47
228 #define MIO_GROUP_CAN0_10_GRP_PINS         50, 51
229 #define MIO_GROUP_CAN1_0_GRP_PINS           8,  9
230 #define MIO_GROUP_CAN1_1_GRP_PINS          12, 13
231 #define MIO_GROUP_CAN1_2_GRP_PINS          16, 17
232 #define MIO_GROUP_CAN1_3_GRP_PINS          20, 21
233 #define MIO_GROUP_CAN1_4_GRP_PINS          24, 25
234 #define MIO_GROUP_CAN1_5_GRP_PINS          28, 29
235 #define MIO_GROUP_CAN1_6_GRP_PINS          32, 33
236 #define MIO_GROUP_CAN1_7_GRP_PINS          36, 37
237 #define MIO_GROUP_CAN1_8_GRP_PINS          40, 41
238 #define MIO_GROUP_CAN1_9_GRP_PINS          44, 45
239 #define MIO_GROUP_CAN1_10_GRP_PINS         48, 49
240 #define MIO_GROUP_CAN1_11_GRP_PINS         52, 53
241 #define MIO_GROUP_UART0_0_GRP_PINS         10, 11
242 #define MIO_GROUP_UART0_1_GRP_PINS         14, 15
243 #define MIO_GROUP_UART0_2_GRP_PINS         18, 19
244 #define MIO_GROUP_UART0_3_GRP_PINS         22, 23
245 #define MIO_GROUP_UART0_4_GRP_PINS         26, 27
246 #define MIO_GROUP_UART0_5_GRP_PINS         30, 31
247 #define MIO_GROUP_UART0_6_GRP_PINS         34, 35
248 #define MIO_GROUP_UART0_7_GRP_PINS         38, 39
249 #define MIO_GROUP_UART0_8_GRP_PINS         42, 43
250 #define MIO_GROUP_UART0_9_GRP_PINS         46, 47
251 #define MIO_GROUP_UART0_10_GRP_PINS        50, 51
252 #define MIO_GROUP_UART1_0_GRP_PINS          8,  9
253 #define MIO_GROUP_UART1_1_GRP_PINS         12, 13
254 #define MIO_GROUP_UART1_2_GRP_PINS         16, 17
255 #define MIO_GROUP_UART1_3_GRP_PINS         20, 21
256 #define MIO_GROUP_UART1_4_GRP_PINS         24, 25
257 #define MIO_GROUP_UART1_5_GRP_PINS         28, 29
258 #define MIO_GROUP_UART1_6_GRP_PINS         32, 33
259 #define MIO_GROUP_UART1_7_GRP_PINS         36, 37
260 #define MIO_GROUP_UART1_8_GRP_PINS         40, 41
261 #define MIO_GROUP_UART1_9_GRP_PINS         44, 45
262 #define MIO_GROUP_UART1_10_GRP_PINS        48, 49
263 #define MIO_GROUP_UART1_11_GRP_PINS        52, 53
264 #define MIO_GROUP_I2C0_0_GRP_PINS          10, 11
265 #define MIO_GROUP_I2C0_1_GRP_PINS          14, 15
266 #define MIO_GROUP_I2C0_2_GRP_PINS          18, 19
267 #define MIO_GROUP_I2C0_3_GRP_PINS          22, 23
268 #define MIO_GROUP_I2C0_4_GRP_PINS          26, 27
269 #define MIO_GROUP_I2C0_5_GRP_PINS          30, 31
270 #define MIO_GROUP_I2C0_6_GRP_PINS          34, 35
271 #define MIO_GROUP_I2C0_7_GRP_PINS          38, 39
272 #define MIO_GROUP_I2C0_8_GRP_PINS          42, 43
273 #define MIO_GROUP_I2C0_9_GRP_PINS          46, 47
274 #define MIO_GROUP_I2C0_10_GRP_PINS         50, 51
275 #define MIO_GROUP_I2C1_0_GRP_PINS          12, 13
276 #define MIO_GROUP_I2C1_1_GRP_PINS          16, 17
277 #define MIO_GROUP_I2C1_2_GRP_PINS          20, 21
278 #define MIO_GROUP_I2C1_3_GRP_PINS          24, 25
279 #define MIO_GROUP_I2C1_4_GRP_PINS          28, 29
280 #define MIO_GROUP_I2C1_5_GRP_PINS          32, 33
281 #define MIO_GROUP_I2C1_6_GRP_PINS          36, 37
282 #define MIO_GROUP_I2C1_7_GRP_PINS          40, 41
283 #define MIO_GROUP_I2C1_8_GRP_PINS          44, 45
284 #define MIO_GROUP_I2C1_9_GRP_PINS          48, 49
285 #define MIO_GROUP_I2C1_10_GRP_PINS         52, 53
286 #define MIO_GROUP_TTC0_0_GRP_PINS          18, 19
287 #define MIO_GROUP_TTC0_1_GRP_PINS          30, 31
288 #define MIO_GROUP_TTC0_2_GRP_PINS          42, 43
289 #define MIO_GROUP_TTC1_0_GRP_PINS          16, 17
290 #define MIO_GROUP_TTC1_1_GRP_PINS          28, 29
291 #define MIO_GROUP_TTC1_2_GRP_PINS          40, 41
292 #define MIO_GROUP_SWDT0_0_GRP_PINS         14, 15
293 #define MIO_GROUP_SWDT0_1_GRP_PINS         26, 27
294 #define MIO_GROUP_SWDT0_2_GRP_PINS         38, 39
295 #define MIO_GROUP_SWDT0_3_GRP_PINS         50, 51
296 #define MIO_GROUP_SWDT0_4_GRP_PINS         52, 53
297 #define MIO_GROUP_GPIO0_0_GRP_PINS          0
298 #define MIO_GROUP_GPIO0_1_GRP_PINS          1
299 #define MIO_GROUP_GPIO0_2_GRP_PINS          2
300 #define MIO_GROUP_GPIO0_3_GRP_PINS          3
301 #define MIO_GROUP_GPIO0_4_GRP_PINS          4
302 #define MIO_GROUP_GPIO0_5_GRP_PINS          5
303 #define MIO_GROUP_GPIO0_6_GRP_PINS          6
304 #define MIO_GROUP_GPIO0_7_GRP_PINS          7
305 #define MIO_GROUP_GPIO0_8_GRP_PINS          8
306 #define MIO_GROUP_GPIO0_9_GRP_PINS          9
307 #define MIO_GROUP_GPIO0_10_GRP_PINS        10
308 #define MIO_GROUP_GPIO0_11_GRP_PINS        11
309 #define MIO_GROUP_GPIO0_12_GRP_PINS        12
310 #define MIO_GROUP_GPIO0_13_GRP_PINS        13
311 #define MIO_GROUP_GPIO0_14_GRP_PINS        14
312 #define MIO_GROUP_GPIO0_15_GRP_PINS        15
313 #define MIO_GROUP_GPIO0_16_GRP_PINS        16
314 #define MIO_GROUP_GPIO0_17_GRP_PINS        17
315 #define MIO_GROUP_GPIO0_18_GRP_PINS        18
316 #define MIO_GROUP_GPIO0_19_GRP_PINS        19
317 #define MIO_GROUP_GPIO0_20_GRP_PINS        20
318 #define MIO_GROUP_GPIO0_21_GRP_PINS        21
319 #define MIO_GROUP_GPIO0_22_GRP_PINS        22
320 #define MIO_GROUP_GPIO0_23_GRP_PINS        23
321 #define MIO_GROUP_GPIO0_24_GRP_PINS        24
322 #define MIO_GROUP_GPIO0_25_GRP_PINS        25
323 #define MIO_GROUP_GPIO0_26_GRP_PINS        26
324 #define MIO_GROUP_GPIO0_27_GRP_PINS        27
325 #define MIO_GROUP_GPIO0_28_GRP_PINS        28
326 #define MIO_GROUP_GPIO0_29_GRP_PINS        29
327 #define MIO_GROUP_GPIO0_30_GRP_PINS        30
328 #define MIO_GROUP_GPIO0_31_GRP_PINS        31
329 #define MIO_GROUP_GPIO0_32_GRP_PINS        32
330 #define MIO_GROUP_GPIO0_33_GRP_PINS        33
331 #define MIO_GROUP_GPIO0_34_GRP_PINS        34
332 #define MIO_GROUP_GPIO0_35_GRP_PINS        35
333 #define MIO_GROUP_GPIO0_36_GRP_PINS        36
334 #define MIO_GROUP_GPIO0_37_GRP_PINS        37
335 #define MIO_GROUP_GPIO0_38_GRP_PINS        38
336 #define MIO_GROUP_GPIO0_39_GRP_PINS        39
337 #define MIO_GROUP_GPIO0_40_GRP_PINS        40
338 #define MIO_GROUP_GPIO0_41_GRP_PINS        41
339 #define MIO_GROUP_GPIO0_42_GRP_PINS        42
340 #define MIO_GROUP_GPIO0_43_GRP_PINS        43
341 #define MIO_GROUP_GPIO0_44_GRP_PINS        44
342 #define MIO_GROUP_GPIO0_45_GRP_PINS        45
343 #define MIO_GROUP_GPIO0_46_GRP_PINS        46
344 #define MIO_GROUP_GPIO0_47_GRP_PINS        47
345 #define MIO_GROUP_GPIO0_48_GRP_PINS        48
346 #define MIO_GROUP_GPIO0_49_GRP_PINS        49
347 #define MIO_GROUP_GPIO0_50_GRP_PINS        50
348 #define MIO_GROUP_GPIO0_51_GRP_PINS        51
349 #define MIO_GROUP_GPIO0_52_GRP_PINS        52
350 #define MIO_GROUP_GPIO0_53_GRP_PINS        53
351 #define MIO_GROUP_USB0_0_GRP_PINS          28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39
352 #define MIO_GROUP_USB1_0_GRP_PINS          40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
353 
354 typedef struct {
355 	uint32_t mask;
356 	uint32_t val;
357 	uint16_t offset;
358 } pinctrl_soc_pin_t;
359 
360 /* Iterate over each pinctrl-n phandle child */
361 #define Z_PINCTRL_STATE_PINS_INIT(node_id, prop)			\
362 	{DT_FOREACH_CHILD(DT_PHANDLE(node_id, prop),			\
363 		Z_PINCTRL_STATE_PIN_CHILD_INIT)};
364 
365 /*
366  * If child has groups property:
367  *   - Iterate over each pin in group and populate pinctrl_soc_pin_t
368  * If child has pins property:
369  *   - Iterate over each pin in pins and populate pinctrl_soc_pin_t
370  */
371 #define Z_PINCTRL_STATE_PIN_CHILD_INIT(node_id)				\
372 	COND_CODE_1(DT_NODE_HAS_PROP(node_id, groups),			\
373 		(DT_FOREACH_PROP_ELEM(node_id, groups, Z_PINCTRL_STATE_PIN_CHILD_GROUP_INIT)), \
374 		())							\
375 	COND_CODE_1(DT_NODE_HAS_PROP(node_id, pins),			\
376 		(DT_FOREACH_PROP_ELEM(node_id, pins, Z_PINCTRL_STATE_PIN_CHILD_PIN_INIT)), \
377 		())
378 
379 /* Process each pin in group using MIO_GROUP_x_PINS macros defined above */
380 #define Z_PINCTRL_STATE_PIN_CHILD_GROUP_INIT(node_id, prop, idx)	\
381 	FOR_EACH_FIXED_ARG(Z_PINCTRL_STATE_PIN_CHILD_GROUP_PIN_INIT, (), node_id, \
382 		UTIL_CAT(UTIL_CAT(MIO_GROUP_,				\
383 				  DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx)), _PINS))
384 
385 /* Reverse order of arguments to adapt between FOR_EACH_FIXED_ARG() and DT_FOREACH_PROP_ELEM() */
386 #define Z_PINCTRL_STATE_PIN_CHILD_GROUP_PIN_INIT(pin, node_id)		\
387 	Z_PINCTRL_STATE_PIN_INIT(node_id, pin)
388 
389 /* Process pin using MIOx macros defines above */
390 #define Z_PINCTRL_STATE_PIN_CHILD_PIN_INIT(node_id, prop, idx)		\
391 	Z_PINCTRL_STATE_PIN_INIT(node_id, DT_STRING_UPPER_TOKEN_BY_IDX(node_id, prop, idx))
392 
393 /* Process pin functions and special functions (CD, WP) */
394 #define Z_PINCTRL_STATE_PIN_INIT(node_id, pin)				\
395 	COND_CODE_1(Z_PINCTRL_STATE_PIN_IS_SPECIAL_FUNCTION(node_id),	\
396 		(Z_PINCTRL_STATE_PIN_SPECIAL_INIT(node_id, pin)),	\
397 		(Z_PINCTRL_STATE_PIN_FUNCTION_INIT(node_id, pin)))
398 
399 /* Determine if pin has special function */
400 #define Z_PINCTRL_STATE_PIN_IS_SPECIAL_FUNCTION(node_id)		\
401 	COND_CODE_1(DT_NODE_HAS_PROP(node_id, function),		\
402 		(UTIL_CAT(MIO_PIN_SPECIAL_FUNCTION_, DT_STRING_UPPER_TOKEN(node_id, function))), \
403 		(0))
404 
405 /* Populate pinctrl_soc_pin_t for each special function pin */
406 #define Z_PINCTRL_STATE_PIN_SPECIAL_INIT(node_id, pin)			\
407 	{								\
408 		.mask = UTIL_CAT(MIO_PIN_SPECIAL_MASK_,			\
409 				DT_STRING_UPPER_TOKEN(node_id, function)), \
410 		.val = pin << UTIL_CAT(MIO_PIN_SPECIAL_SHIFT_,		\
411 				DT_STRING_UPPER_TOKEN(node_id, function)), \
412 		.offset = UTIL_CAT(MIO_PIN_SPECIAL_OFFSET_,		\
413 				DT_STRING_UPPER_TOKEN(node_id, function)), \
414 	},
415 
416 /* Populate pinctrl_soc_pin_t for each pin */
417 #define Z_PINCTRL_STATE_PIN_FUNCTION_INIT(node_id, pin)		\
418 	{							\
419 		.mask = Z_PINCTRL_STATE_PIN_MASK(node_id),	\
420 		.val = Z_PINCTRL_STATE_PIN_VAL(node_id),	\
421 		.offset = pin * sizeof(uint32_t),		\
422 	},
423 
424 #define Z_PINCTRL_STATE_PIN_MASK(node_id) \
425 	COND_CODE_1(DT_NODE_HAS_PROP(node_id, function), (MIO_PIN_LX_SEL_MASK), (0U)) | \
426 	COND_CODE_1(DT_PROP(node_id, bias_disable),			\
427 		(MIO_PIN_PULLUP_MASK | MIO_PIN_TRI_ENABLE_MASK), (0U)) | \
428 	COND_CODE_1(DT_PROP(node_id, low_power_disable), (MIO_PIN_DISABLE_RCVR_MASK), (0U)) | \
429 	COND_CODE_1(DT_NODE_HAS_PROP(node_id, power_source), (MIO_PIN_IO_TYPE_MASK), (0U)) | \
430 	COND_CODE_1(DT_NODE_HAS_PROP(node_id, slew_rate), (MIO_PIN_SPEED_MASK), (0U))
431 
432 #define Z_PINCTRL_STATE_PIN_VAL(node_id) \
433 	COND_CODE_1(DT_NODE_HAS_PROP(node_id, function),		\
434 		(UTIL_CAT(MIO_PIN_FUNCTION_, DT_STRING_UPPER_TOKEN(node_id, function))), (0U)) | \
435 	MIO_PIN_TRI_ENABLE(DT_PROP(node_id, bias_high_impedance)) | \
436 	MIO_PIN_PULLUP(DT_PROP(node_id, bias_pull_up)) | \
437 	MIO_PIN_DISABLE_RCVR(DT_PROP(node_id, low_power_enable)) | \
438 	MIO_PIN_IO_TYPE(DT_PROP_OR(node_id, power_source, (0U))) | \
439 	MIO_PIN_SPEED(DT_PROP_OR(node_id, slew_rate, (0U)))
440 
441 #ifdef __cplusplus
442 }
443 #endif
444 
445 #endif /* ZEPHYR_SOC_ARM_XILINX_ZYNQ7000_COMMON_PINCTRL_SOC_H_ */
446