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