xref: /OK3568_Linux_fs/u-boot/drivers/pinctrl/pinctrl-max96755f.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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