xref: /OK3568_Linux_fs/kernel/drivers/pinctrl/berlin/berlin-bg2cd.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Marvell Berlin BG2CD pinctrl driver.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2014 Marvell Technology Group Ltd.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Antoine Ténart <antoine.tenart@free-electrons.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/init.h>
11*4882a593Smuzhiyun #include <linux/of_device.h>
12*4882a593Smuzhiyun #include <linux/platform_device.h>
13*4882a593Smuzhiyun #include <linux/regmap.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include "berlin.h"
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun static const struct berlin_desc_group berlin2cd_soc_pinctrl_groups[] = {
18*4882a593Smuzhiyun 	/* G */
19*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G0", 0x00, 0x3, 0x00,
20*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
21*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "gpio"),
22*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x2, "led"),
23*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x3, "pwm")),
24*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G1", 0x00, 0x3, 0x03,
25*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
26*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
27*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
28*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
29*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G2", 0x00, 0x3, 0x06,
30*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
31*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
32*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x2, "fe"),
33*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x3, "pll"),
34*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
35*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
36*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G3", 0x00, 0x3, 0x09,
37*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
38*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
39*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x2, "twsi2"),
40*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x3, "pll"),
41*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x4, "fe"),
42*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
43*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
44*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G4", 0x00, 0x3, 0x0c,
45*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
46*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
47*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x2, "twsi3"),
48*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x3, "pll"),
49*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
50*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
51*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
52*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G5", 0x00, 0x3, 0x0f,
53*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
54*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
55*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x2, "twsi3"),
56*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x3, "arc"),
57*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
58*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
59*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
60*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G6", 0x00, 0x3, 0x12,
61*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "uart0"),	/* RX/TX */
62*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
63*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G7", 0x00, 0x3, 0x15,
64*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "eddc"),
65*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "twsi1"),
66*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
67*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G8", 0x00, 0x3, 0x18,
68*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n */
69*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
70*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G9", 0x00, 0x3, 0x1b,
71*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
72*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS1n/SS2n */
73*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x3, "twsi0")),
74*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G10", 0x00, 0x2, 0x1e,
75*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* CLK */
76*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
77*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G11", 0x04, 0x2, 0x00,
78*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SDI/SDO */
79*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
80*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G12", 0x04, 0x3, 0x02,
81*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "usb1"),
82*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
83*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G13", 0x04, 0x3, 0x05,
84*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
85*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "usb0_dbg"),
86*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x2, "usb1_dbg")),
87*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G14", 0x04, 0x1, 0x08,
88*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
89*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
90*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G15", 0x04, 0x3, 0x09,
91*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
92*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
93*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G16", 0x04, 0x3, 0x0c,
94*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
95*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G17", 0x04, 0x3, 0x0f,
96*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
97*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G18", 0x04, 0x2, 0x12,
98*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
99*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G19", 0x04, 0x2, 0x14,
100*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
101*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G20", 0x04, 0x2, 0x16,
102*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
103*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G21", 0x04, 0x3, 0x18,
104*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
105*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G22", 0x04, 0x3, 0x1b,
106*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
107*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G23", 0x08, 0x3, 0x00,
108*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
109*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G24", 0x08, 0x2, 0x03,
110*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
111*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G25", 0x08, 0x2, 0x05,
112*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
113*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G26", 0x08, 0x1, 0x07,
114*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
115*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G27", 0x08, 0x2, 0x08,
116*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
117*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G28", 0x08, 0x3, 0x0a,
118*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
119*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("G29", 0x08, 0x3, 0x0d,
120*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun static const struct berlin_desc_group berlin2cd_sysmgr_pinctrl_groups[] = {
124*4882a593Smuzhiyun 	/* GSM */
125*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM0", 0x40, 0x2, 0x00,
126*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
127*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM1", 0x40, 0x2, 0x02,
128*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
129*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM2", 0x40, 0x2, 0x04,
130*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
131*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM3", 0x40, 0x2, 0x06,
132*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
133*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM4", 0x40, 0x2, 0x08,
134*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
135*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM5", 0x40, 0x2, 0x0a,
136*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
137*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM6", 0x40, 0x2, 0x0c,
138*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
139*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM7", 0x40, 0x1, 0x0e,
140*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
141*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM8", 0x40, 0x1, 0x0f,
142*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
143*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM9", 0x40, 0x1, 0x10,
144*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
145*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM10", 0x40, 0x1, 0x11,
146*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
147*4882a593Smuzhiyun 	BERLIN_PINCTRL_GROUP("GSM11", 0x40, 0x1, 0x12,
148*4882a593Smuzhiyun 		BERLIN_PINCTRL_FUNCTION_UNKNOWN),
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun static const struct berlin_pinctrl_desc berlin2cd_soc_pinctrl_data = {
152*4882a593Smuzhiyun 	.groups = berlin2cd_soc_pinctrl_groups,
153*4882a593Smuzhiyun 	.ngroups = ARRAY_SIZE(berlin2cd_soc_pinctrl_groups),
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun static const struct berlin_pinctrl_desc berlin2cd_sysmgr_pinctrl_data = {
157*4882a593Smuzhiyun 	.groups = berlin2cd_sysmgr_pinctrl_groups,
158*4882a593Smuzhiyun 	.ngroups = ARRAY_SIZE(berlin2cd_sysmgr_pinctrl_groups),
159*4882a593Smuzhiyun };
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun static const struct of_device_id berlin2cd_pinctrl_match[] = {
162*4882a593Smuzhiyun 	{
163*4882a593Smuzhiyun 		.compatible = "marvell,berlin2cd-soc-pinctrl",
164*4882a593Smuzhiyun 		.data = &berlin2cd_soc_pinctrl_data
165*4882a593Smuzhiyun 	},
166*4882a593Smuzhiyun 	{
167*4882a593Smuzhiyun 		.compatible = "marvell,berlin2cd-system-pinctrl",
168*4882a593Smuzhiyun 		.data = &berlin2cd_sysmgr_pinctrl_data
169*4882a593Smuzhiyun 	},
170*4882a593Smuzhiyun 	{}
171*4882a593Smuzhiyun };
172*4882a593Smuzhiyun 
berlin2cd_pinctrl_probe(struct platform_device * pdev)173*4882a593Smuzhiyun static int berlin2cd_pinctrl_probe(struct platform_device *pdev)
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun 	const struct of_device_id *match =
176*4882a593Smuzhiyun 		of_match_device(berlin2cd_pinctrl_match, &pdev->dev);
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	return berlin_pinctrl_probe(pdev, match->data);
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun static struct platform_driver berlin2cd_pinctrl_driver = {
182*4882a593Smuzhiyun 	.probe	= berlin2cd_pinctrl_probe,
183*4882a593Smuzhiyun 	.driver	= {
184*4882a593Smuzhiyun 		.name = "berlin-bg2cd-pinctrl",
185*4882a593Smuzhiyun 		.of_match_table = berlin2cd_pinctrl_match,
186*4882a593Smuzhiyun 	},
187*4882a593Smuzhiyun };
188*4882a593Smuzhiyun builtin_platform_driver(berlin2cd_pinctrl_driver);
189