1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2020
4  * Author(s): Giulio Benetti <giulio.benetti@benettiengineering.com>
5  */
6 
7 #include <linux/err.h>
8 #include <linux/init.h>
9 #include <linux/of_device.h>
10 #include <linux/pinctrl/pinctrl.h>
11 #include <linux/platform_device.h>
12 
13 #include "pinctrl-imx.h"
14 
15 enum imxrt1050_pads {
16 	IMXRT1050_PAD_RESERVE0,
17 	IMXRT1050_PAD_RESERVE1,
18 	IMXRT1050_PAD_RESERVE2,
19 	IMXRT1050_PAD_RESERVE3,
20 	IMXRT1050_PAD_RESERVE4,
21 	IMXRT1050_PAD_EMC_00,
22 	IMXRT1050_PAD_EMC_01,
23 	IMXRT1050_PAD_EMC_02,
24 	IMXRT1050_PAD_EMC_03,
25 	IMXRT1050_PAD_EMC_04,
26 	IMXRT1050_PAD_EMC_05,
27 	IMXRT1050_PAD_EMC_06,
28 	IMXRT1050_PAD_EMC_07,
29 	IMXRT1050_PAD_EMC_08,
30 	IMXRT1050_PAD_EMC_09,
31 	IMXRT1050_PAD_EMC_10,
32 	IMXRT1050_PAD_EMC_11,
33 	IMXRT1050_PAD_EMC_12,
34 	IMXRT1050_PAD_EMC_13,
35 	IMXRT1050_PAD_EMC_14,
36 	IMXRT1050_PAD_EMC_15,
37 	IMXRT1050_PAD_EMC_16,
38 	IMXRT1050_PAD_EMC_17,
39 	IMXRT1050_PAD_EMC_18,
40 	IMXRT1050_PAD_EMC_19,
41 	IMXRT1050_PAD_EMC_20,
42 	IMXRT1050_PAD_EMC_21,
43 	IMXRT1050_PAD_EMC_22,
44 	IMXRT1050_PAD_EMC_23,
45 	IMXRT1050_PAD_EMC_24,
46 	IMXRT1050_PAD_EMC_25,
47 	IMXRT1050_PAD_EMC_26,
48 	IMXRT1050_PAD_EMC_27,
49 	IMXRT1050_PAD_EMC_28,
50 	IMXRT1050_PAD_EMC_29,
51 	IMXRT1050_PAD_EMC_30,
52 	IMXRT1050_PAD_EMC_31,
53 	IMXRT1050_PAD_EMC_32,
54 	IMXRT1050_PAD_EMC_33,
55 	IMXRT1050_PAD_EMC_34,
56 	IMXRT1050_PAD_EMC_35,
57 	IMXRT1050_PAD_EMC_36,
58 	IMXRT1050_PAD_EMC_37,
59 	IMXRT1050_PAD_EMC_38,
60 	IMXRT1050_PAD_EMC_39,
61 	IMXRT1050_PAD_EMC_40,
62 	IMXRT1050_PAD_EMC_41,
63 	IMXRT1050_PAD_AD_B0_00,
64 	IMXRT1050_PAD_AD_B0_01,
65 	IMXRT1050_PAD_AD_B0_02,
66 	IMXRT1050_PAD_AD_B0_03,
67 	IMXRT1050_PAD_AD_B0_04,
68 	IMXRT1050_PAD_AD_B0_05,
69 	IMXRT1050_PAD_AD_B0_06,
70 	IMXRT1050_PAD_AD_B0_07,
71 	IMXRT1050_PAD_AD_B0_08,
72 	IMXRT1050_PAD_AD_B0_09,
73 	IMXRT1050_PAD_AD_B0_10,
74 	IMXRT1050_PAD_AD_B0_11,
75 	IMXRT1050_PAD_AD_B0_12,
76 	IMXRT1050_PAD_AD_B0_13,
77 	IMXRT1050_PAD_AD_B0_14,
78 	IMXRT1050_PAD_AD_B0_15,
79 	IMXRT1050_PAD_AD_B1_00,
80 	IMXRT1050_PAD_AD_B1_01,
81 	IMXRT1050_PAD_AD_B1_02,
82 	IMXRT1050_PAD_AD_B1_03,
83 	IMXRT1050_PAD_AD_B1_04,
84 	IMXRT1050_PAD_AD_B1_05,
85 	IMXRT1050_PAD_AD_B1_06,
86 	IMXRT1050_PAD_AD_B1_07,
87 	IMXRT1050_PAD_AD_B1_08,
88 	IMXRT1050_PAD_AD_B1_09,
89 	IMXRT1050_PAD_AD_B1_10,
90 	IMXRT1050_PAD_AD_B1_11,
91 	IMXRT1050_PAD_AD_B1_12,
92 	IMXRT1050_PAD_AD_B1_13,
93 	IMXRT1050_PAD_AD_B1_14,
94 	IMXRT1050_PAD_AD_B1_15,
95 	IMXRT1050_PAD_B0_00,
96 	IMXRT1050_PAD_B0_01,
97 	IMXRT1050_PAD_B0_02,
98 	IMXRT1050_PAD_B0_03,
99 	IMXRT1050_PAD_B0_04,
100 	IMXRT1050_PAD_B0_05,
101 	IMXRT1050_PAD_B0_06,
102 	IMXRT1050_PAD_B0_07,
103 	IMXRT1050_PAD_B0_08,
104 	IMXRT1050_PAD_B0_09,
105 	IMXRT1050_PAD_B0_10,
106 	IMXRT1050_PAD_B0_11,
107 	IMXRT1050_PAD_B0_12,
108 	IMXRT1050_PAD_B0_13,
109 	IMXRT1050_PAD_B0_14,
110 	IMXRT1050_PAD_B0_15,
111 	IMXRT1050_PAD_B1_00,
112 	IMXRT1050_PAD_B1_01,
113 	IMXRT1050_PAD_B1_02,
114 	IMXRT1050_PAD_B1_03,
115 	IMXRT1050_PAD_B1_04,
116 	IMXRT1050_PAD_B1_05,
117 	IMXRT1050_PAD_B1_06,
118 	IMXRT1050_PAD_B1_07,
119 	IMXRT1050_PAD_B1_08,
120 	IMXRT1050_PAD_B1_09,
121 	IMXRT1050_PAD_B1_10,
122 	IMXRT1050_PAD_B1_11,
123 	IMXRT1050_PAD_B1_12,
124 	IMXRT1050_PAD_B1_13,
125 	IMXRT1050_PAD_B1_14,
126 	IMXRT1050_PAD_B1_15,
127 	IMXRT1050_PAD_SD_B0_00,
128 	IMXRT1050_PAD_SD_B0_01,
129 	IMXRT1050_PAD_SD_B0_02,
130 	IMXRT1050_PAD_SD_B0_03,
131 	IMXRT1050_PAD_SD_B0_04,
132 	IMXRT1050_PAD_SD_B0_05,
133 	IMXRT1050_PAD_SD_B1_00,
134 	IMXRT1050_PAD_SD_B1_01,
135 	IMXRT1050_PAD_SD_B1_02,
136 	IMXRT1050_PAD_SD_B1_03,
137 	IMXRT1050_PAD_SD_B1_04,
138 	IMXRT1050_PAD_SD_B1_05,
139 	IMXRT1050_PAD_SD_B1_06,
140 	IMXRT1050_PAD_SD_B1_07,
141 	IMXRT1050_PAD_SD_B1_08,
142 	IMXRT1050_PAD_SD_B1_09,
143 	IMXRT1050_PAD_SD_B1_10,
144 	IMXRT1050_PAD_SD_B1_11,
145 };
146 
147 /* Pad names for the pinmux subsystem */
148 static const struct pinctrl_pin_desc imxrt1050_pinctrl_pads[] = {
149 	IMX_PINCTRL_PIN(IMXRT1050_PAD_RESERVE0),
150 	IMX_PINCTRL_PIN(IMXRT1050_PAD_RESERVE1),
151 	IMX_PINCTRL_PIN(IMXRT1050_PAD_RESERVE2),
152 	IMX_PINCTRL_PIN(IMXRT1050_PAD_RESERVE3),
153 	IMX_PINCTRL_PIN(IMXRT1050_PAD_RESERVE4),
154 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_00),
155 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_01),
156 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_02),
157 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_03),
158 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_04),
159 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_05),
160 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_06),
161 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_07),
162 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_08),
163 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_09),
164 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_10),
165 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_11),
166 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_12),
167 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_13),
168 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_14),
169 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_15),
170 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_16),
171 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_17),
172 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_18),
173 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_19),
174 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_20),
175 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_21),
176 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_22),
177 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_23),
178 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_24),
179 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_25),
180 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_26),
181 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_27),
182 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_28),
183 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_29),
184 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_30),
185 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_31),
186 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_32),
187 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_33),
188 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_34),
189 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_35),
190 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_36),
191 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_37),
192 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_38),
193 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_39),
194 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_40),
195 	IMX_PINCTRL_PIN(IMXRT1050_PAD_EMC_41),
196 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_00),
197 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_01),
198 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_02),
199 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_03),
200 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_04),
201 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_05),
202 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_06),
203 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_07),
204 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_08),
205 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_09),
206 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_10),
207 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_11),
208 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_12),
209 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_13),
210 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_14),
211 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B0_15),
212 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_00),
213 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_01),
214 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_02),
215 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_03),
216 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_04),
217 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_05),
218 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_06),
219 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_07),
220 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_08),
221 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_09),
222 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_10),
223 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_11),
224 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_12),
225 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_13),
226 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_14),
227 	IMX_PINCTRL_PIN(IMXRT1050_PAD_AD_B1_15),
228 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_00),
229 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_01),
230 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_02),
231 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_03),
232 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_04),
233 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_05),
234 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_06),
235 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_07),
236 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_08),
237 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_09),
238 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_10),
239 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_11),
240 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_12),
241 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_13),
242 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_14),
243 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B0_15),
244 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_00),
245 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_01),
246 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_02),
247 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_03),
248 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_04),
249 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_05),
250 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_06),
251 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_07),
252 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_08),
253 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_09),
254 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_10),
255 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_11),
256 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_12),
257 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_13),
258 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_14),
259 	IMX_PINCTRL_PIN(IMXRT1050_PAD_B1_15),
260 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B0_00),
261 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B0_01),
262 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B0_02),
263 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B0_03),
264 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B0_04),
265 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B0_05),
266 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_00),
267 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_01),
268 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_02),
269 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_03),
270 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_04),
271 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_05),
272 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_06),
273 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_07),
274 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_08),
275 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_09),
276 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_10),
277 	IMX_PINCTRL_PIN(IMXRT1050_PAD_SD_B1_11),
278 };
279 
280 static const struct imx_pinctrl_soc_info imxrt1050_pinctrl_info = {
281 	.pins = imxrt1050_pinctrl_pads,
282 	.npins = ARRAY_SIZE(imxrt1050_pinctrl_pads),
283 	.gpr_compatible = "fsl,imxrt1050-iomuxc-gpr",
284 };
285 
286 static const struct of_device_id imxrt1050_pinctrl_of_match[] = {
287 	{ .compatible = "fsl,imxrt1050-iomuxc", .data = &imxrt1050_pinctrl_info, },
288 	{ /* sentinel */ }
289 };
290 
291 static int imxrt1050_pinctrl_probe(struct platform_device *pdev)
292 {
293 	return imx_pinctrl_probe(pdev, &imxrt1050_pinctrl_info);
294 }
295 
296 static struct platform_driver imxrt1050_pinctrl_driver = {
297 	.driver = {
298 		.name = "imxrt1050-pinctrl",
299 		.of_match_table = of_match_ptr(imxrt1050_pinctrl_of_match),
300 		.suppress_bind_attrs = true,
301 	},
302 	.probe = imxrt1050_pinctrl_probe,
303 };
304 
305 static int __init imxrt1050_pinctrl_init(void)
306 {
307 	return platform_driver_register(&imxrt1050_pinctrl_driver);
308 }
309 arch_initcall(imxrt1050_pinctrl_init);
310