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