xref: /rk3399_rockchip-uboot/drivers/pinctrl/pinctrl-max96745.c (revision 7530e4c679d266a3ab089690e453b846b62f3b43)
1*7530e4c6SWyon Bi // SPDX-License-Identifier: GPL-2.0+
2*7530e4c6SWyon Bi /*
3*7530e4c6SWyon Bi  * (C) Copyright 2022 Rockchip Electronics Co., Ltd
4*7530e4c6SWyon Bi  */
5*7530e4c6SWyon Bi 
6*7530e4c6SWyon Bi #include <common.h>
7*7530e4c6SWyon Bi #include <dm.h>
8*7530e4c6SWyon Bi #include <dm/pinctrl.h>
9*7530e4c6SWyon Bi #include <errno.h>
10*7530e4c6SWyon Bi #include <i2c.h>
11*7530e4c6SWyon Bi #include <max96745.h>
12*7530e4c6SWyon Bi 
13*7530e4c6SWyon Bi struct function_desc {
14*7530e4c6SWyon Bi 	const char *name;
15*7530e4c6SWyon Bi 	const char **group_names;
16*7530e4c6SWyon Bi 	int num_group_names;
17*7530e4c6SWyon Bi 
18*7530e4c6SWyon Bi 	u8 gpio_out_dis:1;
19*7530e4c6SWyon Bi 	u8 gpio_io_rx_en:1;
20*7530e4c6SWyon Bi 	u8 gpio_tx_en_a:1;
21*7530e4c6SWyon Bi 	u8 gpio_tx_en_b:1;
22*7530e4c6SWyon Bi 	u8 gpio_rx_en_a:1;
23*7530e4c6SWyon Bi 	u8 gpio_rx_en_b:1;
24*7530e4c6SWyon Bi 	u8 gpio_tx_id;
25*7530e4c6SWyon Bi 	u8 gpio_rx_id;
26*7530e4c6SWyon Bi };
27*7530e4c6SWyon Bi 
28*7530e4c6SWyon Bi struct group_desc {
29*7530e4c6SWyon Bi 	const char *name;
30*7530e4c6SWyon Bi 	int *pins;
31*7530e4c6SWyon Bi 	int num_pins;
32*7530e4c6SWyon Bi 	void *data;
33*7530e4c6SWyon Bi };
34*7530e4c6SWyon Bi 
35*7530e4c6SWyon Bi struct pin_desc {
36*7530e4c6SWyon Bi 	unsigned number;
37*7530e4c6SWyon Bi 	const char *name;
38*7530e4c6SWyon Bi };
39*7530e4c6SWyon Bi 
40*7530e4c6SWyon Bi static const struct pin_desc max96745_pins[] = {
41*7530e4c6SWyon Bi 	{0, "gpio0"},
42*7530e4c6SWyon Bi 	{1, "gpio1"},
43*7530e4c6SWyon Bi 	{2, "gpio2"},
44*7530e4c6SWyon Bi 	{3, "gpio3"},
45*7530e4c6SWyon Bi 	{4, "gpio4"},
46*7530e4c6SWyon Bi 	{5, "gpio5"},
47*7530e4c6SWyon Bi 	{6, "gpio6"},
48*7530e4c6SWyon Bi 	{7, "gpio7"},
49*7530e4c6SWyon Bi 	{8, "gpio8"},
50*7530e4c6SWyon Bi 	{9, "gpio9"},
51*7530e4c6SWyon Bi 	{10, "gpio10"},
52*7530e4c6SWyon Bi 	{11, "gpio11"},
53*7530e4c6SWyon Bi 	{12, "gpio12"},
54*7530e4c6SWyon Bi 	{13, "gpio13"},
55*7530e4c6SWyon Bi 	{14, "gpio14"},
56*7530e4c6SWyon Bi 	{15, "gpio15"},
57*7530e4c6SWyon Bi 	{16, "gpio16"},
58*7530e4c6SWyon Bi 	{17, "gpio17"},
59*7530e4c6SWyon Bi 	{18, "gpio18"},
60*7530e4c6SWyon Bi 	{19, "gpio19"},
61*7530e4c6SWyon Bi 	{20, "gpio20"},
62*7530e4c6SWyon Bi 	{21, "gpio21"},
63*7530e4c6SWyon Bi 	{22, "gpio22"},
64*7530e4c6SWyon Bi 	{23, "gpio23"},
65*7530e4c6SWyon Bi 	{24, "gpio24"},
66*7530e4c6SWyon Bi 	{25, "gpio25"},
67*7530e4c6SWyon Bi };
68*7530e4c6SWyon Bi 
69*7530e4c6SWyon Bi static int gpio0_pins[] = {0};
70*7530e4c6SWyon Bi static int gpio1_pins[] = {1};
71*7530e4c6SWyon Bi static int gpio2_pins[] = {2};
72*7530e4c6SWyon Bi static int gpio3_pins[] = {3};
73*7530e4c6SWyon Bi static int gpio4_pins[] = {4};
74*7530e4c6SWyon Bi static int gpio5_pins[] = {5};
75*7530e4c6SWyon Bi static int gpio6_pins[] = {6};
76*7530e4c6SWyon Bi static int gpio7_pins[] = {7};
77*7530e4c6SWyon Bi static int gpio8_pins[] = {8};
78*7530e4c6SWyon Bi static int gpio9_pins[] = {9};
79*7530e4c6SWyon Bi static int gpio10_pins[] = {10};
80*7530e4c6SWyon Bi static int gpio11_pins[] = {11};
81*7530e4c6SWyon Bi static int gpio12_pins[] = {12};
82*7530e4c6SWyon Bi static int gpio13_pins[] = {13};
83*7530e4c6SWyon Bi static int gpio14_pins[] = {14};
84*7530e4c6SWyon Bi static int gpio15_pins[] = {15};
85*7530e4c6SWyon Bi static int gpio16_pins[] = {16};
86*7530e4c6SWyon Bi static int gpio17_pins[] = {17};
87*7530e4c6SWyon Bi static int gpio18_pins[] = {18};
88*7530e4c6SWyon Bi static int gpio19_pins[] = {19};
89*7530e4c6SWyon Bi static int gpio20_pins[] = {20};
90*7530e4c6SWyon Bi static int gpio21_pins[] = {21};
91*7530e4c6SWyon Bi static int gpio22_pins[] = {22};
92*7530e4c6SWyon Bi static int gpio23_pins[] = {23};
93*7530e4c6SWyon Bi static int gpio24_pins[] = {24};
94*7530e4c6SWyon Bi static int gpio25_pins[] = {25};
95*7530e4c6SWyon Bi 
96*7530e4c6SWyon Bi #define GROUP_DESC(nm) \
97*7530e4c6SWyon Bi { \
98*7530e4c6SWyon Bi 	.name = #nm, \
99*7530e4c6SWyon Bi 	.pins = nm ## _pins, \
100*7530e4c6SWyon Bi 	.num_pins = ARRAY_SIZE(nm ## _pins), \
101*7530e4c6SWyon Bi }
102*7530e4c6SWyon Bi 
103*7530e4c6SWyon Bi static const struct group_desc max96745_groups[] = {
104*7530e4c6SWyon Bi 	GROUP_DESC(gpio0),
105*7530e4c6SWyon Bi 	GROUP_DESC(gpio1),
106*7530e4c6SWyon Bi 	GROUP_DESC(gpio2),
107*7530e4c6SWyon Bi 	GROUP_DESC(gpio3),
108*7530e4c6SWyon Bi 	GROUP_DESC(gpio4),
109*7530e4c6SWyon Bi 	GROUP_DESC(gpio5),
110*7530e4c6SWyon Bi 	GROUP_DESC(gpio6),
111*7530e4c6SWyon Bi 	GROUP_DESC(gpio7),
112*7530e4c6SWyon Bi 	GROUP_DESC(gpio8),
113*7530e4c6SWyon Bi 	GROUP_DESC(gpio9),
114*7530e4c6SWyon Bi 	GROUP_DESC(gpio10),
115*7530e4c6SWyon Bi 	GROUP_DESC(gpio11),
116*7530e4c6SWyon Bi 	GROUP_DESC(gpio12),
117*7530e4c6SWyon Bi 	GROUP_DESC(gpio13),
118*7530e4c6SWyon Bi 	GROUP_DESC(gpio14),
119*7530e4c6SWyon Bi 	GROUP_DESC(gpio15),
120*7530e4c6SWyon Bi 	GROUP_DESC(gpio16),
121*7530e4c6SWyon Bi 	GROUP_DESC(gpio17),
122*7530e4c6SWyon Bi 	GROUP_DESC(gpio18),
123*7530e4c6SWyon Bi 	GROUP_DESC(gpio19),
124*7530e4c6SWyon Bi 	GROUP_DESC(gpio20),
125*7530e4c6SWyon Bi 	GROUP_DESC(gpio21),
126*7530e4c6SWyon Bi 	GROUP_DESC(gpio22),
127*7530e4c6SWyon Bi 	GROUP_DESC(gpio23),
128*7530e4c6SWyon Bi 	GROUP_DESC(gpio24),
129*7530e4c6SWyon Bi 	GROUP_DESC(gpio25),
130*7530e4c6SWyon Bi };
131*7530e4c6SWyon Bi 
132*7530e4c6SWyon Bi static const char *gpio_groups[] = {
133*7530e4c6SWyon Bi 	"gpio0", "gpio1", "gpio2", "gpio3", "gpio4",
134*7530e4c6SWyon Bi 	"gpio5", "gpio6", "gpio7", "gpio8", "gpio9",
135*7530e4c6SWyon Bi 	"gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
136*7530e4c6SWyon Bi 	"gpio15", "gpio16", "gpio17", "gpio18", "gpio19",
137*7530e4c6SWyon Bi 	"gpio20", "gpio21", "gpio22", "gpio23", "gpio24",
138*7530e4c6SWyon Bi 	"gpio25",
139*7530e4c6SWyon Bi };
140*7530e4c6SWyon Bi 
141*7530e4c6SWyon Bi #define FUNCTION_DESC_GPIO_TX_A(id) \
142*7530e4c6SWyon Bi { \
143*7530e4c6SWyon Bi 	.name = "GPIO_TX_A_"#id, \
144*7530e4c6SWyon Bi 	.group_names = gpio_groups, \
145*7530e4c6SWyon Bi 	.num_group_names = ARRAY_SIZE(gpio_groups), \
146*7530e4c6SWyon Bi 	.gpio_out_dis = 1, \
147*7530e4c6SWyon Bi 	.gpio_tx_en_a = 1, \
148*7530e4c6SWyon Bi 	.gpio_io_rx_en = 1, \
149*7530e4c6SWyon Bi 	.gpio_tx_id = id, \
150*7530e4c6SWyon Bi } \
151*7530e4c6SWyon Bi 
152*7530e4c6SWyon Bi #define FUNCTION_DESC_GPIO_TX_B(id) \
153*7530e4c6SWyon Bi { \
154*7530e4c6SWyon Bi 	.name = "GPIO_TX_B_"#id, \
155*7530e4c6SWyon Bi 	.group_names = gpio_groups, \
156*7530e4c6SWyon Bi 	.num_group_names = ARRAY_SIZE(gpio_groups), \
157*7530e4c6SWyon Bi 	.gpio_out_dis = 1, \
158*7530e4c6SWyon Bi 	.gpio_tx_en_b = 1, \
159*7530e4c6SWyon Bi 	.gpio_io_rx_en = 1, \
160*7530e4c6SWyon Bi 	.gpio_tx_id = id, \
161*7530e4c6SWyon Bi } \
162*7530e4c6SWyon Bi 
163*7530e4c6SWyon Bi #define FUNCTION_DESC_GPIO_RX_A(id) \
164*7530e4c6SWyon Bi { \
165*7530e4c6SWyon Bi 	.name = "GPIO_RX_A_"#id, \
166*7530e4c6SWyon Bi 	.group_names = gpio_groups, \
167*7530e4c6SWyon Bi 	.num_group_names = ARRAY_SIZE(gpio_groups), \
168*7530e4c6SWyon Bi 	.gpio_rx_en_a = 1, \
169*7530e4c6SWyon Bi 	.gpio_rx_id = id, \
170*7530e4c6SWyon Bi } \
171*7530e4c6SWyon Bi 
172*7530e4c6SWyon Bi #define FUNCTION_DESC_GPIO_RX_B(id) \
173*7530e4c6SWyon Bi { \
174*7530e4c6SWyon Bi 	.name = "GPIO_RX_B_"#id, \
175*7530e4c6SWyon Bi 	.group_names = gpio_groups, \
176*7530e4c6SWyon Bi 	.num_group_names = ARRAY_SIZE(gpio_groups), \
177*7530e4c6SWyon Bi 	.gpio_rx_en_b = 1, \
178*7530e4c6SWyon Bi 	.gpio_rx_id = id, \
179*7530e4c6SWyon Bi } \
180*7530e4c6SWyon Bi 
181*7530e4c6SWyon Bi #define FUNCTION_DESC_GPIO() \
182*7530e4c6SWyon Bi { \
183*7530e4c6SWyon Bi 	.name = "GPIO", \
184*7530e4c6SWyon Bi 	.group_names = gpio_groups, \
185*7530e4c6SWyon Bi 	.num_group_names = ARRAY_SIZE(gpio_groups), \
186*7530e4c6SWyon Bi } \
187*7530e4c6SWyon Bi 
188*7530e4c6SWyon Bi static const struct function_desc max96745_functions[] = {
189*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(0),
190*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(1),
191*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(2),
192*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(3),
193*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(4),
194*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(5),
195*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(6),
196*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(7),
197*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(8),
198*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(9),
199*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(10),
200*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(11),
201*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(12),
202*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(13),
203*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(14),
204*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(15),
205*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(16),
206*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(17),
207*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(18),
208*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(19),
209*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(20),
210*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(21),
211*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(22),
212*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(23),
213*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(24),
214*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(25),
215*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(26),
216*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(27),
217*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(28),
218*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(29),
219*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(30),
220*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_A(31),
221*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(0),
222*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(1),
223*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(2),
224*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(3),
225*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(4),
226*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(5),
227*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(6),
228*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(7),
229*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(8),
230*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(9),
231*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(10),
232*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(11),
233*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(12),
234*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(13),
235*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(14),
236*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(15),
237*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(16),
238*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(17),
239*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(18),
240*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(19),
241*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(20),
242*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(21),
243*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(22),
244*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(23),
245*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(24),
246*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(25),
247*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(26),
248*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(27),
249*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(28),
250*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(29),
251*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(30),
252*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_TX_B(31),
253*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(0),
254*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(1),
255*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(2),
256*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(3),
257*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(4),
258*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(5),
259*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(6),
260*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(7),
261*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(8),
262*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(9),
263*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(10),
264*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(11),
265*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(12),
266*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(13),
267*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(14),
268*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(15),
269*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(16),
270*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(17),
271*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(18),
272*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(19),
273*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(20),
274*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(21),
275*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(22),
276*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(23),
277*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(24),
278*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(25),
279*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(26),
280*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(27),
281*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(28),
282*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(29),
283*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(30),
284*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_A(31),
285*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(0),
286*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(1),
287*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(2),
288*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(3),
289*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(4),
290*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(5),
291*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(6),
292*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(7),
293*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(8),
294*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(9),
295*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(10),
296*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(11),
297*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(12),
298*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(13),
299*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(14),
300*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(15),
301*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(16),
302*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(17),
303*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(18),
304*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(19),
305*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(20),
306*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(21),
307*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(22),
308*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(23),
309*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(24),
310*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(25),
311*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(26),
312*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(27),
313*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(28),
314*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(29),
315*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(30),
316*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO_RX_B(31),
317*7530e4c6SWyon Bi 	FUNCTION_DESC_GPIO(),
318*7530e4c6SWyon Bi };
319*7530e4c6SWyon Bi 
max96745_get_pins_count(struct udevice * dev)320*7530e4c6SWyon Bi static int max96745_get_pins_count(struct udevice *dev)
321*7530e4c6SWyon Bi {
322*7530e4c6SWyon Bi 	return ARRAY_SIZE(max96745_pins);
323*7530e4c6SWyon Bi }
324*7530e4c6SWyon Bi 
max96745_get_pin_name(struct udevice * dev,unsigned selector)325*7530e4c6SWyon Bi static const char *max96745_get_pin_name(struct udevice *dev, unsigned selector)
326*7530e4c6SWyon Bi {
327*7530e4c6SWyon Bi 	return max96745_pins[selector].name;
328*7530e4c6SWyon Bi }
329*7530e4c6SWyon Bi 
max96745_pinctrl_get_groups_count(struct udevice * dev)330*7530e4c6SWyon Bi static int max96745_pinctrl_get_groups_count(struct udevice *dev)
331*7530e4c6SWyon Bi {
332*7530e4c6SWyon Bi 	return ARRAY_SIZE(max96745_groups);
333*7530e4c6SWyon Bi }
334*7530e4c6SWyon Bi 
max96745_pinctrl_get_group_name(struct udevice * dev,unsigned selector)335*7530e4c6SWyon Bi static const char *max96745_pinctrl_get_group_name(struct udevice *dev,
336*7530e4c6SWyon Bi 						   unsigned selector)
337*7530e4c6SWyon Bi {
338*7530e4c6SWyon Bi 	return max96745_groups[selector].name;
339*7530e4c6SWyon Bi }
340*7530e4c6SWyon Bi 
max96745_pinctrl_get_functions_count(struct udevice * dev)341*7530e4c6SWyon Bi static int max96745_pinctrl_get_functions_count(struct udevice *dev)
342*7530e4c6SWyon Bi {
343*7530e4c6SWyon Bi 	return ARRAY_SIZE(max96745_functions);
344*7530e4c6SWyon Bi }
345*7530e4c6SWyon Bi 
max96745_pinctrl_get_function_name(struct udevice * dev,unsigned selector)346*7530e4c6SWyon Bi static const char *max96745_pinctrl_get_function_name(struct udevice *dev,
347*7530e4c6SWyon Bi 						      unsigned selector)
348*7530e4c6SWyon Bi {
349*7530e4c6SWyon Bi 	return max96745_functions[selector].name;
350*7530e4c6SWyon Bi }
351*7530e4c6SWyon Bi 
max96745_pinmux_set(struct udevice * dev,unsigned group_selector,unsigned func_selector)352*7530e4c6SWyon Bi static int max96745_pinmux_set(struct udevice *dev, unsigned group_selector,
353*7530e4c6SWyon Bi 			       unsigned func_selector)
354*7530e4c6SWyon Bi {
355*7530e4c6SWyon Bi 	const struct group_desc *grp = &max96745_groups[group_selector];
356*7530e4c6SWyon Bi 	const struct function_desc *func = &max96745_functions[func_selector];
357*7530e4c6SWyon Bi 	int i;
358*7530e4c6SWyon Bi 
359*7530e4c6SWyon Bi 	for (i = 0; i < grp->num_pins; i++) {
360*7530e4c6SWyon Bi 		dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(grp->pins[i]),
361*7530e4c6SWyon Bi 				  GPIO_OUT_DIS,
362*7530e4c6SWyon Bi 				  FIELD_PREP(GPIO_OUT_DIS, func->gpio_out_dis));
363*7530e4c6SWyon Bi 
364*7530e4c6SWyon Bi 		if (func->gpio_tx_en_a || func->gpio_tx_en_b)
365*7530e4c6SWyon Bi 			dm_i2c_reg_clrset(dev->parent, GPIO_B_REG(grp->pins[i]),
366*7530e4c6SWyon Bi 					  GPIO_TX_ID,
367*7530e4c6SWyon Bi 					  FIELD_PREP(GPIO_TX_ID, func->gpio_tx_id));
368*7530e4c6SWyon Bi 
369*7530e4c6SWyon Bi 		if (func->gpio_rx_en_a || func->gpio_rx_en_b)
370*7530e4c6SWyon Bi 			dm_i2c_reg_clrset(dev->parent, GPIO_C_REG(grp->pins[i]),
371*7530e4c6SWyon Bi 					  GPIO_RX_ID,
372*7530e4c6SWyon Bi 					  FIELD_PREP(GPIO_RX_ID, func->gpio_rx_id));
373*7530e4c6SWyon Bi 
374*7530e4c6SWyon Bi 		dm_i2c_reg_clrset(dev->parent, GPIO_D_REG(grp->pins[i]),
375*7530e4c6SWyon Bi 				  GPIO_TX_EN_A | GPIO_TX_EN_B | GPIO_IO_RX_EN |
376*7530e4c6SWyon Bi 				  GPIO_RX_EN_A | GPIO_RX_EN_B,
377*7530e4c6SWyon Bi 				  FIELD_PREP(GPIO_TX_EN_A, func->gpio_tx_en_a) |
378*7530e4c6SWyon Bi 				  FIELD_PREP(GPIO_TX_EN_B, func->gpio_tx_en_b) |
379*7530e4c6SWyon Bi 				  FIELD_PREP(GPIO_RX_EN_A, func->gpio_rx_en_a) |
380*7530e4c6SWyon Bi 				  FIELD_PREP(GPIO_RX_EN_B, func->gpio_rx_en_b) |
381*7530e4c6SWyon Bi 				  FIELD_PREP(GPIO_IO_RX_EN, func->gpio_io_rx_en));
382*7530e4c6SWyon Bi 	}
383*7530e4c6SWyon Bi 
384*7530e4c6SWyon Bi 	return 0;
385*7530e4c6SWyon Bi }
386*7530e4c6SWyon Bi 
387*7530e4c6SWyon Bi static struct pinctrl_ops max96745_pinctrl_ops = {
388*7530e4c6SWyon Bi 	.get_pins_count = max96745_get_pins_count,
389*7530e4c6SWyon Bi 	.get_pin_name = max96745_get_pin_name,
390*7530e4c6SWyon Bi 	.get_groups_count = max96745_pinctrl_get_groups_count,
391*7530e4c6SWyon Bi 	.get_group_name = max96745_pinctrl_get_group_name,
392*7530e4c6SWyon Bi 	.get_functions_count = max96745_pinctrl_get_functions_count,
393*7530e4c6SWyon Bi 	.get_function_name = max96745_pinctrl_get_function_name,
394*7530e4c6SWyon Bi 	.set_state = pinctrl_generic_set_state,
395*7530e4c6SWyon Bi 	.pinmux_set = max96745_pinmux_set,
396*7530e4c6SWyon Bi 	.pinmux_group_set = max96745_pinmux_set,
397*7530e4c6SWyon Bi };
398*7530e4c6SWyon Bi 
399*7530e4c6SWyon Bi static const struct udevice_id max96745_pinctrl_of_match[] = {
400*7530e4c6SWyon Bi 	{ .compatible = "maxim,max96745-pinctrl" },
401*7530e4c6SWyon Bi 	{ }
402*7530e4c6SWyon Bi };
403*7530e4c6SWyon Bi 
404*7530e4c6SWyon Bi U_BOOT_DRIVER(max96745_pinctrl) = {
405*7530e4c6SWyon Bi 	.name = "pinctrl-max96745",
406*7530e4c6SWyon Bi 	.id = UCLASS_PINCTRL,
407*7530e4c6SWyon Bi 	.of_match = max96745_pinctrl_of_match,
408*7530e4c6SWyon Bi 	.ops = &max96745_pinctrl_ops,
409*7530e4c6SWyon Bi };
410