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