1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Marvell Armada CP110 pinctrl driver based on mvebu pinctrl core
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2017 Marvell
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Hanna Hawa <hannah@marvell.com>
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <linux/err.h>
11*4882a593Smuzhiyun #include <linux/init.h>
12*4882a593Smuzhiyun #include <linux/io.h>
13*4882a593Smuzhiyun #include <linux/mfd/syscon.h>
14*4882a593Smuzhiyun #include <linux/of.h>
15*4882a593Smuzhiyun #include <linux/of_device.h>
16*4882a593Smuzhiyun #include <linux/pinctrl/pinctrl.h>
17*4882a593Smuzhiyun #include <linux/platform_device.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #include "pinctrl-mvebu.h"
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun /*
22*4882a593Smuzhiyun * Even if the pin controller is the same the MMP available depend on the SoC
23*4882a593Smuzhiyun * integration.
24*4882a593Smuzhiyun * - In Armada7K (single CP) almost all the MPPs are available (except the
25*4882a593Smuzhiyun * MMP 39 to 43)
26*4882a593Smuzhiyun * - In Armada8K (dual CP) the MPPs are split into 2 parts, MPPs 0-31 from
27*4882a593Smuzhiyun * CPS, and MPPs 32-62 from CPM, the below flags (V_ARMADA_8K_CPM,
28*4882a593Smuzhiyun * V_ARMADA_8K_CPS) set which MPP is available to the CPx.
29*4882a593Smuzhiyun * The x_PLUS enum mean that the MPP available for CPx and for Armada70x0
30*4882a593Smuzhiyun */
31*4882a593Smuzhiyun enum {
32*4882a593Smuzhiyun V_ARMADA_7K = BIT(0),
33*4882a593Smuzhiyun V_ARMADA_8K_CPM = BIT(1),
34*4882a593Smuzhiyun V_ARMADA_8K_CPS = BIT(2),
35*4882a593Smuzhiyun V_CP115_STANDALONE = BIT(3),
36*4882a593Smuzhiyun V_ARMADA_7K_8K_CPM = (V_ARMADA_7K | V_ARMADA_8K_CPM),
37*4882a593Smuzhiyun V_ARMADA_7K_8K_CPS = (V_ARMADA_7K | V_ARMADA_8K_CPS),
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun static struct mvebu_mpp_mode armada_cp110_mpp_modes[] = {
41*4882a593Smuzhiyun MPP_MODE(0,
42*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
43*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ale1"),
44*4882a593Smuzhiyun MPP_FUNCTION(2, "au", "i2smclk"),
45*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "rxd3"),
46*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "pclk"),
47*4882a593Smuzhiyun MPP_FUNCTION(6, "ptp", "pulse"),
48*4882a593Smuzhiyun MPP_FUNCTION(7, "mss_i2c", "sda"),
49*4882a593Smuzhiyun MPP_FUNCTION(8, "uart0", "rxd"),
50*4882a593Smuzhiyun MPP_FUNCTION(9, "sata0", "present_act"),
51*4882a593Smuzhiyun MPP_FUNCTION(10, "ge", "mdio")),
52*4882a593Smuzhiyun MPP_MODE(1,
53*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
54*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ale0"),
55*4882a593Smuzhiyun MPP_FUNCTION(2, "au", "i2sdo_spdifo"),
56*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "rxd2"),
57*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "drx"),
58*4882a593Smuzhiyun MPP_FUNCTION(6, "ptp", "clk"),
59*4882a593Smuzhiyun MPP_FUNCTION(7, "mss_i2c", "sck"),
60*4882a593Smuzhiyun MPP_FUNCTION(8, "uart0", "txd"),
61*4882a593Smuzhiyun MPP_FUNCTION(9, "sata1", "present_act"),
62*4882a593Smuzhiyun MPP_FUNCTION(10, "ge", "mdc")),
63*4882a593Smuzhiyun MPP_MODE(2,
64*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
65*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad15"),
66*4882a593Smuzhiyun MPP_FUNCTION(2, "au", "i2sextclk"),
67*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "rxd1"),
68*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "dtx"),
69*4882a593Smuzhiyun MPP_FUNCTION(5, "mss_uart", "rxd"),
70*4882a593Smuzhiyun MPP_FUNCTION(6, "ptp", "pclk_out"),
71*4882a593Smuzhiyun MPP_FUNCTION(7, "i2c1", "sck"),
72*4882a593Smuzhiyun MPP_FUNCTION(8, "uart1", "rxd"),
73*4882a593Smuzhiyun MPP_FUNCTION(9, "sata0", "present_act"),
74*4882a593Smuzhiyun MPP_FUNCTION(10, "xg", "mdc")),
75*4882a593Smuzhiyun MPP_MODE(3,
76*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
77*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad14"),
78*4882a593Smuzhiyun MPP_FUNCTION(2, "au", "i2slrclk"),
79*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "rxd0"),
80*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "fsync"),
81*4882a593Smuzhiyun MPP_FUNCTION(5, "mss_uart", "txd"),
82*4882a593Smuzhiyun MPP_FUNCTION(6, "pcie", "rstoutn"),
83*4882a593Smuzhiyun MPP_FUNCTION(7, "i2c1", "sda"),
84*4882a593Smuzhiyun MPP_FUNCTION(8, "uart1", "txd"),
85*4882a593Smuzhiyun MPP_FUNCTION(9, "sata1", "present_act"),
86*4882a593Smuzhiyun MPP_FUNCTION(10, "xg", "mdio")),
87*4882a593Smuzhiyun MPP_MODE(4,
88*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
89*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad13"),
90*4882a593Smuzhiyun MPP_FUNCTION(2, "au", "i2sbclk"),
91*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "rxctl"),
92*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "rstn"),
93*4882a593Smuzhiyun MPP_FUNCTION(5, "mss_uart", "rxd"),
94*4882a593Smuzhiyun MPP_FUNCTION(6, "uart1", "cts"),
95*4882a593Smuzhiyun MPP_FUNCTION(7, "pcie0", "clkreq"),
96*4882a593Smuzhiyun MPP_FUNCTION(8, "uart3", "rxd"),
97*4882a593Smuzhiyun MPP_FUNCTION(10, "ge", "mdc")),
98*4882a593Smuzhiyun MPP_MODE(5,
99*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
100*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad12"),
101*4882a593Smuzhiyun MPP_FUNCTION(2, "au", "i2sdi"),
102*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "rxclk"),
103*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "intn"),
104*4882a593Smuzhiyun MPP_FUNCTION(5, "mss_uart", "txd"),
105*4882a593Smuzhiyun MPP_FUNCTION(6, "uart1", "rts"),
106*4882a593Smuzhiyun MPP_FUNCTION(7, "pcie1", "clkreq"),
107*4882a593Smuzhiyun MPP_FUNCTION(8, "uart3", "txd"),
108*4882a593Smuzhiyun MPP_FUNCTION(10, "ge", "mdio")),
109*4882a593Smuzhiyun MPP_MODE(6,
110*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
111*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad11"),
112*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "txd3"),
113*4882a593Smuzhiyun MPP_FUNCTION(4, "spi0", "csn2"),
114*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sextclk"),
115*4882a593Smuzhiyun MPP_FUNCTION(6, "sata1", "present_act"),
116*4882a593Smuzhiyun MPP_FUNCTION(7, "pcie2", "clkreq"),
117*4882a593Smuzhiyun MPP_FUNCTION(8, "uart0", "rxd"),
118*4882a593Smuzhiyun MPP_FUNCTION(9, "ptp", "pulse")),
119*4882a593Smuzhiyun MPP_MODE(7,
120*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
121*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad10"),
122*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "txd2"),
123*4882a593Smuzhiyun MPP_FUNCTION(4, "spi0", "csn1"),
124*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "csn1"),
125*4882a593Smuzhiyun MPP_FUNCTION(6, "sata0", "present_act"),
126*4882a593Smuzhiyun MPP_FUNCTION(7, "led", "data"),
127*4882a593Smuzhiyun MPP_FUNCTION(8, "uart0", "txd"),
128*4882a593Smuzhiyun MPP_FUNCTION(9, "ptp", "clk")),
129*4882a593Smuzhiyun MPP_MODE(8,
130*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
131*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad9"),
132*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "txd1"),
133*4882a593Smuzhiyun MPP_FUNCTION(4, "spi0", "csn0"),
134*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "csn0"),
135*4882a593Smuzhiyun MPP_FUNCTION(6, "uart0", "cts"),
136*4882a593Smuzhiyun MPP_FUNCTION(7, "led", "stb"),
137*4882a593Smuzhiyun MPP_FUNCTION(8, "uart2", "rxd"),
138*4882a593Smuzhiyun MPP_FUNCTION(9, "ptp", "pclk_out"),
139*4882a593Smuzhiyun MPP_FUNCTION(10, "synce1", "clk")),
140*4882a593Smuzhiyun MPP_MODE(9,
141*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
142*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad8"),
143*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "txd0"),
144*4882a593Smuzhiyun MPP_FUNCTION(4, "spi0", "mosi"),
145*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "mosi"),
146*4882a593Smuzhiyun MPP_FUNCTION(7, "pcie", "rstoutn"),
147*4882a593Smuzhiyun MPP_FUNCTION(10, "synce2", "clk")),
148*4882a593Smuzhiyun MPP_MODE(10,
149*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
150*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "readyn"),
151*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "txctl"),
152*4882a593Smuzhiyun MPP_FUNCTION(4, "spi0", "miso"),
153*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "miso"),
154*4882a593Smuzhiyun MPP_FUNCTION(6, "uart0", "cts"),
155*4882a593Smuzhiyun MPP_FUNCTION(7, "sata1", "present_act")),
156*4882a593Smuzhiyun MPP_MODE(11,
157*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
158*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "wen1"),
159*4882a593Smuzhiyun MPP_FUNCTION(3, "ge0", "txclkout"),
160*4882a593Smuzhiyun MPP_FUNCTION(4, "spi0", "clk"),
161*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "clk"),
162*4882a593Smuzhiyun MPP_FUNCTION(6, "uart0", "rts"),
163*4882a593Smuzhiyun MPP_FUNCTION(7, "led", "clk"),
164*4882a593Smuzhiyun MPP_FUNCTION(8, "uart2", "txd"),
165*4882a593Smuzhiyun MPP_FUNCTION(9, "sata0", "present_act")),
166*4882a593Smuzhiyun MPP_MODE(12,
167*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
168*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "clk_out"),
169*4882a593Smuzhiyun MPP_FUNCTION(2, "nf", "rbn1"),
170*4882a593Smuzhiyun MPP_FUNCTION(3, "spi1", "csn1"),
171*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "rxclk")),
172*4882a593Smuzhiyun MPP_MODE(13,
173*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
174*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "burstn"),
175*4882a593Smuzhiyun MPP_FUNCTION(2, "nf", "rbn0"),
176*4882a593Smuzhiyun MPP_FUNCTION(3, "spi1", "miso"),
177*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "rxctl"),
178*4882a593Smuzhiyun MPP_FUNCTION(8, "mss_spi", "miso")),
179*4882a593Smuzhiyun MPP_MODE(14,
180*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
181*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "bootcsn"),
182*4882a593Smuzhiyun MPP_FUNCTION(2, "dev", "csn0"),
183*4882a593Smuzhiyun MPP_FUNCTION(3, "spi1", "csn0"),
184*4882a593Smuzhiyun MPP_FUNCTION(4, "spi0", "csn3"),
185*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sextclk"),
186*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "miso"),
187*4882a593Smuzhiyun MPP_FUNCTION(7, "sata0", "present_act"),
188*4882a593Smuzhiyun MPP_FUNCTION(8, "mss_spi", "csn")),
189*4882a593Smuzhiyun MPP_MODE(15,
190*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
191*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad7"),
192*4882a593Smuzhiyun MPP_FUNCTION(3, "spi1", "mosi"),
193*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "mosi"),
194*4882a593Smuzhiyun MPP_FUNCTION(8, "mss_spi", "mosi"),
195*4882a593Smuzhiyun MPP_FUNCTION(11, "ptp", "pulse_cp2cp")),
196*4882a593Smuzhiyun MPP_MODE(16,
197*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
198*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad6"),
199*4882a593Smuzhiyun MPP_FUNCTION(3, "spi1", "clk"),
200*4882a593Smuzhiyun MPP_FUNCTION(8, "mss_spi", "clk")),
201*4882a593Smuzhiyun MPP_MODE(17,
202*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
203*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad5"),
204*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "txd3")),
205*4882a593Smuzhiyun MPP_MODE(18,
206*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
207*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad4"),
208*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "txd2"),
209*4882a593Smuzhiyun MPP_FUNCTION(11, "ptp", "clk_cp2cp")),
210*4882a593Smuzhiyun MPP_MODE(19,
211*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
212*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad3"),
213*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "txd1"),
214*4882a593Smuzhiyun MPP_FUNCTION(11, "wakeup", "out_cp2cp")),
215*4882a593Smuzhiyun MPP_MODE(20,
216*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
217*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad2"),
218*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "txd0")),
219*4882a593Smuzhiyun MPP_MODE(21,
220*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
221*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad1"),
222*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "txctl"),
223*4882a593Smuzhiyun MPP_FUNCTION(11, "sei", "in_cp2cp")),
224*4882a593Smuzhiyun MPP_MODE(22,
225*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
226*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "ad0"),
227*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "txclkout"),
228*4882a593Smuzhiyun MPP_FUNCTION(11, "wakeup", "in_cp2cp")),
229*4882a593Smuzhiyun MPP_MODE(23,
230*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
231*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "a1"),
232*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2smclk"),
233*4882a593Smuzhiyun MPP_FUNCTION(11, "link", "rd_in_cp2cp")),
234*4882a593Smuzhiyun MPP_MODE(24,
235*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
236*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "a0"),
237*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2slrclk")),
238*4882a593Smuzhiyun MPP_MODE(25,
239*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
240*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "oen"),
241*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sdo_spdifo")),
242*4882a593Smuzhiyun MPP_MODE(26,
243*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
244*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "wen0"),
245*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sbclk")),
246*4882a593Smuzhiyun MPP_MODE(27,
247*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
248*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "csn0"),
249*4882a593Smuzhiyun MPP_FUNCTION(2, "spi1", "miso"),
250*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_gpio4", NULL),
251*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "rxd3"),
252*4882a593Smuzhiyun MPP_FUNCTION(5, "spi0", "csn4"),
253*4882a593Smuzhiyun MPP_FUNCTION(8, "ge", "mdio"),
254*4882a593Smuzhiyun MPP_FUNCTION(9, "sata0", "present_act"),
255*4882a593Smuzhiyun MPP_FUNCTION(10, "uart0", "rts"),
256*4882a593Smuzhiyun MPP_FUNCTION(11, "rei", "in_cp2cp")),
257*4882a593Smuzhiyun MPP_MODE(28,
258*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
259*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "csn1"),
260*4882a593Smuzhiyun MPP_FUNCTION(2, "spi1", "csn0"),
261*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_gpio5", NULL),
262*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "rxd2"),
263*4882a593Smuzhiyun MPP_FUNCTION(5, "spi0", "csn5"),
264*4882a593Smuzhiyun MPP_FUNCTION(6, "pcie2", "clkreq"),
265*4882a593Smuzhiyun MPP_FUNCTION(7, "ptp", "pulse"),
266*4882a593Smuzhiyun MPP_FUNCTION(8, "ge", "mdc"),
267*4882a593Smuzhiyun MPP_FUNCTION(9, "sata1", "present_act"),
268*4882a593Smuzhiyun MPP_FUNCTION(10, "uart0", "cts"),
269*4882a593Smuzhiyun MPP_FUNCTION(11, "led", "data")),
270*4882a593Smuzhiyun MPP_MODE(29,
271*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
272*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "csn2"),
273*4882a593Smuzhiyun MPP_FUNCTION(2, "spi1", "mosi"),
274*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_gpio6", NULL),
275*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "rxd1"),
276*4882a593Smuzhiyun MPP_FUNCTION(5, "spi0", "csn6"),
277*4882a593Smuzhiyun MPP_FUNCTION(6, "pcie1", "clkreq"),
278*4882a593Smuzhiyun MPP_FUNCTION(7, "ptp", "clk"),
279*4882a593Smuzhiyun MPP_FUNCTION(8, "mss_i2c", "sda"),
280*4882a593Smuzhiyun MPP_FUNCTION(9, "sata0", "present_act"),
281*4882a593Smuzhiyun MPP_FUNCTION(10, "uart0", "rxd"),
282*4882a593Smuzhiyun MPP_FUNCTION(11, "led", "stb")),
283*4882a593Smuzhiyun MPP_MODE(30,
284*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
285*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "csn3"),
286*4882a593Smuzhiyun MPP_FUNCTION(2, "spi1", "clk"),
287*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_gpio7", NULL),
288*4882a593Smuzhiyun MPP_FUNCTION(4, "ge0", "rxd0"),
289*4882a593Smuzhiyun MPP_FUNCTION(5, "spi0", "csn7"),
290*4882a593Smuzhiyun MPP_FUNCTION(6, "pcie0", "clkreq"),
291*4882a593Smuzhiyun MPP_FUNCTION(7, "ptp", "pclk_out"),
292*4882a593Smuzhiyun MPP_FUNCTION(8, "mss_i2c", "sck"),
293*4882a593Smuzhiyun MPP_FUNCTION(9, "sata1", "present_act"),
294*4882a593Smuzhiyun MPP_FUNCTION(10, "uart0", "txd"),
295*4882a593Smuzhiyun MPP_FUNCTION(11, "led", "clk")),
296*4882a593Smuzhiyun MPP_MODE(31,
297*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
298*4882a593Smuzhiyun MPP_FUNCTION(1, "dev", "a2"),
299*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_gpio4", NULL),
300*4882a593Smuzhiyun MPP_FUNCTION(6, "pcie", "rstoutn"),
301*4882a593Smuzhiyun MPP_FUNCTION(8, "ge", "mdc")),
302*4882a593Smuzhiyun MPP_MODE(32,
303*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
304*4882a593Smuzhiyun MPP_FUNCTION(1, "mii", "col"),
305*4882a593Smuzhiyun MPP_FUNCTION(2, "mii", "txerr"),
306*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_spi", "miso"),
307*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "drx"),
308*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sextclk"),
309*4882a593Smuzhiyun MPP_FUNCTION(6, "au", "i2sdi"),
310*4882a593Smuzhiyun MPP_FUNCTION(7, "ge", "mdio"),
311*4882a593Smuzhiyun MPP_FUNCTION(8, "sdio", "v18_en"),
312*4882a593Smuzhiyun MPP_FUNCTION(9, "pcie1", "clkreq"),
313*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio0", NULL)),
314*4882a593Smuzhiyun MPP_MODE(33,
315*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
316*4882a593Smuzhiyun MPP_FUNCTION(1, "mii", "txclk"),
317*4882a593Smuzhiyun MPP_FUNCTION(2, "sdio", "pwr10"),
318*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_spi", "csn"),
319*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "fsync"),
320*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2smclk"),
321*4882a593Smuzhiyun MPP_FUNCTION(6, "sdio", "bus_pwr"),
322*4882a593Smuzhiyun MPP_FUNCTION(8, "xg", "mdio"),
323*4882a593Smuzhiyun MPP_FUNCTION(9, "pcie2", "clkreq"),
324*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio1", NULL)),
325*4882a593Smuzhiyun MPP_MODE(34,
326*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
327*4882a593Smuzhiyun MPP_FUNCTION(1, "mii", "rxerr"),
328*4882a593Smuzhiyun MPP_FUNCTION(2, "sdio", "pwr11"),
329*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_spi", "mosi"),
330*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "dtx"),
331*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2slrclk"),
332*4882a593Smuzhiyun MPP_FUNCTION(6, "sdio", "wr_protect"),
333*4882a593Smuzhiyun MPP_FUNCTION(7, "ge", "mdc"),
334*4882a593Smuzhiyun MPP_FUNCTION(9, "pcie0", "clkreq"),
335*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio2", NULL)),
336*4882a593Smuzhiyun MPP_MODE(35,
337*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
338*4882a593Smuzhiyun MPP_FUNCTION(1, "sata1", "present_act"),
339*4882a593Smuzhiyun MPP_FUNCTION(2, "i2c1", "sda"),
340*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_spi", "clk"),
341*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "pclk"),
342*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sdo_spdifo"),
343*4882a593Smuzhiyun MPP_FUNCTION(6, "sdio", "card_detect"),
344*4882a593Smuzhiyun MPP_FUNCTION(7, "xg", "mdio"),
345*4882a593Smuzhiyun MPP_FUNCTION(8, "ge", "mdio"),
346*4882a593Smuzhiyun MPP_FUNCTION(9, "pcie", "rstoutn"),
347*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio3", NULL)),
348*4882a593Smuzhiyun MPP_MODE(36,
349*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
350*4882a593Smuzhiyun MPP_FUNCTION(1, "synce2", "clk"),
351*4882a593Smuzhiyun MPP_FUNCTION(2, "i2c1", "sck"),
352*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "clk"),
353*4882a593Smuzhiyun MPP_FUNCTION(4, "synce1", "clk"),
354*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sbclk"),
355*4882a593Smuzhiyun MPP_FUNCTION(6, "sata0", "present_act"),
356*4882a593Smuzhiyun MPP_FUNCTION(7, "xg", "mdc"),
357*4882a593Smuzhiyun MPP_FUNCTION(8, "ge", "mdc"),
358*4882a593Smuzhiyun MPP_FUNCTION(9, "pcie2", "clkreq"),
359*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio5", NULL)),
360*4882a593Smuzhiyun MPP_MODE(37,
361*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
362*4882a593Smuzhiyun MPP_FUNCTION(1, "uart2", "rxd"),
363*4882a593Smuzhiyun MPP_FUNCTION(2, "i2c0", "sck"),
364*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "pclk_out"),
365*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "intn"),
366*4882a593Smuzhiyun MPP_FUNCTION(5, "mss_i2c", "sck"),
367*4882a593Smuzhiyun MPP_FUNCTION(6, "sata1", "present_act"),
368*4882a593Smuzhiyun MPP_FUNCTION(7, "ge", "mdc"),
369*4882a593Smuzhiyun MPP_FUNCTION(8, "xg", "mdc"),
370*4882a593Smuzhiyun MPP_FUNCTION(9, "pcie1", "clkreq"),
371*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio6", NULL),
372*4882a593Smuzhiyun MPP_FUNCTION(11, "link", "rd_out_cp2cp")),
373*4882a593Smuzhiyun MPP_MODE(38,
374*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
375*4882a593Smuzhiyun MPP_FUNCTION(1, "uart2", "txd"),
376*4882a593Smuzhiyun MPP_FUNCTION(2, "i2c0", "sda"),
377*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "pulse"),
378*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "rstn"),
379*4882a593Smuzhiyun MPP_FUNCTION(5, "mss_i2c", "sda"),
380*4882a593Smuzhiyun MPP_FUNCTION(6, "sata0", "present_act"),
381*4882a593Smuzhiyun MPP_FUNCTION(7, "ge", "mdio"),
382*4882a593Smuzhiyun MPP_FUNCTION(8, "xg", "mdio"),
383*4882a593Smuzhiyun MPP_FUNCTION(9, "au", "i2sextclk"),
384*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio7", NULL),
385*4882a593Smuzhiyun MPP_FUNCTION(11, "ptp", "pulse_cp2cp")),
386*4882a593Smuzhiyun MPP_MODE(39,
387*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
388*4882a593Smuzhiyun MPP_FUNCTION(1, "sdio", "wr_protect"),
389*4882a593Smuzhiyun MPP_FUNCTION(4, "au", "i2sbclk"),
390*4882a593Smuzhiyun MPP_FUNCTION(5, "ptp", "clk"),
391*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "csn1"),
392*4882a593Smuzhiyun MPP_FUNCTION(9, "sata1", "present_act"),
393*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio0", NULL)),
394*4882a593Smuzhiyun MPP_MODE(40,
395*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
396*4882a593Smuzhiyun MPP_FUNCTION(1, "sdio", "pwr11"),
397*4882a593Smuzhiyun MPP_FUNCTION(2, "synce1", "clk"),
398*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_i2c", "sda"),
399*4882a593Smuzhiyun MPP_FUNCTION(4, "au", "i2sdo_spdifo"),
400*4882a593Smuzhiyun MPP_FUNCTION(5, "ptp", "pclk_out"),
401*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "clk"),
402*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "txd"),
403*4882a593Smuzhiyun MPP_FUNCTION(8, "ge", "mdio"),
404*4882a593Smuzhiyun MPP_FUNCTION(9, "sata0", "present_act"),
405*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio1", NULL)),
406*4882a593Smuzhiyun MPP_MODE(41,
407*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
408*4882a593Smuzhiyun MPP_FUNCTION(1, "sdio", "pwr10"),
409*4882a593Smuzhiyun MPP_FUNCTION(2, "sdio", "bus_pwr"),
410*4882a593Smuzhiyun MPP_FUNCTION(3, "mss_i2c", "sck"),
411*4882a593Smuzhiyun MPP_FUNCTION(4, "au", "i2slrclk"),
412*4882a593Smuzhiyun MPP_FUNCTION(5, "ptp", "pulse"),
413*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "mosi"),
414*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "rxd"),
415*4882a593Smuzhiyun MPP_FUNCTION(8, "ge", "mdc"),
416*4882a593Smuzhiyun MPP_FUNCTION(9, "sata1", "present_act"),
417*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio2", NULL),
418*4882a593Smuzhiyun MPP_FUNCTION(11, "rei", "out_cp2cp")),
419*4882a593Smuzhiyun MPP_MODE(42,
420*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
421*4882a593Smuzhiyun MPP_FUNCTION(1, "sdio", "v18_en"),
422*4882a593Smuzhiyun MPP_FUNCTION(2, "sdio", "wr_protect"),
423*4882a593Smuzhiyun MPP_FUNCTION(3, "synce2", "clk"),
424*4882a593Smuzhiyun MPP_FUNCTION(4, "au", "i2smclk"),
425*4882a593Smuzhiyun MPP_FUNCTION(5, "mss_uart", "txd"),
426*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "miso"),
427*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "cts"),
428*4882a593Smuzhiyun MPP_FUNCTION(8, "xg", "mdc"),
429*4882a593Smuzhiyun MPP_FUNCTION(9, "sata0", "present_act"),
430*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio4", NULL)),
431*4882a593Smuzhiyun MPP_MODE(43,
432*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
433*4882a593Smuzhiyun MPP_FUNCTION(1, "sdio", "card_detect"),
434*4882a593Smuzhiyun MPP_FUNCTION(3, "synce1", "clk"),
435*4882a593Smuzhiyun MPP_FUNCTION(4, "au", "i2sextclk"),
436*4882a593Smuzhiyun MPP_FUNCTION(5, "mss_uart", "rxd"),
437*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "csn0"),
438*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "rts"),
439*4882a593Smuzhiyun MPP_FUNCTION(8, "xg", "mdio"),
440*4882a593Smuzhiyun MPP_FUNCTION(9, "sata1", "present_act"),
441*4882a593Smuzhiyun MPP_FUNCTION(10, "mss_gpio5", NULL),
442*4882a593Smuzhiyun MPP_FUNCTION(11, "wakeup", "out_cp2cp")),
443*4882a593Smuzhiyun MPP_MODE(44,
444*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
445*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "txd2"),
446*4882a593Smuzhiyun MPP_FUNCTION(7, "uart0", "rts"),
447*4882a593Smuzhiyun MPP_FUNCTION(11, "ptp", "clk_cp2cp")),
448*4882a593Smuzhiyun MPP_MODE(45,
449*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
450*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "txd3"),
451*4882a593Smuzhiyun MPP_FUNCTION(7, "uart0", "txd"),
452*4882a593Smuzhiyun MPP_FUNCTION(9, "pcie", "rstoutn")),
453*4882a593Smuzhiyun MPP_MODE(46,
454*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
455*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "txd1"),
456*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "rts")),
457*4882a593Smuzhiyun MPP_MODE(47,
458*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
459*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "txd0"),
460*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "clk"),
461*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "txd"),
462*4882a593Smuzhiyun MPP_FUNCTION(8, "ge", "mdc")),
463*4882a593Smuzhiyun MPP_MODE(48,
464*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
465*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "txctl_txen"),
466*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "mosi"),
467*4882a593Smuzhiyun MPP_FUNCTION(8, "xg", "mdc"),
468*4882a593Smuzhiyun MPP_FUNCTION(11, "wakeup", "in_cp2cp")),
469*4882a593Smuzhiyun MPP_MODE(49,
470*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
471*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "txclkout"),
472*4882a593Smuzhiyun MPP_FUNCTION(2, "mii", "crs"),
473*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "miso"),
474*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "rxd"),
475*4882a593Smuzhiyun MPP_FUNCTION(8, "ge", "mdio"),
476*4882a593Smuzhiyun MPP_FUNCTION(9, "pcie0", "clkreq"),
477*4882a593Smuzhiyun MPP_FUNCTION(10, "sdio", "v18_en"),
478*4882a593Smuzhiyun MPP_FUNCTION(11, "sei", "out_cp2cp")),
479*4882a593Smuzhiyun MPP_MODE(50,
480*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
481*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "rxclk"),
482*4882a593Smuzhiyun MPP_FUNCTION(2, "mss_i2c", "sda"),
483*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "csn0"),
484*4882a593Smuzhiyun MPP_FUNCTION(6, "uart2", "txd"),
485*4882a593Smuzhiyun MPP_FUNCTION(7, "uart0", "rxd"),
486*4882a593Smuzhiyun MPP_FUNCTION(8, "xg", "mdio"),
487*4882a593Smuzhiyun MPP_FUNCTION(10, "sdio", "pwr11")),
488*4882a593Smuzhiyun MPP_MODE(51,
489*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
490*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "rxd0"),
491*4882a593Smuzhiyun MPP_FUNCTION(2, "mss_i2c", "sck"),
492*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "csn1"),
493*4882a593Smuzhiyun MPP_FUNCTION(6, "uart2", "rxd"),
494*4882a593Smuzhiyun MPP_FUNCTION(7, "uart0", "cts"),
495*4882a593Smuzhiyun MPP_FUNCTION(10, "sdio", "pwr10")),
496*4882a593Smuzhiyun MPP_MODE(52,
497*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
498*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "rxd1"),
499*4882a593Smuzhiyun MPP_FUNCTION(2, "synce1", "clk"),
500*4882a593Smuzhiyun MPP_FUNCTION(4, "synce2", "clk"),
501*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "csn2"),
502*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "cts"),
503*4882a593Smuzhiyun MPP_FUNCTION(8, "led", "clk"),
504*4882a593Smuzhiyun MPP_FUNCTION(9, "pcie", "rstoutn"),
505*4882a593Smuzhiyun MPP_FUNCTION(10, "pcie0", "clkreq")),
506*4882a593Smuzhiyun MPP_MODE(53,
507*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
508*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "rxd2"),
509*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "clk"),
510*4882a593Smuzhiyun MPP_FUNCTION(5, "spi1", "csn3"),
511*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "rxd"),
512*4882a593Smuzhiyun MPP_FUNCTION(8, "led", "stb"),
513*4882a593Smuzhiyun MPP_FUNCTION(11, "sdio", "led")),
514*4882a593Smuzhiyun MPP_MODE(54,
515*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
516*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "rxd3"),
517*4882a593Smuzhiyun MPP_FUNCTION(2, "synce2", "clk"),
518*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "pclk_out"),
519*4882a593Smuzhiyun MPP_FUNCTION(4, "synce1", "clk"),
520*4882a593Smuzhiyun MPP_FUNCTION(8, "led", "data"),
521*4882a593Smuzhiyun MPP_FUNCTION(10, "sdio", "hw_rst"),
522*4882a593Smuzhiyun MPP_FUNCTION(11, "sdio", "wr_protect")),
523*4882a593Smuzhiyun MPP_MODE(55,
524*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
525*4882a593Smuzhiyun MPP_FUNCTION(1, "ge1", "rxctl_rxdv"),
526*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "pulse"),
527*4882a593Smuzhiyun MPP_FUNCTION(10, "sdio", "led"),
528*4882a593Smuzhiyun MPP_FUNCTION(11, "sdio", "card_detect")),
529*4882a593Smuzhiyun MPP_MODE(56,
530*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
531*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "drx"),
532*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sdo_spdifo"),
533*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "clk"),
534*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "rxd"),
535*4882a593Smuzhiyun MPP_FUNCTION(9, "sata1", "present_act"),
536*4882a593Smuzhiyun MPP_FUNCTION(14, "sdio", "clk")),
537*4882a593Smuzhiyun MPP_MODE(57,
538*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
539*4882a593Smuzhiyun MPP_FUNCTION(2, "mss_i2c", "sda"),
540*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "pclk_out"),
541*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "intn"),
542*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sbclk"),
543*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "mosi"),
544*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "txd"),
545*4882a593Smuzhiyun MPP_FUNCTION(9, "sata0", "present_act"),
546*4882a593Smuzhiyun MPP_FUNCTION(14, "sdio", "cmd")),
547*4882a593Smuzhiyun MPP_MODE(58,
548*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
549*4882a593Smuzhiyun MPP_FUNCTION(2, "mss_i2c", "sck"),
550*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "clk"),
551*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "rstn"),
552*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sdi"),
553*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "miso"),
554*4882a593Smuzhiyun MPP_FUNCTION(7, "uart1", "cts"),
555*4882a593Smuzhiyun MPP_FUNCTION(8, "led", "clk"),
556*4882a593Smuzhiyun MPP_FUNCTION(14, "sdio", "d0")),
557*4882a593Smuzhiyun MPP_MODE(59,
558*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
559*4882a593Smuzhiyun MPP_FUNCTION(1, "mss_gpio7", NULL),
560*4882a593Smuzhiyun MPP_FUNCTION(2, "synce2", "clk"),
561*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "fsync"),
562*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2slrclk"),
563*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "csn0"),
564*4882a593Smuzhiyun MPP_FUNCTION(7, "uart0", "cts"),
565*4882a593Smuzhiyun MPP_FUNCTION(8, "led", "stb"),
566*4882a593Smuzhiyun MPP_FUNCTION(9, "uart1", "txd"),
567*4882a593Smuzhiyun MPP_FUNCTION(14, "sdio", "d1")),
568*4882a593Smuzhiyun MPP_MODE(60,
569*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
570*4882a593Smuzhiyun MPP_FUNCTION(1, "mss_gpio6", NULL),
571*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "pulse"),
572*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "dtx"),
573*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2smclk"),
574*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "csn1"),
575*4882a593Smuzhiyun MPP_FUNCTION(7, "uart0", "rts"),
576*4882a593Smuzhiyun MPP_FUNCTION(8, "led", "data"),
577*4882a593Smuzhiyun MPP_FUNCTION(9, "uart1", "rxd"),
578*4882a593Smuzhiyun MPP_FUNCTION(14, "sdio", "d2")),
579*4882a593Smuzhiyun MPP_MODE(61,
580*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
581*4882a593Smuzhiyun MPP_FUNCTION(1, "mss_gpio5", NULL),
582*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "clk"),
583*4882a593Smuzhiyun MPP_FUNCTION(4, "tdm", "pclk"),
584*4882a593Smuzhiyun MPP_FUNCTION(5, "au", "i2sextclk"),
585*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "csn2"),
586*4882a593Smuzhiyun MPP_FUNCTION(7, "uart0", "txd"),
587*4882a593Smuzhiyun MPP_FUNCTION(8, "uart2", "txd"),
588*4882a593Smuzhiyun MPP_FUNCTION(9, "sata1", "present_act"),
589*4882a593Smuzhiyun MPP_FUNCTION(10, "ge", "mdio"),
590*4882a593Smuzhiyun MPP_FUNCTION(14, "sdio", "d3")),
591*4882a593Smuzhiyun MPP_MODE(62,
592*4882a593Smuzhiyun MPP_FUNCTION(0, "gpio", NULL),
593*4882a593Smuzhiyun MPP_FUNCTION(1, "mss_gpio4", NULL),
594*4882a593Smuzhiyun MPP_FUNCTION(2, "synce1", "clk"),
595*4882a593Smuzhiyun MPP_FUNCTION(3, "ptp", "pclk_out"),
596*4882a593Smuzhiyun MPP_FUNCTION(5, "sata1", "present_act"),
597*4882a593Smuzhiyun MPP_FUNCTION(6, "spi0", "csn3"),
598*4882a593Smuzhiyun MPP_FUNCTION(7, "uart0", "rxd"),
599*4882a593Smuzhiyun MPP_FUNCTION(8, "uart2", "rxd"),
600*4882a593Smuzhiyun MPP_FUNCTION(9, "sata0", "present_act"),
601*4882a593Smuzhiyun MPP_FUNCTION(10, "ge", "mdc"),
602*4882a593Smuzhiyun MPP_FUNCTION(14, "sdio", "ds")),
603*4882a593Smuzhiyun };
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun static const struct of_device_id armada_cp110_pinctrl_of_match[] = {
606*4882a593Smuzhiyun {
607*4882a593Smuzhiyun .compatible = "marvell,armada-7k-pinctrl",
608*4882a593Smuzhiyun .data = (void *) V_ARMADA_7K,
609*4882a593Smuzhiyun },
610*4882a593Smuzhiyun {
611*4882a593Smuzhiyun .compatible = "marvell,armada-8k-cpm-pinctrl",
612*4882a593Smuzhiyun .data = (void *) V_ARMADA_8K_CPM,
613*4882a593Smuzhiyun },
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun .compatible = "marvell,armada-8k-cps-pinctrl",
616*4882a593Smuzhiyun .data = (void *) V_ARMADA_8K_CPS,
617*4882a593Smuzhiyun },
618*4882a593Smuzhiyun {
619*4882a593Smuzhiyun .compatible = "marvell,cp115-standalone-pinctrl",
620*4882a593Smuzhiyun .data = (void *) V_CP115_STANDALONE,
621*4882a593Smuzhiyun },
622*4882a593Smuzhiyun { },
623*4882a593Smuzhiyun };
624*4882a593Smuzhiyun
625*4882a593Smuzhiyun static const struct mvebu_mpp_ctrl armada_cp110_mpp_controls[] = {
626*4882a593Smuzhiyun MPP_FUNC_CTRL(0, 62, NULL, mvebu_regmap_mpp_ctrl),
627*4882a593Smuzhiyun };
628*4882a593Smuzhiyun
mvebu_pinctrl_assign_variant(struct mvebu_mpp_mode * m,u8 variant)629*4882a593Smuzhiyun static void mvebu_pinctrl_assign_variant(struct mvebu_mpp_mode *m,
630*4882a593Smuzhiyun u8 variant)
631*4882a593Smuzhiyun {
632*4882a593Smuzhiyun struct mvebu_mpp_ctrl_setting *s;
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun for (s = m->settings ; s->name ; s++)
635*4882a593Smuzhiyun s->variant = variant;
636*4882a593Smuzhiyun }
637*4882a593Smuzhiyun
armada_cp110_pinctrl_probe(struct platform_device * pdev)638*4882a593Smuzhiyun static int armada_cp110_pinctrl_probe(struct platform_device *pdev)
639*4882a593Smuzhiyun {
640*4882a593Smuzhiyun struct mvebu_pinctrl_soc_info *soc;
641*4882a593Smuzhiyun const struct of_device_id *match =
642*4882a593Smuzhiyun of_match_device(armada_cp110_pinctrl_of_match, &pdev->dev);
643*4882a593Smuzhiyun int i;
644*4882a593Smuzhiyun
645*4882a593Smuzhiyun if (!pdev->dev.parent)
646*4882a593Smuzhiyun return -ENODEV;
647*4882a593Smuzhiyun
648*4882a593Smuzhiyun soc = devm_kzalloc(&pdev->dev,
649*4882a593Smuzhiyun sizeof(struct mvebu_pinctrl_soc_info), GFP_KERNEL);
650*4882a593Smuzhiyun if (!soc)
651*4882a593Smuzhiyun return -ENOMEM;
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun soc->variant = (unsigned long) match->data & 0xff;
654*4882a593Smuzhiyun soc->controls = armada_cp110_mpp_controls;
655*4882a593Smuzhiyun soc->ncontrols = ARRAY_SIZE(armada_cp110_mpp_controls);
656*4882a593Smuzhiyun soc->modes = armada_cp110_mpp_modes;
657*4882a593Smuzhiyun soc->nmodes = ARRAY_SIZE(armada_cp110_mpp_modes);
658*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(armada_cp110_mpp_modes); i++) {
659*4882a593Smuzhiyun struct mvebu_mpp_mode *m = &armada_cp110_mpp_modes[i];
660*4882a593Smuzhiyun
661*4882a593Smuzhiyun switch (i) {
662*4882a593Smuzhiyun case 0 ... 31:
663*4882a593Smuzhiyun mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPS |
664*4882a593Smuzhiyun V_CP115_STANDALONE));
665*4882a593Smuzhiyun break;
666*4882a593Smuzhiyun case 32 ... 38:
667*4882a593Smuzhiyun mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPM |
668*4882a593Smuzhiyun V_CP115_STANDALONE));
669*4882a593Smuzhiyun break;
670*4882a593Smuzhiyun case 39 ... 43:
671*4882a593Smuzhiyun mvebu_pinctrl_assign_variant(m, (V_ARMADA_8K_CPM |
672*4882a593Smuzhiyun V_CP115_STANDALONE));
673*4882a593Smuzhiyun break;
674*4882a593Smuzhiyun case 44 ... 62:
675*4882a593Smuzhiyun mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPM |
676*4882a593Smuzhiyun V_CP115_STANDALONE));
677*4882a593Smuzhiyun break;
678*4882a593Smuzhiyun }
679*4882a593Smuzhiyun }
680*4882a593Smuzhiyun pdev->dev.platform_data = soc;
681*4882a593Smuzhiyun
682*4882a593Smuzhiyun return mvebu_pinctrl_simple_regmap_probe(pdev, pdev->dev.parent, 0);
683*4882a593Smuzhiyun }
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun static struct platform_driver armada_cp110_pinctrl_driver = {
686*4882a593Smuzhiyun .driver = {
687*4882a593Smuzhiyun .name = "armada-cp110-pinctrl",
688*4882a593Smuzhiyun .of_match_table = of_match_ptr(armada_cp110_pinctrl_of_match),
689*4882a593Smuzhiyun },
690*4882a593Smuzhiyun .probe = armada_cp110_pinctrl_probe,
691*4882a593Smuzhiyun };
692*4882a593Smuzhiyun
693*4882a593Smuzhiyun builtin_platform_driver(armada_cp110_pinctrl_driver);
694