1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | |
3 | #include <linux/module.h> |
4 | #include <linux/platform_device.h> |
5 | #include <linux/of.h> |
6 | #include "pinctrl-mtmips.h" |
7 | |
8 | #define MT76X8_GPIO_MODE_MASK 0x3 |
9 | |
10 | #define MT76X8_GPIO_MODE_P4LED_KN 58 |
11 | #define MT76X8_GPIO_MODE_P3LED_KN 56 |
12 | #define MT76X8_GPIO_MODE_P2LED_KN 54 |
13 | #define MT76X8_GPIO_MODE_P1LED_KN 52 |
14 | #define MT76X8_GPIO_MODE_P0LED_KN 50 |
15 | #define MT76X8_GPIO_MODE_WLED_KN 48 |
16 | #define MT76X8_GPIO_MODE_P4LED_AN 42 |
17 | #define MT76X8_GPIO_MODE_P3LED_AN 40 |
18 | #define MT76X8_GPIO_MODE_P2LED_AN 38 |
19 | #define MT76X8_GPIO_MODE_P1LED_AN 36 |
20 | #define MT76X8_GPIO_MODE_P0LED_AN 34 |
21 | #define MT76X8_GPIO_MODE_WLED_AN 32 |
22 | #define MT76X8_GPIO_MODE_PWM1 30 |
23 | #define MT76X8_GPIO_MODE_PWM0 28 |
24 | #define MT76X8_GPIO_MODE_UART2 26 |
25 | #define MT76X8_GPIO_MODE_UART1 24 |
26 | #define MT76X8_GPIO_MODE_I2C 20 |
27 | #define MT76X8_GPIO_MODE_REFCLK 18 |
28 | #define MT76X8_GPIO_MODE_PERST 16 |
29 | #define MT76X8_GPIO_MODE_WDT 14 |
30 | #define MT76X8_GPIO_MODE_SPI 12 |
31 | #define MT76X8_GPIO_MODE_SDMODE 10 |
32 | #define MT76X8_GPIO_MODE_UART0 8 |
33 | #define MT76X8_GPIO_MODE_I2S 6 |
34 | #define MT76X8_GPIO_MODE_CS1 4 |
35 | #define MT76X8_GPIO_MODE_SPIS 2 |
36 | #define MT76X8_GPIO_MODE_GPIO 0 |
37 | |
38 | static struct mtmips_pmx_func pwm1_grp[] = { |
39 | FUNC("sdxc d6" , 3, 19, 1), |
40 | FUNC("utif" , 2, 19, 1), |
41 | FUNC("gpio" , 1, 19, 1), |
42 | FUNC("pwm1" , 0, 19, 1), |
43 | }; |
44 | |
45 | static struct mtmips_pmx_func pwm0_grp[] = { |
46 | FUNC("sdxc d7" , 3, 18, 1), |
47 | FUNC("utif" , 2, 18, 1), |
48 | FUNC("gpio" , 1, 18, 1), |
49 | FUNC("pwm0" , 0, 18, 1), |
50 | }; |
51 | |
52 | static struct mtmips_pmx_func uart2_grp[] = { |
53 | FUNC("sdxc d5 d4" , 3, 20, 2), |
54 | FUNC("pwm" , 2, 20, 2), |
55 | FUNC("gpio" , 1, 20, 2), |
56 | FUNC("uart2" , 0, 20, 2), |
57 | }; |
58 | |
59 | static struct mtmips_pmx_func uart1_grp[] = { |
60 | FUNC("sw_r" , 3, 45, 2), |
61 | FUNC("pwm" , 2, 45, 2), |
62 | FUNC("gpio" , 1, 45, 2), |
63 | FUNC("uart1" , 0, 45, 2), |
64 | }; |
65 | |
66 | static struct mtmips_pmx_func i2c_grp[] = { |
67 | FUNC("-" , 3, 4, 2), |
68 | FUNC("debug" , 2, 4, 2), |
69 | FUNC("gpio" , 1, 4, 2), |
70 | FUNC("i2c" , 0, 4, 2), |
71 | }; |
72 | |
73 | static struct mtmips_pmx_func refclk_grp[] = { FUNC("refclk" , 0, 37, 1) }; |
74 | static struct mtmips_pmx_func perst_grp[] = { FUNC("perst" , 0, 36, 1) }; |
75 | static struct mtmips_pmx_func wdt_grp[] = { FUNC("wdt" , 0, 38, 1) }; |
76 | static struct mtmips_pmx_func spi_grp[] = { FUNC("spi" , 0, 7, 4) }; |
77 | |
78 | static struct mtmips_pmx_func sd_mode_grp[] = { |
79 | FUNC("jtag" , 3, 22, 8), |
80 | FUNC("utif" , 2, 22, 8), |
81 | FUNC("gpio" , 1, 22, 8), |
82 | FUNC("sdxc" , 0, 22, 8), |
83 | }; |
84 | |
85 | static struct mtmips_pmx_func uart0_grp[] = { |
86 | FUNC("-" , 3, 12, 2), |
87 | FUNC("-" , 2, 12, 2), |
88 | FUNC("gpio" , 1, 12, 2), |
89 | FUNC("uart0" , 0, 12, 2), |
90 | }; |
91 | |
92 | static struct mtmips_pmx_func i2s_grp[] = { |
93 | FUNC("antenna" , 3, 0, 4), |
94 | FUNC("pcm" , 2, 0, 4), |
95 | FUNC("gpio" , 1, 0, 4), |
96 | FUNC("i2s" , 0, 0, 4), |
97 | }; |
98 | |
99 | static struct mtmips_pmx_func spi_cs1_grp[] = { |
100 | FUNC("-" , 3, 6, 1), |
101 | FUNC("refclk" , 2, 6, 1), |
102 | FUNC("gpio" , 1, 6, 1), |
103 | FUNC("spi cs1" , 0, 6, 1), |
104 | }; |
105 | |
106 | static struct mtmips_pmx_func spis_grp[] = { |
107 | FUNC("pwm_uart2" , 3, 14, 4), |
108 | FUNC("utif" , 2, 14, 4), |
109 | FUNC("gpio" , 1, 14, 4), |
110 | FUNC("spis" , 0, 14, 4), |
111 | }; |
112 | |
113 | static struct mtmips_pmx_func gpio_grp[] = { |
114 | FUNC("pcie" , 3, 11, 1), |
115 | FUNC("refclk" , 2, 11, 1), |
116 | FUNC("gpio" , 1, 11, 1), |
117 | FUNC("gpio" , 0, 11, 1), |
118 | }; |
119 | |
120 | static struct mtmips_pmx_func p4led_kn_grp[] = { |
121 | FUNC("jtag" , 3, 30, 1), |
122 | FUNC("utif" , 2, 30, 1), |
123 | FUNC("gpio" , 1, 30, 1), |
124 | FUNC("p4led_kn" , 0, 30, 1), |
125 | }; |
126 | |
127 | static struct mtmips_pmx_func p3led_kn_grp[] = { |
128 | FUNC("jtag" , 3, 31, 1), |
129 | FUNC("utif" , 2, 31, 1), |
130 | FUNC("gpio" , 1, 31, 1), |
131 | FUNC("p3led_kn" , 0, 31, 1), |
132 | }; |
133 | |
134 | static struct mtmips_pmx_func p2led_kn_grp[] = { |
135 | FUNC("jtag" , 3, 32, 1), |
136 | FUNC("utif" , 2, 32, 1), |
137 | FUNC("gpio" , 1, 32, 1), |
138 | FUNC("p2led_kn" , 0, 32, 1), |
139 | }; |
140 | |
141 | static struct mtmips_pmx_func p1led_kn_grp[] = { |
142 | FUNC("jtag" , 3, 33, 1), |
143 | FUNC("utif" , 2, 33, 1), |
144 | FUNC("gpio" , 1, 33, 1), |
145 | FUNC("p1led_kn" , 0, 33, 1), |
146 | }; |
147 | |
148 | static struct mtmips_pmx_func p0led_kn_grp[] = { |
149 | FUNC("jtag" , 3, 34, 1), |
150 | FUNC("rsvd" , 2, 34, 1), |
151 | FUNC("gpio" , 1, 34, 1), |
152 | FUNC("p0led_kn" , 0, 34, 1), |
153 | }; |
154 | |
155 | static struct mtmips_pmx_func wled_kn_grp[] = { |
156 | FUNC("rsvd" , 3, 35, 1), |
157 | FUNC("rsvd" , 2, 35, 1), |
158 | FUNC("gpio" , 1, 35, 1), |
159 | FUNC("wled_kn" , 0, 35, 1), |
160 | }; |
161 | |
162 | static struct mtmips_pmx_func p4led_an_grp[] = { |
163 | FUNC("jtag" , 3, 39, 1), |
164 | FUNC("utif" , 2, 39, 1), |
165 | FUNC("gpio" , 1, 39, 1), |
166 | FUNC("p4led_an" , 0, 39, 1), |
167 | }; |
168 | |
169 | static struct mtmips_pmx_func p3led_an_grp[] = { |
170 | FUNC("jtag" , 3, 40, 1), |
171 | FUNC("utif" , 2, 40, 1), |
172 | FUNC("gpio" , 1, 40, 1), |
173 | FUNC("p3led_an" , 0, 40, 1), |
174 | }; |
175 | |
176 | static struct mtmips_pmx_func p2led_an_grp[] = { |
177 | FUNC("jtag" , 3, 41, 1), |
178 | FUNC("utif" , 2, 41, 1), |
179 | FUNC("gpio" , 1, 41, 1), |
180 | FUNC("p2led_an" , 0, 41, 1), |
181 | }; |
182 | |
183 | static struct mtmips_pmx_func p1led_an_grp[] = { |
184 | FUNC("jtag" , 3, 42, 1), |
185 | FUNC("utif" , 2, 42, 1), |
186 | FUNC("gpio" , 1, 42, 1), |
187 | FUNC("p1led_an" , 0, 42, 1), |
188 | }; |
189 | |
190 | static struct mtmips_pmx_func p0led_an_grp[] = { |
191 | FUNC("jtag" , 3, 43, 1), |
192 | FUNC("rsvd" , 2, 43, 1), |
193 | FUNC("gpio" , 1, 43, 1), |
194 | FUNC("p0led_an" , 0, 43, 1), |
195 | }; |
196 | |
197 | static struct mtmips_pmx_func wled_an_grp[] = { |
198 | FUNC("rsvd" , 3, 44, 1), |
199 | FUNC("rsvd" , 2, 44, 1), |
200 | FUNC("gpio" , 1, 44, 1), |
201 | FUNC("wled_an" , 0, 44, 1), |
202 | }; |
203 | |
204 | static struct mtmips_pmx_group mt76x8_pinmux_data[] = { |
205 | GRP_G("pwm1" , pwm1_grp, MT76X8_GPIO_MODE_MASK, |
206 | 1, MT76X8_GPIO_MODE_PWM1), |
207 | GRP_G("pwm0" , pwm0_grp, MT76X8_GPIO_MODE_MASK, |
208 | 1, MT76X8_GPIO_MODE_PWM0), |
209 | GRP_G("uart2" , uart2_grp, MT76X8_GPIO_MODE_MASK, |
210 | 1, MT76X8_GPIO_MODE_UART2), |
211 | GRP_G("uart1" , uart1_grp, MT76X8_GPIO_MODE_MASK, |
212 | 1, MT76X8_GPIO_MODE_UART1), |
213 | GRP_G("i2c" , i2c_grp, MT76X8_GPIO_MODE_MASK, |
214 | 1, MT76X8_GPIO_MODE_I2C), |
215 | GRP("refclk" , refclk_grp, 1, MT76X8_GPIO_MODE_REFCLK), |
216 | GRP("perst" , perst_grp, 1, MT76X8_GPIO_MODE_PERST), |
217 | GRP("wdt" , wdt_grp, 1, MT76X8_GPIO_MODE_WDT), |
218 | GRP("spi" , spi_grp, 1, MT76X8_GPIO_MODE_SPI), |
219 | GRP_G("sdmode" , sd_mode_grp, MT76X8_GPIO_MODE_MASK, |
220 | 1, MT76X8_GPIO_MODE_SDMODE), |
221 | GRP_G("uart0" , uart0_grp, MT76X8_GPIO_MODE_MASK, |
222 | 1, MT76X8_GPIO_MODE_UART0), |
223 | GRP_G("i2s" , i2s_grp, MT76X8_GPIO_MODE_MASK, |
224 | 1, MT76X8_GPIO_MODE_I2S), |
225 | GRP_G("spi cs1" , spi_cs1_grp, MT76X8_GPIO_MODE_MASK, |
226 | 1, MT76X8_GPIO_MODE_CS1), |
227 | GRP_G("spis" , spis_grp, MT76X8_GPIO_MODE_MASK, |
228 | 1, MT76X8_GPIO_MODE_SPIS), |
229 | GRP_G("gpio" , gpio_grp, MT76X8_GPIO_MODE_MASK, |
230 | 1, MT76X8_GPIO_MODE_GPIO), |
231 | GRP_G("wled_an" , wled_an_grp, MT76X8_GPIO_MODE_MASK, |
232 | 1, MT76X8_GPIO_MODE_WLED_AN), |
233 | GRP_G("p0led_an" , p0led_an_grp, MT76X8_GPIO_MODE_MASK, |
234 | 1, MT76X8_GPIO_MODE_P0LED_AN), |
235 | GRP_G("p1led_an" , p1led_an_grp, MT76X8_GPIO_MODE_MASK, |
236 | 1, MT76X8_GPIO_MODE_P1LED_AN), |
237 | GRP_G("p2led_an" , p2led_an_grp, MT76X8_GPIO_MODE_MASK, |
238 | 1, MT76X8_GPIO_MODE_P2LED_AN), |
239 | GRP_G("p3led_an" , p3led_an_grp, MT76X8_GPIO_MODE_MASK, |
240 | 1, MT76X8_GPIO_MODE_P3LED_AN), |
241 | GRP_G("p4led_an" , p4led_an_grp, MT76X8_GPIO_MODE_MASK, |
242 | 1, MT76X8_GPIO_MODE_P4LED_AN), |
243 | GRP_G("wled_kn" , wled_kn_grp, MT76X8_GPIO_MODE_MASK, |
244 | 1, MT76X8_GPIO_MODE_WLED_KN), |
245 | GRP_G("p0led_kn" , p0led_kn_grp, MT76X8_GPIO_MODE_MASK, |
246 | 1, MT76X8_GPIO_MODE_P0LED_KN), |
247 | GRP_G("p1led_kn" , p1led_kn_grp, MT76X8_GPIO_MODE_MASK, |
248 | 1, MT76X8_GPIO_MODE_P1LED_KN), |
249 | GRP_G("p2led_kn" , p2led_kn_grp, MT76X8_GPIO_MODE_MASK, |
250 | 1, MT76X8_GPIO_MODE_P2LED_KN), |
251 | GRP_G("p3led_kn" , p3led_kn_grp, MT76X8_GPIO_MODE_MASK, |
252 | 1, MT76X8_GPIO_MODE_P3LED_KN), |
253 | GRP_G("p4led_kn" , p4led_kn_grp, MT76X8_GPIO_MODE_MASK, |
254 | 1, MT76X8_GPIO_MODE_P4LED_KN), |
255 | { 0 } |
256 | }; |
257 | |
258 | static int mt76x8_pinctrl_probe(struct platform_device *pdev) |
259 | { |
260 | return mtmips_pinctrl_init(pdev, data: mt76x8_pinmux_data); |
261 | } |
262 | |
263 | static const struct of_device_id mt76x8_pinctrl_match[] = { |
264 | { .compatible = "ralink,mt76x8-pinctrl" }, |
265 | { .compatible = "ralink,mt7620-pinctrl" }, |
266 | { .compatible = "ralink,rt2880-pinmux" }, |
267 | {} |
268 | }; |
269 | MODULE_DEVICE_TABLE(of, mt76x8_pinctrl_match); |
270 | |
271 | static struct platform_driver mt76x8_pinctrl_driver = { |
272 | .probe = mt76x8_pinctrl_probe, |
273 | .driver = { |
274 | .name = "mt76x8-pinctrl" , |
275 | .of_match_table = mt76x8_pinctrl_match, |
276 | }, |
277 | }; |
278 | |
279 | static int __init mt76x8_pinctrl_init(void) |
280 | { |
281 | return platform_driver_register(&mt76x8_pinctrl_driver); |
282 | } |
283 | core_initcall_sync(mt76x8_pinctrl_init); |
284 | |