1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Marvell ac5 pinctrl driver based on mvebu pinctrl core
4  *
5  * Copyright (C) 2021 Marvell
6  *
7  * Noam Liron <lnoam@marvell.com>
8  */
9 
10 #include <linux/err.h>
11 #include <linux/init.h>
12 #include <linux/io.h>
13 #include <linux/platform_device.h>
14 #include <linux/of.h>
15 #include <linux/pinctrl/pinctrl.h>
16 
17 #include "pinctrl-mvebu.h"
18 
19 static struct mvebu_mpp_mode ac5_mpp_modes[] = {
20 	MPP_MODE(0,
21 		 MPP_FUNCTION(0, "gpio",  NULL),
22 		 MPP_FUNCTION(1, "sdio",  "d0"),
23 		 MPP_FUNCTION(2, "nand",  "io4")),
24 	MPP_MODE(1,
25 		 MPP_FUNCTION(0, "gpio",  NULL),
26 		 MPP_FUNCTION(1, "sdio",  "d1"),
27 		 MPP_FUNCTION(2, "nand",  "io3")),
28 	MPP_MODE(2,
29 		 MPP_FUNCTION(0, "gpio",  NULL),
30 		 MPP_FUNCTION(1, "sdio",  "d2"),
31 		 MPP_FUNCTION(2, "nand",  "io2")),
32 	MPP_MODE(3,
33 		 MPP_FUNCTION(0, "gpio",  NULL),
34 		 MPP_FUNCTION(1, "sdio",  "d3"),
35 		 MPP_FUNCTION(2, "nand",  "io7")),
36 	MPP_MODE(4,
37 		 MPP_FUNCTION(0, "gpio",  NULL),
38 		 MPP_FUNCTION(1, "sdio",  "d4"),
39 		 MPP_FUNCTION(2, "nand",  "io6"),
40 		 MPP_FUNCTION(3, "uart3", "txd"),
41 		 MPP_FUNCTION(4, "uart2", "txd")),
42 	MPP_MODE(5,
43 		 MPP_FUNCTION(0, "gpio",  NULL),
44 		 MPP_FUNCTION(1, "sdio",  "d5"),
45 		 MPP_FUNCTION(2, "nand",  "io5"),
46 		 MPP_FUNCTION(3, "uart3", "rxd"),
47 		 MPP_FUNCTION(4, "uart2", "rxd")),
48 	MPP_MODE(6,
49 		 MPP_FUNCTION(0, "gpio",  NULL),
50 		 MPP_FUNCTION(1, "sdio",  "d6"),
51 		 MPP_FUNCTION(2, "nand",  "io0"),
52 		 MPP_FUNCTION(3, "i2c1",  "sck")),
53 	MPP_MODE(7,
54 		 MPP_FUNCTION(0, "gpio",  NULL),
55 		 MPP_FUNCTION(1, "sdio",  "d7"),
56 		 MPP_FUNCTION(2, "nand",  "io1"),
57 		 MPP_FUNCTION(3, "i2c1",  "sda")),
58 	MPP_MODE(8,
59 		 MPP_FUNCTION(0, "gpio",  NULL),
60 		 MPP_FUNCTION(1, "sdio",  "clk"),
61 		 MPP_FUNCTION(2, "nand",  "wen")),
62 	MPP_MODE(9,
63 		 MPP_FUNCTION(0, "gpio",  NULL),
64 		 MPP_FUNCTION(1, "sdio",  "cmd"),
65 		 MPP_FUNCTION(2, "nand",  "ale")),
66 	MPP_MODE(10,
67 		 MPP_FUNCTION(0, "gpio",  NULL),
68 		 MPP_FUNCTION(1, "sdio",  "ds"),
69 		 MPP_FUNCTION(2, "nand",  "cle")),
70 	MPP_MODE(11,
71 		 MPP_FUNCTION(0, "gpio",  NULL),
72 		 MPP_FUNCTION(1, "sdio",  "rst"),
73 		 MPP_FUNCTION(2, "nand",  "cen")),
74 	MPP_MODE(12,
75 		 MPP_FUNCTION(0, "gpio",  NULL),
76 		 MPP_FUNCTION(1, "spi0",  "clk")),
77 	MPP_MODE(13,
78 		 MPP_FUNCTION(0, "gpio",  NULL),
79 		 MPP_FUNCTION(1, "spi0",  "csn")),
80 	MPP_MODE(14,
81 		 MPP_FUNCTION(0, "gpio",  NULL),
82 		 MPP_FUNCTION(1, "spi0",  "mosi")),
83 	MPP_MODE(15,
84 		 MPP_FUNCTION(0, "gpio",  NULL),
85 		 MPP_FUNCTION(1, "spi0",  "miso")),
86 	MPP_MODE(16,
87 		 MPP_FUNCTION(0, "gpio",  NULL),
88 		 MPP_FUNCTION(1, "spi0",  "wpn"),
89 		 MPP_FUNCTION(2, "nand",  "ren"),
90 		 MPP_FUNCTION(3, "uart1", "txd")),
91 	MPP_MODE(17,
92 		 MPP_FUNCTION(0, "gpio",  NULL),
93 		 MPP_FUNCTION(1, "spi0",  "hold"),
94 		 MPP_FUNCTION(2, "nand",  "rb"),
95 		 MPP_FUNCTION(3, "uart1", "rxd")),
96 	MPP_MODE(18,
97 		 MPP_FUNCTION(0, "gpio",  NULL),
98 		 MPP_FUNCTION(1, "tsen_int", NULL),
99 		 MPP_FUNCTION(2, "uart2", "rxd"),
100 		 MPP_FUNCTION(3, "wd_int", NULL)),
101 	MPP_MODE(19,
102 		 MPP_FUNCTION(0, "gpio",  NULL),
103 		 MPP_FUNCTION(1, "dev_init_done", NULL),
104 		 MPP_FUNCTION(2, "uart2", "txd")),
105 	MPP_MODE(20,
106 		 MPP_FUNCTION(0, "gpio",  NULL),
107 		 MPP_FUNCTION(2, "i2c1",  "sck"),
108 		 MPP_FUNCTION(3, "spi1",  "clk"),
109 		 MPP_FUNCTION(4, "uart3", "txd")),
110 	MPP_MODE(21,
111 		 MPP_FUNCTION(0, "gpio",  NULL),
112 		 MPP_FUNCTION(2, "i2c1",  "sda"),
113 		 MPP_FUNCTION(3, "spi1",  "csn"),
114 		 MPP_FUNCTION(4, "uart3", "rxd")),
115 	MPP_MODE(22,
116 		 MPP_FUNCTION(0, "gpio",  NULL),
117 		 MPP_FUNCTION(3, "spi1",  "mosi")),
118 	MPP_MODE(23,
119 		 MPP_FUNCTION(0, "gpio",  NULL),
120 		 MPP_FUNCTION(3, "spi1",  "miso")),
121 	MPP_MODE(24,
122 		 MPP_FUNCTION(0, "gpio",  NULL),
123 		 MPP_FUNCTION(1, "wd_int", NULL),
124 		 MPP_FUNCTION(2, "uart2", "txd"),
125 		 MPP_FUNCTION(3, "uartsd", "txd")),
126 	MPP_MODE(25,
127 		 MPP_FUNCTION(0, "gpio",  NULL),
128 		 MPP_FUNCTION(1, "int_out", NULL),
129 		 MPP_FUNCTION(2, "uart2", "rxd"),
130 		 MPP_FUNCTION(3, "uartsd", "rxd")),
131 	MPP_MODE(26,
132 		 MPP_FUNCTION(0, "gpio",  NULL),
133 		 MPP_FUNCTION(1, "i2c0",  "sck"),
134 		 MPP_FUNCTION(2, "ptp", "clk1"),
135 		 MPP_FUNCTION(3, "uart3", "txd")),
136 	MPP_MODE(27,
137 		 MPP_FUNCTION(0, "gpio",  NULL),
138 		 MPP_FUNCTION(1, "i2c0",  "sda"),
139 		 MPP_FUNCTION(2, "ptp", "pulse"),
140 		 MPP_FUNCTION(3, "uart3", "rxd")),
141 	MPP_MODE(28,
142 		 MPP_FUNCTION(0, "gpio",  NULL),
143 		 MPP_FUNCTION(1, "xg", "mdio"),
144 		 MPP_FUNCTION(2, "ge", "mdio"),
145 		 MPP_FUNCTION(3, "uart3", "txd")),
146 	MPP_MODE(29,
147 		 MPP_FUNCTION(0, "gpio",  NULL),
148 		 MPP_FUNCTION(1, "xg", "mdio"),
149 		 MPP_FUNCTION(2, "ge", "mdio"),
150 		 MPP_FUNCTION(3, "uart3", "rxd")),
151 	MPP_MODE(30,
152 		 MPP_FUNCTION(0, "gpio",  NULL),
153 		 MPP_FUNCTION(1, "xg", "mdio"),
154 		 MPP_FUNCTION(2, "ge", "mdio"),
155 		 MPP_FUNCTION(3, "ge", "mdio")),
156 	MPP_MODE(31,
157 		 MPP_FUNCTION(0, "gpio",  NULL),
158 		 MPP_FUNCTION(1, "xg", "mdio"),
159 		 MPP_FUNCTION(2, "ge", "mdio"),
160 		 MPP_FUNCTION(3, "ge", "mdio")),
161 	MPP_MODE(32,
162 		 MPP_FUNCTION(0, "gpio",  NULL),
163 		 MPP_FUNCTION(1, "uart0", "txd")),
164 	MPP_MODE(33,
165 		 MPP_FUNCTION(0, "gpio",  NULL),
166 		 MPP_FUNCTION(1, "uart0", "rxd"),
167 		 MPP_FUNCTION(2, "ptp", "clk1"),
168 		 MPP_FUNCTION(3, "ptp", "pulse")),
169 	MPP_MODE(34,
170 		 MPP_FUNCTION(0, "gpio",  NULL),
171 		 MPP_FUNCTION(1, "ge", "mdio"),
172 		 MPP_FUNCTION(2, "uart3", "rxd")),
173 	MPP_MODE(35,
174 		 MPP_FUNCTION(0, "gpio",  NULL),
175 		 MPP_FUNCTION(1, "ge", "mdio"),
176 		 MPP_FUNCTION(2, "uart3", "txd"),
177 		 MPP_FUNCTION(3, "pcie", "rstoutn")),
178 	MPP_MODE(36,
179 		 MPP_FUNCTION(0, "gpio",  NULL),
180 		 MPP_FUNCTION(1, "ptp", "clk0_tp"),
181 		 MPP_FUNCTION(2, "ptp", "clk1_tp")),
182 	MPP_MODE(37,
183 		 MPP_FUNCTION(0, "gpio",  NULL),
184 		 MPP_FUNCTION(1, "ptp", "pulse_tp"),
185 		 MPP_FUNCTION(2, "wd_int", NULL)),
186 	MPP_MODE(38,
187 		 MPP_FUNCTION(0, "gpio",  NULL),
188 		 MPP_FUNCTION(1, "synce", "clk_out0")),
189 	MPP_MODE(39,
190 		 MPP_FUNCTION(0, "gpio",  NULL),
191 		 MPP_FUNCTION(1, "synce", "clk_out1")),
192 	MPP_MODE(40,
193 		 MPP_FUNCTION(0, "gpio",  NULL),
194 		 MPP_FUNCTION(1, "ptp", "pclk_out0"),
195 		 MPP_FUNCTION(2, "ptp", "pclk_out1")),
196 	MPP_MODE(41,
197 		 MPP_FUNCTION(0, "gpio",  NULL),
198 		 MPP_FUNCTION(1, "ptp", "ref_clk"),
199 		 MPP_FUNCTION(2, "ptp", "clk1"),
200 		 MPP_FUNCTION(3, "ptp", "pulse"),
201 		 MPP_FUNCTION(4, "uart2", "txd"),
202 		 MPP_FUNCTION(5, "i2c1",  "sck")),
203 	MPP_MODE(42,
204 		 MPP_FUNCTION(0, "gpio",  NULL),
205 		 MPP_FUNCTION(1, "ptp", "clk0"),
206 		 MPP_FUNCTION(2, "ptp", "clk1"),
207 		 MPP_FUNCTION(3, "ptp", "pulse"),
208 		 MPP_FUNCTION(4, "uart2", "rxd"),
209 		 MPP_FUNCTION(5, "i2c1",  "sda")),
210 	MPP_MODE(43,
211 		 MPP_FUNCTION(0, "gpio",  NULL),
212 		 MPP_FUNCTION(1, "led", "clk")),
213 	MPP_MODE(44,
214 		 MPP_FUNCTION(0, "gpio",  NULL),
215 		 MPP_FUNCTION(1, "led", "stb")),
216 	MPP_MODE(45,
217 		 MPP_FUNCTION(0, "gpio",  NULL),
218 		 MPP_FUNCTION(1, "led", "data")),
219 };
220 
221 static struct mvebu_pinctrl_soc_info ac5_pinctrl_info;
222 
223 static const struct of_device_id ac5_pinctrl_of_match[] = {
224 	{
225 		.compatible = "marvell,ac5-pinctrl",
226 	},
227 	{ },
228 };
229 
230 static const struct mvebu_mpp_ctrl ac5_mpp_controls[] = {
231 	MPP_FUNC_CTRL(0, 45, NULL, mvebu_mmio_mpp_ctrl), };
232 
233 static struct pinctrl_gpio_range ac5_mpp_gpio_ranges[] = {
234 	MPP_GPIO_RANGE(0,   0,  0, 46), };
235 
ac5_pinctrl_probe(struct platform_device * pdev)236 static int ac5_pinctrl_probe(struct platform_device *pdev)
237 {
238 	struct mvebu_pinctrl_soc_info *soc = &ac5_pinctrl_info;
239 
240 	soc->variant = 0; /* no variants for ac5 */
241 	soc->controls = ac5_mpp_controls;
242 	soc->ncontrols = ARRAY_SIZE(ac5_mpp_controls);
243 	soc->gpioranges = ac5_mpp_gpio_ranges;
244 	soc->ngpioranges = ARRAY_SIZE(ac5_mpp_gpio_ranges);
245 	soc->modes = ac5_mpp_modes;
246 	soc->nmodes = ac5_mpp_controls[0].npins;
247 
248 	pdev->dev.platform_data = soc;
249 
250 	return mvebu_pinctrl_simple_mmio_probe(pdev);
251 }
252 
253 static struct platform_driver ac5_pinctrl_driver = {
254 	.driver = {
255 		.name = "ac5-pinctrl",
256 		.of_match_table = of_match_ptr(ac5_pinctrl_of_match),
257 	},
258 	.probe = ac5_pinctrl_probe,
259 };
260 builtin_platform_driver(ac5_pinctrl_driver);
261