1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * Marvell PXA25x family pin control |
4 | * |
5 | * Copyright (C) 2016 Robert Jarzmik |
6 | */ |
7 | #include <linux/module.h> |
8 | #include <linux/platform_device.h> |
9 | #include <linux/of.h> |
10 | #include <linux/pinctrl/pinctrl.h> |
11 | |
12 | #include "pinctrl-pxa2xx.h" |
13 | |
14 | static const struct pxa_desc_pin pxa25x_pins[] = { |
15 | PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(0)), |
16 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(1), |
17 | PXA_FUNCTION(0, 1, "GP_RST" )), |
18 | PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(2)), |
19 | PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(3)), |
20 | PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(4)), |
21 | PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(5)), |
22 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(6), |
23 | PXA_FUNCTION(1, 1, "MMCCLK" )), |
24 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(7), |
25 | PXA_FUNCTION(1, 1, "48_MHz" )), |
26 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(8), |
27 | PXA_FUNCTION(1, 1, "MMCCS0" )), |
28 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(9), |
29 | PXA_FUNCTION(1, 1, "MMCCS1" )), |
30 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(10), |
31 | PXA_FUNCTION(1, 1, "RTCCLK" )), |
32 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(11), |
33 | PXA_FUNCTION(1, 1, "3_6_MHz" )), |
34 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(12), |
35 | PXA_FUNCTION(1, 1, "32_kHz" )), |
36 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(13), |
37 | PXA_FUNCTION(1, 2, "MBGNT" )), |
38 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(14), |
39 | PXA_FUNCTION(0, 1, "MBREQ" )), |
40 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(15), |
41 | PXA_FUNCTION(1, 2, "nCS_1" )), |
42 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(16), |
43 | PXA_FUNCTION(1, 2, "PWM0" )), |
44 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(17), |
45 | PXA_FUNCTION(1, 2, "PWM1" )), |
46 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(18), |
47 | PXA_FUNCTION(0, 1, "RDY" )), |
48 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(19), |
49 | PXA_FUNCTION(0, 1, "DREQ[1]" )), |
50 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(20), |
51 | PXA_FUNCTION(0, 1, "DREQ[0]" )), |
52 | PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(21)), |
53 | PXA_GPIO_ONLY_PIN(PXA_PINCTRL_PIN(22)), |
54 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(23), |
55 | PXA_FUNCTION(1, 2, "SCLK" )), |
56 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(24), |
57 | PXA_FUNCTION(1, 2, "SFRM" )), |
58 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(25), |
59 | PXA_FUNCTION(1, 2, "TXD" )), |
60 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(26), |
61 | PXA_FUNCTION(0, 1, "RXD" )), |
62 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(27), |
63 | PXA_FUNCTION(0, 1, "EXTCLK" )), |
64 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(28), |
65 | PXA_FUNCTION(0, 1, "BITCLK" ), |
66 | PXA_FUNCTION(0, 2, "BITCLK" ), |
67 | PXA_FUNCTION(1, 1, "BITCLK" )), |
68 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(29), |
69 | PXA_FUNCTION(0, 1, "SDATA_IN0" ), |
70 | PXA_FUNCTION(0, 2, "SDATA_IN" )), |
71 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(30), |
72 | PXA_FUNCTION(1, 1, "SDATA_OUT" ), |
73 | PXA_FUNCTION(1, 2, "SDATA_OUT" )), |
74 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(31), |
75 | PXA_FUNCTION(1, 1, "SYNC" ), |
76 | PXA_FUNCTION(1, 2, "SYNC" )), |
77 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(32), |
78 | PXA_FUNCTION(0, 1, "SDATA_IN1" ), |
79 | PXA_FUNCTION(1, 1, "SYSCLK" )), |
80 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(33), |
81 | PXA_FUNCTION(1, 2, "nCS[5]" )), |
82 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(34), |
83 | PXA_FUNCTION(0, 1, "FFRXD" ), |
84 | PXA_FUNCTION(1, 2, "MMCCS0" )), |
85 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(35), |
86 | PXA_FUNCTION(0, 1, "CTS" )), |
87 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(36), |
88 | PXA_FUNCTION(0, 1, "DCD" )), |
89 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(37), |
90 | PXA_FUNCTION(0, 1, "DSR" )), |
91 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(38), |
92 | PXA_FUNCTION(0, 1, "RI" )), |
93 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(39), |
94 | PXA_FUNCTION(1, 1, "MMCC1" ), |
95 | PXA_FUNCTION(1, 2, "FFTXD" )), |
96 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(40), |
97 | PXA_FUNCTION(1, 2, "DTR" )), |
98 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(41), |
99 | PXA_FUNCTION(1, 2, "RTS" )), |
100 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(42), |
101 | PXA_FUNCTION(0, 1, "BTRXD" ), |
102 | PXA_FUNCTION(0, 3, "HWRXD" )), |
103 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(43), |
104 | PXA_FUNCTION(1, 2, "BTTXD" ), |
105 | PXA_FUNCTION(1, 3, "HWTXD" )), |
106 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(44), |
107 | PXA_FUNCTION(0, 1, "BTCTS" ), |
108 | PXA_FUNCTION(0, 3, "HWCTS" )), |
109 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(45), |
110 | PXA_FUNCTION(1, 2, "BTRTS" ), |
111 | PXA_FUNCTION(1, 3, "HWRTS" )), |
112 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(46), |
113 | PXA_FUNCTION(0, 1, "ICP_RXD" ), |
114 | PXA_FUNCTION(0, 2, "RXD" )), |
115 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(47), |
116 | PXA_FUNCTION(1, 1, "TXD" ), |
117 | PXA_FUNCTION(1, 2, "ICP_TXD" )), |
118 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(48), |
119 | PXA_FUNCTION(1, 1, "HWTXD" ), |
120 | PXA_FUNCTION(1, 2, "nPOE" )), |
121 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(49), |
122 | PXA_FUNCTION(0, 1, "HWRXD" ), |
123 | PXA_FUNCTION(1, 2, "nPWE" )), |
124 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(50), |
125 | PXA_FUNCTION(0, 1, "HWCTS" ), |
126 | PXA_FUNCTION(1, 2, "nPIOR" )), |
127 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(51), |
128 | PXA_FUNCTION(1, 1, "HWRTS" ), |
129 | PXA_FUNCTION(1, 2, "nPIOW" )), |
130 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(52), |
131 | PXA_FUNCTION(1, 2, "nPCE[1]" )), |
132 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(53), |
133 | PXA_FUNCTION(1, 1, "MMCCLK" ), |
134 | PXA_FUNCTION(1, 2, "nPCE[2]" )), |
135 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(54), |
136 | PXA_FUNCTION(1, 1, "MMCCLK" ), |
137 | PXA_FUNCTION(1, 2, "nPSKTSEL" )), |
138 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(55), |
139 | PXA_FUNCTION(1, 2, "nPREG" )), |
140 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(56), |
141 | PXA_FUNCTION(0, 1, "nPWAIT" )), |
142 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(57), |
143 | PXA_FUNCTION(0, 1, "nIOIS16" )), |
144 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(58), |
145 | PXA_FUNCTION(1, 2, "LDD<0>" )), |
146 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(59), |
147 | PXA_FUNCTION(1, 2, "LDD<1>" )), |
148 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(60), |
149 | PXA_FUNCTION(1, 2, "LDD<2>" )), |
150 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(61), |
151 | PXA_FUNCTION(1, 2, "LDD<3>" )), |
152 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(62), |
153 | PXA_FUNCTION(1, 2, "LDD<4>" )), |
154 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(63), |
155 | PXA_FUNCTION(1, 2, "LDD<5>" )), |
156 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(64), |
157 | PXA_FUNCTION(1, 2, "LDD<6>" )), |
158 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(65), |
159 | PXA_FUNCTION(1, 2, "LDD<7>" )), |
160 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(66), |
161 | PXA_FUNCTION(0, 1, "MBREQ" ), |
162 | PXA_FUNCTION(1, 2, "LDD<8>" )), |
163 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(67), |
164 | PXA_FUNCTION(1, 1, "MMCCS0" ), |
165 | PXA_FUNCTION(1, 2, "LDD<9>" )), |
166 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(68), |
167 | PXA_FUNCTION(1, 1, "MMCCS1" ), |
168 | PXA_FUNCTION(1, 2, "LDD<10>" )), |
169 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(69), |
170 | PXA_FUNCTION(1, 1, "MMCCLK" ), |
171 | PXA_FUNCTION(1, 2, "LDD<11>" )), |
172 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(70), |
173 | PXA_FUNCTION(1, 1, "RTCCLK" ), |
174 | PXA_FUNCTION(1, 2, "LDD<12>" )), |
175 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(71), |
176 | PXA_FUNCTION(1, 1, "3_6_MHz" ), |
177 | PXA_FUNCTION(1, 2, "LDD<13>" )), |
178 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(72), |
179 | PXA_FUNCTION(1, 1, "32_kHz" ), |
180 | PXA_FUNCTION(1, 2, "LDD<14>" )), |
181 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(73), |
182 | PXA_FUNCTION(1, 1, "MBGNT" ), |
183 | PXA_FUNCTION(1, 2, "LDD<15>" )), |
184 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(74), |
185 | PXA_FUNCTION(1, 2, "LCD_FCLK" )), |
186 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(75), |
187 | PXA_FUNCTION(1, 2, "LCD_LCLK" )), |
188 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(76), |
189 | PXA_FUNCTION(1, 2, "LCD_PCLK" )), |
190 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(77), |
191 | PXA_FUNCTION(1, 2, "LCD_ACBIAS" )), |
192 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(78), |
193 | PXA_FUNCTION(1, 2, "nCS<2>" )), |
194 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(79), |
195 | PXA_FUNCTION(1, 2, "nCS<3>" )), |
196 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(80), |
197 | PXA_FUNCTION(1, 2, "nCS<4>" )), |
198 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(81), |
199 | PXA_FUNCTION(0, 1, "NSSPSCLK" ), |
200 | PXA_FUNCTION(1, 1, "NSSPSCLK" )), |
201 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(82), |
202 | PXA_FUNCTION(0, 1, "NSSPSFRM" ), |
203 | PXA_FUNCTION(1, 1, "NSSPSFRM" )), |
204 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(83), |
205 | PXA_FUNCTION(0, 2, "NSSPRXD" ), |
206 | PXA_FUNCTION(1, 1, "NSSPTXD" )), |
207 | PXA_GPIO_PIN(PXA_PINCTRL_PIN(84), |
208 | PXA_FUNCTION(0, 2, "NSSPRXD" ), |
209 | PXA_FUNCTION(1, 1, "NSSPTXD" )), |
210 | }; |
211 | |
212 | static int pxa25x_pinctrl_probe(struct platform_device *pdev) |
213 | { |
214 | int ret, i; |
215 | void __iomem *base_af[8]; |
216 | void __iomem *base_dir[4]; |
217 | void __iomem *base_sleep[4]; |
218 | |
219 | base_af[0] = devm_platform_ioremap_resource(pdev, index: 0); |
220 | if (IS_ERR(ptr: base_af[0])) |
221 | return PTR_ERR(ptr: base_af[0]); |
222 | |
223 | base_dir[0] = devm_platform_ioremap_resource(pdev, index: 1); |
224 | if (IS_ERR(ptr: base_dir[0])) |
225 | return PTR_ERR(ptr: base_dir[0]); |
226 | |
227 | base_dir[3] = devm_platform_ioremap_resource(pdev, index: 2); |
228 | if (IS_ERR(ptr: base_dir[3])) |
229 | return PTR_ERR(ptr: base_dir[3]); |
230 | |
231 | base_sleep[0] = devm_platform_ioremap_resource(pdev, index: 3); |
232 | if (IS_ERR(ptr: base_sleep[0])) |
233 | return PTR_ERR(ptr: base_sleep[0]); |
234 | |
235 | for (i = 0; i < ARRAY_SIZE(base_af); i++) |
236 | base_af[i] = base_af[0] + sizeof(base_af[0]) * i; |
237 | for (i = 0; i < 3; i++) |
238 | base_dir[i] = base_dir[0] + sizeof(base_dir[0]) * i; |
239 | for (i = 0; i < ARRAY_SIZE(base_sleep); i++) |
240 | base_sleep[i] = base_sleep[0] + sizeof(base_af[0]) * i; |
241 | |
242 | ret = pxa2xx_pinctrl_init(pdev, ppins: pxa25x_pins, ARRAY_SIZE(pxa25x_pins), |
243 | base_gafr: base_af, base_gpdr: base_dir, base_gpsr: base_sleep); |
244 | return ret; |
245 | } |
246 | |
247 | static const struct of_device_id pxa25x_pinctrl_match[] = { |
248 | { .compatible = "marvell,pxa25x-pinctrl" , }, |
249 | {} |
250 | }; |
251 | MODULE_DEVICE_TABLE(of, pxa25x_pinctrl_match); |
252 | |
253 | static struct platform_driver pxa25x_pinctrl_driver = { |
254 | .probe = pxa25x_pinctrl_probe, |
255 | .driver = { |
256 | .name = "pxa25x-pinctrl" , |
257 | .of_match_table = pxa25x_pinctrl_match, |
258 | }, |
259 | }; |
260 | module_platform_driver(pxa25x_pinctrl_driver); |
261 | |
262 | MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>" ); |
263 | MODULE_DESCRIPTION("Marvell PXA25x pinctrl driver" ); |
264 | MODULE_LICENSE("GPL v2" ); |
265 | |