1 /*
2  * Copyright (c) 2021 Teslabs Engineering S.L.
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #ifndef DT_BINDINGS_PINCTRL_GD32_AF_H_
7 #define DT_BINDINGS_PINCTRL_GD32_AF_H_
8 
9 /**
10  * @name GD32 AFs
11  * @{
12  */
13 
14 /** AF0 */
15 #define GD32_AF0 0U
16 /** AF1 */
17 #define GD32_AF1 1U
18 /** AF2 */
19 #define GD32_AF2 2U
20 /** AF3 */
21 #define GD32_AF3 3U
22 /** AF4 */
23 #define GD32_AF4 4U
24 /** AF5 */
25 #define GD32_AF5 5U
26 /** AF6 */
27 #define GD32_AF6 6U
28 /** AF7 */
29 #define GD32_AF7 7U
30 /** AF8 */
31 #define GD32_AF8 8U
32 /** AF9 */
33 #define GD32_AF9 9U
34 /** AF10 */
35 #define GD32_AF10 10U
36 /** AF11 */
37 #define GD32_AF11 11U
38 /** AF12 */
39 #define GD32_AF12 12U
40 /** AF13 */
41 #define GD32_AF13 13U
42 /** AF14 */
43 #define GD32_AF14 14U
44 /** AF15 */
45 #define GD32_AF15 15U
46 /** ANALOG */
47 #define GD32_ANALOG 16U
48 
49 /** @} */
50 
51 /**
52  * @name GD32 pinmux bit field mask and positions.
53  * @{
54  */
55 
56 /** Port field mask. */
57 #define GD32_PORT_MSK 0xFU
58 /** Port field position. */
59 #define GD32_PORT_POS 0U
60 /** Pin field mask. */
61 #define GD32_PIN_MSK 0xFU
62 /** Pin field position. */
63 #define GD32_PIN_POS 4U
64 /** AF field mask. */
65 #define GD32_AF_MSK 0x1FU
66 /** AF field position. */
67 #define GD32_AF_POS 8U
68 
69 /** @} */
70 
71 /**
72  * Obtain port field from pinmux configuration.
73  *
74  * @param pinmux Pinmux bit field value.
75  */
76 #define GD32_PORT_GET(pinmux) \
77 	(((pinmux) >> GD32_PORT_POS) & GD32_PORT_MSK)
78 
79 /**
80  * Obtain pin field from pinmux configuration.
81  *
82  * @param pinmux Pinmux bit field value.
83  */
84 #define GD32_PIN_GET(pinmux) \
85 	(((pinmux) >> GD32_PIN_POS) & GD32_PIN_MSK)
86 
87 /**
88  * Obtain AF field from pinmux configuration.
89  *
90  * @param pinmux Pinmux bit field value.
91  */
92 #define GD32_AF_GET(pinmux) \
93 	(((pinmux) >> GD32_AF_POS) & GD32_AF_MSK)
94 
95 /**
96  * @brief Remap configuration bit field.
97  *
98  * Fields:
99  *
100  * - 0..3: port
101  * - 4..7: pin
102  * - 8..12: af
103  *
104  * @param port Port ('A'..'P')
105  * @param pin Pin (0..15)
106  * @param af Alternate function (ANALOG, AFx, x=0..15).
107  */
108 #define GD32_PINMUX_AF(port, pin, af)					\
109 	(((((port) - 'A') & GD32_PORT_MSK) << GD32_PORT_POS) |		\
110 	 (((pin) & GD32_PIN_MSK) << GD32_PIN_POS) |			\
111 	 (((GD32_ ## af) & GD32_AF_MSK) << GD32_AF_POS))
112 
113 #endif /* DT_BINDINGS_PINCTRL_GD32_AF_H_ */
114