1 /*
2  * Copyright (c) 2017 Linaro Limited
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_STM32_PINCTRL_H_
8 #define ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_STM32_PINCTRL_H_
9 
10 #include <zephyr/dt-bindings/pinctrl/stm32-pinctrl-common.h>
11 
12 /* Adapted from Linux: include/dt-bindings/pinctrl/stm32-pinfunc.h */
13 
14 /**
15  * @brief Pin modes
16  */
17 
18 #define STM32_AF0     0x0
19 #define STM32_AF1     0x1
20 #define STM32_AF2     0x2
21 #define STM32_AF3     0x3
22 #define STM32_AF4     0x4
23 #define STM32_AF5     0x5
24 #define STM32_AF6     0x6
25 #define STM32_AF7     0x7
26 #define STM32_AF8     0x8
27 #define STM32_AF9     0x9
28 #define STM32_AF10    0xa
29 #define STM32_AF11    0xb
30 #define STM32_AF12    0xc
31 #define STM32_AF13    0xd
32 #define STM32_AF14    0xe
33 #define STM32_AF15    0xf
34 #define STM32_ANALOG  0x10
35 #define STM32_GPIO    0x11
36 
37 /**
38  * @brief Macro to generate pinmux int using port, pin number and mode arguments
39  * This is inspired from Linux equivalent st,stm32f429-pinctrl binding
40  */
41 
42 #define STM32_MODE_SHIFT 0U
43 #define STM32_MODE_MASK  0x1FU
44 #define STM32_LINE_SHIFT 5U
45 #define STM32_LINE_MASK  0xFU
46 #define STM32_PORT_SHIFT 9U
47 #define STM32_PORT_MASK  0xFU
48 
49 /**
50  * @brief Pin configuration configuration bit field.
51  *
52  * Fields:
53  *
54  * - mode [ 0 : 4 ]
55  * - line [ 5 : 8 ]
56  * - port [ 9 : 12 ]
57  *
58  * @param port Port ('A'..'K')
59  * @param line Pin (0..15)
60  * @param mode Mode (ANALOG, GPIO_IN, ALTERNATE).
61  */
62 #define STM32_PINMUX(port, line, mode)					       \
63 		(((((port) - 'A') & STM32_PORT_MASK) << STM32_PORT_SHIFT) |    \
64 		(((line) & STM32_LINE_MASK) << STM32_LINE_SHIFT) |	       \
65 		(((STM32_ ## mode) & STM32_MODE_MASK) << STM32_MODE_SHIFT))
66 
67 /**
68  * @brief PIN configuration bitfield
69  *
70  * Pin configuration is coded with the following
71  * fields
72  *    Alternate Functions [ 0 : 3 ]
73  *    GPIO Mode           [ 4 : 5 ]
74  *    GPIO Output type    [ 6 ]
75  *    GPIO Speed          [ 7 : 8 ]
76  *    GPIO PUPD config    [ 9 : 10 ]
77  *    GPIO Output data     [ 11 ]
78  *
79  */
80 
81 /* GPIO Mode */
82 #define STM32_MODER_INPUT_MODE		(0x0 << STM32_MODER_SHIFT)
83 #define STM32_MODER_OUTPUT_MODE		(0x1 << STM32_MODER_SHIFT)
84 #define STM32_MODER_ALT_MODE		(0x2 << STM32_MODER_SHIFT)
85 #define STM32_MODER_ANALOG_MODE		(0x3 << STM32_MODER_SHIFT)
86 #define STM32_MODER_MASK	 	0x3
87 #define STM32_MODER_SHIFT		4
88 
89 /* GPIO Output type */
90 #define STM32_OTYPER_PUSH_PULL		(0x0 << STM32_OTYPER_SHIFT)
91 #define STM32_OTYPER_OPEN_DRAIN		(0x1 << STM32_OTYPER_SHIFT)
92 #define STM32_OTYPER_MASK		0x1
93 #define STM32_OTYPER_SHIFT		6
94 
95 /* GPIO speed */
96 #define STM32_OSPEEDR_LOW_SPEED		(0x0 << STM32_OSPEEDR_SHIFT)
97 #define STM32_OSPEEDR_MEDIUM_SPEED	(0x1 << STM32_OSPEEDR_SHIFT)
98 #define STM32_OSPEEDR_HIGH_SPEED	(0x2 << STM32_OSPEEDR_SHIFT)
99 #define STM32_OSPEEDR_VERY_HIGH_SPEED	(0x3 << STM32_OSPEEDR_SHIFT)
100 #define STM32_OSPEEDR_MASK		0x3
101 #define STM32_OSPEEDR_SHIFT		7
102 
103 /* GPIO High impedance/Pull-up/pull-down */
104 #define STM32_PUPDR_NO_PULL		(0x0 << STM32_PUPDR_SHIFT)
105 #define STM32_PUPDR_PULL_UP		(0x1 << STM32_PUPDR_SHIFT)
106 #define STM32_PUPDR_PULL_DOWN		(0x2 << STM32_PUPDR_SHIFT)
107 #define STM32_PUPDR_MASK		0x3
108 #define STM32_PUPDR_SHIFT		9
109 
110 /* GPIO plain output value */
111 #define STM32_ODR_0			(0x0 << STM32_ODR_SHIFT)
112 #define STM32_ODR_1			(0x1 << STM32_ODR_SHIFT)
113 #define STM32_ODR_MASK			0x1
114 #define STM32_ODR_SHIFT			11
115 
116 #endif	/* ZEPHYR_INCLUDE_DT_BINDINGS_PINCTRL_STM32_PINCTRL_H_ */
117