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 <errno.h>
9*4882a593Smuzhiyun #include <i2c.h>
10*4882a593Smuzhiyun #include <max96755f.h>
11*4882a593Smuzhiyun #include <dm/pinctrl.h>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun struct config_desc {
14*4882a593Smuzhiyun u16 reg;
15*4882a593Smuzhiyun u8 mask;
16*4882a593Smuzhiyun u8 val;
17*4882a593Smuzhiyun };
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun struct function_desc {
20*4882a593Smuzhiyun const char *name;
21*4882a593Smuzhiyun const char **group_names;
22*4882a593Smuzhiyun int num_group_names;
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun u8 gpio_out_dis:1;
25*4882a593Smuzhiyun u8 gpio_tx_en:1;
26*4882a593Smuzhiyun u8 gpio_rx_en:1;
27*4882a593Smuzhiyun u8 oldi:1;
28*4882a593Smuzhiyun u8 gpio_tx_id;
29*4882a593Smuzhiyun u8 gpio_rx_id;
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun struct group_desc {
33*4882a593Smuzhiyun const char *name;
34*4882a593Smuzhiyun int *pins;
35*4882a593Smuzhiyun int num_pins;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun const struct config_desc *configs;
38*4882a593Smuzhiyun int num_configs;
39*4882a593Smuzhiyun };
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun struct pin_desc {
42*4882a593Smuzhiyun unsigned int number;
43*4882a593Smuzhiyun const char *name;
44*4882a593Smuzhiyun };
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun static const struct pin_desc max96755f_pins[] = {
47*4882a593Smuzhiyun {0, "gpio0"},
48*4882a593Smuzhiyun {1, "gpio1"},
49*4882a593Smuzhiyun {2, "gpio2"},
50*4882a593Smuzhiyun {3, "gpio3"},
51*4882a593Smuzhiyun {4, "gpio4"},
52*4882a593Smuzhiyun {5, "gpio5"},
53*4882a593Smuzhiyun {6, "gpio6"},
54*4882a593Smuzhiyun {7, "gpio7"},
55*4882a593Smuzhiyun {8, "gpio8"},
56*4882a593Smuzhiyun {9, "gpio9"},
57*4882a593Smuzhiyun {10, "gpio10"},
58*4882a593Smuzhiyun {11, "gpio11"},
59*4882a593Smuzhiyun {12, "gpio12"},
60*4882a593Smuzhiyun {13, "gpio13"},
61*4882a593Smuzhiyun {14, "gpio14"},
62*4882a593Smuzhiyun {15, "gpio15"},
63*4882a593Smuzhiyun {16, "gpio16"},
64*4882a593Smuzhiyun {17, "gpio17"},
65*4882a593Smuzhiyun {18, "gpio18"},
66*4882a593Smuzhiyun {19, "gpio19"},
67*4882a593Smuzhiyun {20, "gpio20"},
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun static int gpio0_pins[] = {0};
71*4882a593Smuzhiyun static int gpio1_pins[] = {1};
72*4882a593Smuzhiyun static int gpio2_pins[] = {2};
73*4882a593Smuzhiyun static int gpio3_pins[] = {3};
74*4882a593Smuzhiyun static int gpio4_pins[] = {4};
75*4882a593Smuzhiyun static int gpio5_pins[] = {5};
76*4882a593Smuzhiyun static int gpio6_pins[] = {6};
77*4882a593Smuzhiyun static int gpio7_pins[] = {7};
78*4882a593Smuzhiyun static int gpio8_pins[] = {8};
79*4882a593Smuzhiyun static int gpio9_pins[] = {9};
80*4882a593Smuzhiyun static int gpio10_pins[] = {10};
81*4882a593Smuzhiyun static int gpio11_pins[] = {11};
82*4882a593Smuzhiyun static int gpio12_pins[] = {12};
83*4882a593Smuzhiyun static int gpio13_pins[] = {13};
84*4882a593Smuzhiyun static int gpio14_pins[] = {14};
85*4882a593Smuzhiyun static int gpio15_pins[] = {15};
86*4882a593Smuzhiyun static int gpio16_pins[] = {16};
87*4882a593Smuzhiyun static int gpio17_pins[] = {17};
88*4882a593Smuzhiyun static int gpio18_pins[] = {18};
89*4882a593Smuzhiyun static int gpio19_pins[] = {19};
90*4882a593Smuzhiyun static int gpio20_pins[] = {20};
91*4882a593Smuzhiyun static int i2c_pins[] = {19, 20};
92*4882a593Smuzhiyun static int uart_pins[] = {19, 20};
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun #define GROUP_DESC(nm) \
95*4882a593Smuzhiyun { \
96*4882a593Smuzhiyun .name = #nm, \
97*4882a593Smuzhiyun .pins = nm ## _pins, \
98*4882a593Smuzhiyun .num_pins = ARRAY_SIZE(nm ## _pins), \
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun #define GROUP_DESC_CONFIG(nm) \
102*4882a593Smuzhiyun { \
103*4882a593Smuzhiyun .name = #nm, \
104*4882a593Smuzhiyun .pins = nm ## _pins, \
105*4882a593Smuzhiyun .num_pins = ARRAY_SIZE(nm ## _pins), \
106*4882a593Smuzhiyun .configs = nm ## _configs, \
107*4882a593Smuzhiyun .num_configs = ARRAY_SIZE(nm ## _configs), \
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun static const struct config_desc gpio0_configs[] = {
111*4882a593Smuzhiyun { 0x0005, LOCK_EN, 0 },
112*4882a593Smuzhiyun { 0x0048, LOC_MS_EN, 0},
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun static const struct config_desc gpio1_configs[] = {
116*4882a593Smuzhiyun { 0x0005, ERRB_EN, 0 },
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun static const struct config_desc gpio4_configs[] = {
120*4882a593Smuzhiyun { 0x070, SPI_EN, 0 },
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun static const struct config_desc gpio5_configs[] = {
124*4882a593Smuzhiyun { 0x006, RCLKEN, 0 },
125*4882a593Smuzhiyun };
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun static const struct config_desc gpio7_configs[] = {
128*4882a593Smuzhiyun { 0x0002, AUD_TX_EN_X, 0 },
129*4882a593Smuzhiyun { 0x0002, AUD_TX_EN_Y, 0 }
130*4882a593Smuzhiyun };
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun static const struct config_desc gpio8_configs[] = {
133*4882a593Smuzhiyun { 0x0002, AUD_TX_EN_X, 0 },
134*4882a593Smuzhiyun { 0x0002, AUD_TX_EN_Y, 0 }
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun static const struct config_desc gpio9_configs[] = {
138*4882a593Smuzhiyun { 0x0002, AUD_TX_EN_X, 0 },
139*4882a593Smuzhiyun { 0x0002, AUD_TX_EN_Y, 0 }
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun static const struct config_desc gpio10_configs[] = {
143*4882a593Smuzhiyun { 0x0001, IIC_2_EN, 0 },
144*4882a593Smuzhiyun { 0x0003, UART_2_EN, 0 },
145*4882a593Smuzhiyun { 0x0140, AUD_RX_EN, 0},
146*4882a593Smuzhiyun };
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun static const struct config_desc gpio11_configs[] = {
149*4882a593Smuzhiyun { 0x0001, IIC_2_EN, 0 },
150*4882a593Smuzhiyun { 0x0003, UART_2_EN, 0 },
151*4882a593Smuzhiyun { 0x0140, AUD_RX_EN, 0},
152*4882a593Smuzhiyun };
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun static const struct config_desc gpio12_configs[] = {
155*4882a593Smuzhiyun { 0x0140, AUD_RX_EN, 0 },
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun static const struct config_desc gpio13_configs[] = {
159*4882a593Smuzhiyun { 0x0005, PU_LF0, 0 },
160*4882a593Smuzhiyun };
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun static const struct config_desc gpio14_configs[] = {
163*4882a593Smuzhiyun { 0x0005, PU_LF1, 0 },
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun static const struct config_desc gpio15_configs[] = {
167*4882a593Smuzhiyun { 0x0005, PU_LF2, 0 },
168*4882a593Smuzhiyun };
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun static const struct config_desc gpio16_configs[] = {
171*4882a593Smuzhiyun { 0x0005, PU_LF3, 0 },
172*4882a593Smuzhiyun };
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun static const struct config_desc gpio17_configs[] = {
175*4882a593Smuzhiyun { 0x0001, IIC_1_EN, 0 },
176*4882a593Smuzhiyun { 0x0003, UART_1_EN, 0 },
177*4882a593Smuzhiyun };
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun static const struct config_desc gpio18_configs[] = {
180*4882a593Smuzhiyun { 0x0001, IIC_1_EN, 0 },
181*4882a593Smuzhiyun { 0x0003, UART_1_EN, 0 },
182*4882a593Smuzhiyun };
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun static const struct group_desc max96755f_groups[] = {
185*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio0),
186*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio1),
187*4882a593Smuzhiyun GROUP_DESC(gpio2),
188*4882a593Smuzhiyun GROUP_DESC(gpio3),
189*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio4),
190*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio5),
191*4882a593Smuzhiyun GROUP_DESC(gpio6),
192*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio7),
193*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio8),
194*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio9),
195*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio10),
196*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio11),
197*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio12),
198*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio13),
199*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio14),
200*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio15),
201*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio16),
202*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio17),
203*4882a593Smuzhiyun GROUP_DESC_CONFIG(gpio18),
204*4882a593Smuzhiyun GROUP_DESC(gpio19),
205*4882a593Smuzhiyun GROUP_DESC(gpio20),
206*4882a593Smuzhiyun GROUP_DESC(i2c),
207*4882a593Smuzhiyun GROUP_DESC(uart),
208*4882a593Smuzhiyun };
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun static const char *gpio_groups[] = {
211*4882a593Smuzhiyun "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5",
212*4882a593Smuzhiyun "gpio6", "gpio7", "gpio8", "gpio9", "gpio10",
213*4882a593Smuzhiyun "gpio11", "gpio12", "gpio13", "gpio14", "gpio15",
214*4882a593Smuzhiyun "gpio16", "gpio17", "gpio18", "gpio19", "gpio20",
215*4882a593Smuzhiyun };
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun static const char *i2c_groups[] = { "i2c" };
218*4882a593Smuzhiyun static const char *uart_groups[] = { "uart" };
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun #define FUNCTION_DESC(fname, gname) \
221*4882a593Smuzhiyun { \
222*4882a593Smuzhiyun .name = #fname, \
223*4882a593Smuzhiyun .group_names = gname##_groups, \
224*4882a593Smuzhiyun .num_group_names = ARRAY_SIZE(gname##_groups), \
225*4882a593Smuzhiyun } \
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun #define FUNCTION_DESC_GPIO_RX(id) \
228*4882a593Smuzhiyun { \
229*4882a593Smuzhiyun .name = "GPIO_RX_"#id, \
230*4882a593Smuzhiyun .group_names = gpio_groups, \
231*4882a593Smuzhiyun .num_group_names = ARRAY_SIZE(gpio_groups), \
232*4882a593Smuzhiyun .gpio_rx_en = 1, \
233*4882a593Smuzhiyun .gpio_rx_id = id, \
234*4882a593Smuzhiyun } \
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun #define FUNCTION_DESC_GPIO_TX(id) \
237*4882a593Smuzhiyun { \
238*4882a593Smuzhiyun .name = "GPIO_TX_"#id, \
239*4882a593Smuzhiyun .group_names = gpio_groups, \
240*4882a593Smuzhiyun .num_group_names = ARRAY_SIZE(gpio_groups), \
241*4882a593Smuzhiyun .gpio_out_dis = 1, \
242*4882a593Smuzhiyun .gpio_tx_en = 1, \
243*4882a593Smuzhiyun .gpio_tx_id = id \
244*4882a593Smuzhiyun } \
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun #define FUNCTION_DESC_GPIO() \
247*4882a593Smuzhiyun { \
248*4882a593Smuzhiyun .name = "GPIO", \
249*4882a593Smuzhiyun .group_names = gpio_groups, \
250*4882a593Smuzhiyun .num_group_names = ARRAY_SIZE(gpio_groups), \
251*4882a593Smuzhiyun } \
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun static const struct function_desc max96755f_functions[] = {
254*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(0),
255*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(1),
256*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(2),
257*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(3),
258*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(4),
259*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(5),
260*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(6),
261*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(7),
262*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(8),
263*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(9),
264*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(10),
265*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(11),
266*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(12),
267*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(13),
268*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(14),
269*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(15),
270*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(16),
271*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(17),
272*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(18),
273*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(19),
274*4882a593Smuzhiyun FUNCTION_DESC_GPIO_TX(20),
275*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(0),
276*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(1),
277*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(2),
278*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(3),
279*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(4),
280*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(5),
281*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(6),
282*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(7),
283*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(8),
284*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(9),
285*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(10),
286*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(11),
287*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(12),
288*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(13),
289*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(14),
290*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(15),
291*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(16),
292*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(17),
293*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(18),
294*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(19),
295*4882a593Smuzhiyun FUNCTION_DESC_GPIO_RX(20),
296*4882a593Smuzhiyun FUNCTION_DESC_GPIO(),
297*4882a593Smuzhiyun FUNCTION_DESC(I2C, i2c),
298*4882a593Smuzhiyun FUNCTION_DESC(UART, uart),
299*4882a593Smuzhiyun };
300*4882a593Smuzhiyun
max96755f_get_pins_count(struct udevice * dev)301*4882a593Smuzhiyun static int max96755f_get_pins_count(struct udevice *dev)
302*4882a593Smuzhiyun {
303*4882a593Smuzhiyun return ARRAY_SIZE(max96755f_pins);
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun
max96755f_get_pin_name(struct udevice * dev,unsigned int selector)306*4882a593Smuzhiyun static const char *max96755f_get_pin_name(struct udevice *dev,
307*4882a593Smuzhiyun unsigned int selector)
308*4882a593Smuzhiyun {
309*4882a593Smuzhiyun return max96755f_pins[selector].name;
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun
max96755f_pinctrl_get_groups_count(struct udevice * dev)312*4882a593Smuzhiyun static int max96755f_pinctrl_get_groups_count(struct udevice *dev)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun return ARRAY_SIZE(max96755f_groups);
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
max96755f_pinctrl_get_group_name(struct udevice * dev,unsigned int selector)317*4882a593Smuzhiyun static const char *max96755f_pinctrl_get_group_name(struct udevice *dev,
318*4882a593Smuzhiyun unsigned int selector)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun return max96755f_groups[selector].name;
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun
max96755f_pinctrl_get_functions_count(struct udevice * dev)323*4882a593Smuzhiyun static int max96755f_pinctrl_get_functions_count(struct udevice *dev)
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun return ARRAY_SIZE(max96755f_functions);
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun
max96755f_pinctrl_get_function_name(struct udevice * dev,unsigned int selector)328*4882a593Smuzhiyun static const char *max96755f_pinctrl_get_function_name(struct udevice *dev,
329*4882a593Smuzhiyun unsigned int selector)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun return max96755f_functions[selector].name;
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun static int
max96755f_pinmux_set(struct udevice * dev,unsigned int group_selector,unsigned int func_selector)335*4882a593Smuzhiyun max96755f_pinmux_set(struct udevice *dev, unsigned int group_selector,
336*4882a593Smuzhiyun unsigned int func_selector)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun const struct group_desc *grp = &max96755f_groups[group_selector];
339*4882a593Smuzhiyun const struct function_desc *func = &max96755f_functions[func_selector];
340*4882a593Smuzhiyun int i, ret;
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun for (i = 0; i < grp->num_configs; i++) {
343*4882a593Smuzhiyun const struct config_desc *config = &grp->configs[i];
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, config->reg, config->mask,
346*4882a593Smuzhiyun config->val);
347*4882a593Smuzhiyun if (ret < 0)
348*4882a593Smuzhiyun return ret;
349*4882a593Smuzhiyun }
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun for (i = 0; i < grp->num_pins; i++) {
352*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(grp->pins[i]),
353*4882a593Smuzhiyun GPIO_OUT_DIS | GPIO_RX_EN | GPIO_TX_EN,
354*4882a593Smuzhiyun FIELD_PREP(GPIO_OUT_DIS, func->gpio_out_dis) |
355*4882a593Smuzhiyun FIELD_PREP(GPIO_RX_EN, func->gpio_rx_en) |
356*4882a593Smuzhiyun FIELD_PREP(GPIO_TX_EN, func->gpio_tx_en));
357*4882a593Smuzhiyun if (ret < 0)
358*4882a593Smuzhiyun return ret;
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun if (func->gpio_tx_en) {
361*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, GPIO_B_REG(grp->pins[i]),
362*4882a593Smuzhiyun GPIO_TX_ID,
363*4882a593Smuzhiyun FIELD_PREP(GPIO_TX_ID, func->gpio_tx_id));
364*4882a593Smuzhiyun if (ret < 0)
365*4882a593Smuzhiyun return ret;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun if (func->gpio_rx_en) {
369*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent,
370*4882a593Smuzhiyun GPIO_C_REG(grp->pins[i]),
371*4882a593Smuzhiyun GPIO_RX_ID,
372*4882a593Smuzhiyun FIELD_PREP(GPIO_RX_ID, func->gpio_rx_id));
373*4882a593Smuzhiyun if (ret < 0)
374*4882a593Smuzhiyun return ret;
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun }
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun return 0;
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun static const struct pinconf_param max96755f_pinconf_params[] = {
382*4882a593Smuzhiyun { "drive-open-drain", PIN_CONFIG_DRIVE_OPEN_DRAIN, 0 },
383*4882a593Smuzhiyun { "drive-push-pull", PIN_CONFIG_DRIVE_PUSH_PULL, 0 },
384*4882a593Smuzhiyun { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
385*4882a593Smuzhiyun { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 40000 },
386*4882a593Smuzhiyun { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 40000 },
387*4882a593Smuzhiyun };
388*4882a593Smuzhiyun
max96755f_pinconf_set(struct udevice * dev,unsigned int pin,unsigned int param,unsigned int arg)389*4882a593Smuzhiyun static int max96755f_pinconf_set(struct udevice *dev, unsigned int pin,
390*4882a593Smuzhiyun unsigned int param, unsigned int arg)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun u8 res_cfg;
393*4882a593Smuzhiyun int ret;
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun switch (param) {
396*4882a593Smuzhiyun case PIN_CONFIG_DRIVE_OPEN_DRAIN:
397*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, GPIO_B_REG(pin), OUT_TYPE,
398*4882a593Smuzhiyun FIELD_PREP(OUT_TYPE, 0));
399*4882a593Smuzhiyun if (ret < 0)
400*4882a593Smuzhiyun return ret;
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun break;
403*4882a593Smuzhiyun case PIN_CONFIG_DRIVE_PUSH_PULL:
404*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, GPIO_B_REG(pin), OUT_TYPE,
405*4882a593Smuzhiyun FIELD_PREP(OUT_TYPE, 1));
406*4882a593Smuzhiyun if (ret < 0)
407*4882a593Smuzhiyun return ret;
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun break;
410*4882a593Smuzhiyun case PIN_CONFIG_BIAS_DISABLE:
411*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, GPIO_C_REG(pin),
412*4882a593Smuzhiyun PULL_UPDN_SEL,
413*4882a593Smuzhiyun FIELD_PREP(PULL_UPDN_SEL, 0));
414*4882a593Smuzhiyun if (ret < 0)
415*4882a593Smuzhiyun return ret;
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun break;
418*4882a593Smuzhiyun case PIN_CONFIG_BIAS_PULL_UP:
419*4882a593Smuzhiyun switch (arg) {
420*4882a593Smuzhiyun case 40000:
421*4882a593Smuzhiyun res_cfg = 0;
422*4882a593Smuzhiyun break;
423*4882a593Smuzhiyun case 1000000:
424*4882a593Smuzhiyun res_cfg = 1;
425*4882a593Smuzhiyun break;
426*4882a593Smuzhiyun default:
427*4882a593Smuzhiyun return -EINVAL;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(pin), RES_CFG,
431*4882a593Smuzhiyun FIELD_PREP(RES_CFG, res_cfg));
432*4882a593Smuzhiyun if (ret < 0)
433*4882a593Smuzhiyun return ret;
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, GPIO_C_REG(pin),
436*4882a593Smuzhiyun PULL_UPDN_SEL,
437*4882a593Smuzhiyun FIELD_PREP(PULL_UPDN_SEL, 1));
438*4882a593Smuzhiyun if (ret < 0)
439*4882a593Smuzhiyun return ret;
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun break;
442*4882a593Smuzhiyun case PIN_CONFIG_BIAS_PULL_DOWN:
443*4882a593Smuzhiyun switch (arg) {
444*4882a593Smuzhiyun case 40000:
445*4882a593Smuzhiyun res_cfg = 0;
446*4882a593Smuzhiyun break;
447*4882a593Smuzhiyun case 1000000:
448*4882a593Smuzhiyun res_cfg = 1;
449*4882a593Smuzhiyun break;
450*4882a593Smuzhiyun default:
451*4882a593Smuzhiyun return -EINVAL;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(pin), RES_CFG,
455*4882a593Smuzhiyun FIELD_PREP(RES_CFG, res_cfg));
456*4882a593Smuzhiyun if (ret < 0)
457*4882a593Smuzhiyun return ret;
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, GPIO_C_REG(pin),
460*4882a593Smuzhiyun PULL_UPDN_SEL,
461*4882a593Smuzhiyun FIELD_PREP(PULL_UPDN_SEL, 2));
462*4882a593Smuzhiyun if (ret < 0)
463*4882a593Smuzhiyun return ret;
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun break;
466*4882a593Smuzhiyun case PIN_CONFIG_OUTPUT:
467*4882a593Smuzhiyun ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(pin),
468*4882a593Smuzhiyun GPIO_OUT_DIS | GPIO_OUT,
469*4882a593Smuzhiyun FIELD_PREP(GPIO_OUT_DIS, 0) |
470*4882a593Smuzhiyun FIELD_PREP(GPIO_OUT, arg));
471*4882a593Smuzhiyun if (ret < 0)
472*4882a593Smuzhiyun return ret;
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun break;
475*4882a593Smuzhiyun default:
476*4882a593Smuzhiyun dev_err(dev, "unsupported configuration parameter %u\n", param);
477*4882a593Smuzhiyun return -ENOTSUPP;
478*4882a593Smuzhiyun }
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun return 0;
481*4882a593Smuzhiyun }
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun static const struct pinctrl_ops max96755f_pinctrl_ops = {
484*4882a593Smuzhiyun .get_pins_count = max96755f_get_pins_count,
485*4882a593Smuzhiyun .get_pin_name = max96755f_get_pin_name,
486*4882a593Smuzhiyun .get_groups_count = max96755f_pinctrl_get_groups_count,
487*4882a593Smuzhiyun .get_group_name = max96755f_pinctrl_get_group_name,
488*4882a593Smuzhiyun .get_functions_count = max96755f_pinctrl_get_functions_count,
489*4882a593Smuzhiyun .get_function_name = max96755f_pinctrl_get_function_name,
490*4882a593Smuzhiyun .set_state = pinctrl_generic_set_state,
491*4882a593Smuzhiyun .pinmux_set = max96755f_pinmux_set,
492*4882a593Smuzhiyun .pinmux_group_set = max96755f_pinmux_set,
493*4882a593Smuzhiyun .pinconf_num_params = ARRAY_SIZE(max96755f_pinconf_params),
494*4882a593Smuzhiyun .pinconf_params = max96755f_pinconf_params,
495*4882a593Smuzhiyun .pinconf_set = max96755f_pinconf_set,
496*4882a593Smuzhiyun };
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun static const struct udevice_id max96755f_pinctrl_of_match[] = {
499*4882a593Smuzhiyun { .compatible = "maxim,max96755f-pinctrl" },
500*4882a593Smuzhiyun { }
501*4882a593Smuzhiyun };
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun U_BOOT_DRIVER(max96755f_pinctrl) = {
504*4882a593Smuzhiyun .name = "pinctrl-max96755f",
505*4882a593Smuzhiyun .id = UCLASS_PINCTRL,
506*4882a593Smuzhiyun .of_match = max96755f_pinctrl_of_match,
507*4882a593Smuzhiyun .ops = &max96755f_pinctrl_ops,
508*4882a593Smuzhiyun };
509