1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (C) 2018 MediaTek Inc.
4 * Author: Ryder Lee <ryder.lee@mediatek.com>
5 */
6
7 #include <common.h>
8 #include <dm.h>
9 #include <dm/device-internal.h>
10 #include <dm/lists.h>
11 #include <dm/pinctrl.h>
12 #include <asm/io.h>
13 #include <asm-generic/gpio.h>
14 #include <linux/bitops.h>
15
16 #include "pinctrl-mtk-common.h"
17
18 #if CONFIG_IS_ENABLED(PINCONF)
19 /**
20 * struct mtk_drive_desc - the structure that holds the information
21 * of the driving current
22 * @min: the minimum current of this group
23 * @max: the maximum current of this group
24 * @step: the step current of this group
25 * @scal: the weight factor
26 *
27 * formula: output = ((input) / step - 1) * scal
28 */
29 struct mtk_drive_desc {
30 u8 min;
31 u8 max;
32 u8 step;
33 u8 scal;
34 };
35
36 /* The groups of drive strength */
37 static const struct mtk_drive_desc mtk_drive[] = {
38 [DRV_GRP0] = { 4, 16, 4, 1 },
39 [DRV_GRP1] = { 4, 16, 4, 2 },
40 [DRV_GRP2] = { 2, 8, 2, 1 },
41 [DRV_GRP3] = { 2, 8, 2, 2 },
42 [DRV_GRP4] = { 2, 16, 2, 1 },
43 };
44 #endif
45
46 static const char *mtk_pinctrl_dummy_name = "_dummy";
47
mtk_w32(struct udevice * dev,u32 reg,u32 val)48 static void mtk_w32(struct udevice *dev, u32 reg, u32 val)
49 {
50 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
51
52 __raw_writel(val, priv->base + reg);
53 }
54
mtk_r32(struct udevice * dev,u32 reg)55 static u32 mtk_r32(struct udevice *dev, u32 reg)
56 {
57 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
58
59 return __raw_readl(priv->base + reg);
60 }
61
get_count_order(unsigned int count)62 static inline int get_count_order(unsigned int count)
63 {
64 int order;
65
66 order = fls(count) - 1;
67 if (count & (count - 1))
68 order++;
69 return order;
70 }
71
mtk_rmw(struct udevice * dev,u32 reg,u32 mask,u32 set)72 void mtk_rmw(struct udevice *dev, u32 reg, u32 mask, u32 set)
73 {
74 u32 val;
75
76 val = mtk_r32(dev, reg);
77 val &= ~mask;
78 val |= set;
79 mtk_w32(dev, reg, val);
80 }
81
mtk_hw_pin_field_lookup(struct udevice * dev,int pin,const struct mtk_pin_reg_calc * rc,struct mtk_pin_field * pfd)82 static int mtk_hw_pin_field_lookup(struct udevice *dev, int pin,
83 const struct mtk_pin_reg_calc *rc,
84 struct mtk_pin_field *pfd)
85 {
86 const struct mtk_pin_field_calc *c, *e;
87 u32 bits;
88
89 c = rc->range;
90 e = c + rc->nranges;
91
92 while (c < e) {
93 if (pin >= c->s_pin && pin <= c->e_pin)
94 break;
95 c++;
96 }
97
98 if (c >= e)
99 return -EINVAL;
100
101 /* Calculated bits as the overall offset the pin is located at,
102 * if c->fixed is held, that determines the all the pins in the
103 * range use the same field with the s_pin.
104 */
105 bits = c->fixed ? c->s_bit : c->s_bit + (pin - c->s_pin) * (c->x_bits);
106
107 /* Fill pfd from bits. For example 32-bit register applied is assumed
108 * when c->sz_reg is equal to 32.
109 */
110 pfd->offset = c->s_addr + c->x_addrs * (bits / c->sz_reg);
111 pfd->bitpos = bits % c->sz_reg;
112 pfd->mask = (1 << c->x_bits) - 1;
113
114 /* pfd->next is used for indicating that bit wrapping-around happens
115 * which requires the manipulation for bit 0 starting in the next
116 * register to form the complete field read/write.
117 */
118 pfd->next = pfd->bitpos + c->x_bits > c->sz_reg ? c->x_addrs : 0;
119
120 return 0;
121 }
122
mtk_hw_pin_field_get(struct udevice * dev,int pin,int field,struct mtk_pin_field * pfd)123 static int mtk_hw_pin_field_get(struct udevice *dev, int pin,
124 int field, struct mtk_pin_field *pfd)
125 {
126 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
127 const struct mtk_pin_reg_calc *rc;
128
129 if (field < 0 || field >= PINCTRL_PIN_REG_MAX)
130 return -EINVAL;
131
132 if (priv->soc->reg_cal && priv->soc->reg_cal[field].range)
133 rc = &priv->soc->reg_cal[field];
134 else
135 return -EINVAL;
136
137 return mtk_hw_pin_field_lookup(dev, pin, rc, pfd);
138 }
139
mtk_hw_bits_part(struct mtk_pin_field * pf,int * h,int * l)140 static void mtk_hw_bits_part(struct mtk_pin_field *pf, int *h, int *l)
141 {
142 *l = 32 - pf->bitpos;
143 *h = get_count_order(pf->mask) - *l;
144 }
145
mtk_hw_write_cross_field(struct udevice * dev,struct mtk_pin_field * pf,int value)146 static void mtk_hw_write_cross_field(struct udevice *dev,
147 struct mtk_pin_field *pf, int value)
148 {
149 int nbits_l, nbits_h;
150
151 mtk_hw_bits_part(pf, &nbits_h, &nbits_l);
152
153 mtk_rmw(dev, pf->offset, pf->mask << pf->bitpos,
154 (value & pf->mask) << pf->bitpos);
155
156 mtk_rmw(dev, pf->offset + pf->next, BIT(nbits_h) - 1,
157 (value & pf->mask) >> nbits_l);
158 }
159
mtk_hw_read_cross_field(struct udevice * dev,struct mtk_pin_field * pf,int * value)160 static void mtk_hw_read_cross_field(struct udevice *dev,
161 struct mtk_pin_field *pf, int *value)
162 {
163 int nbits_l, nbits_h, h, l;
164
165 mtk_hw_bits_part(pf, &nbits_h, &nbits_l);
166
167 l = (mtk_r32(dev, pf->offset) >> pf->bitpos) & (BIT(nbits_l) - 1);
168 h = (mtk_r32(dev, pf->offset + pf->next)) & (BIT(nbits_h) - 1);
169
170 *value = (h << nbits_l) | l;
171 }
172
mtk_hw_set_value(struct udevice * dev,int pin,int field,int value)173 static int mtk_hw_set_value(struct udevice *dev, int pin, int field,
174 int value)
175 {
176 struct mtk_pin_field pf;
177 int err;
178
179 err = mtk_hw_pin_field_get(dev, pin, field, &pf);
180 if (err)
181 return err;
182
183 if (!pf.next)
184 mtk_rmw(dev, pf.offset, pf.mask << pf.bitpos,
185 (value & pf.mask) << pf.bitpos);
186 else
187 mtk_hw_write_cross_field(dev, &pf, value);
188
189 return 0;
190 }
191
mtk_hw_get_value(struct udevice * dev,int pin,int field,int * value)192 static int mtk_hw_get_value(struct udevice *dev, int pin, int field,
193 int *value)
194 {
195 struct mtk_pin_field pf;
196 int err;
197
198 err = mtk_hw_pin_field_get(dev, pin, field, &pf);
199 if (err)
200 return err;
201
202 if (!pf.next)
203 *value = (mtk_r32(dev, pf.offset) >> pf.bitpos) & pf.mask;
204 else
205 mtk_hw_read_cross_field(dev, &pf, value);
206
207 return 0;
208 }
209
mtk_get_groups_count(struct udevice * dev)210 static int mtk_get_groups_count(struct udevice *dev)
211 {
212 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
213
214 return priv->soc->ngrps;
215 }
216
mtk_get_pin_name(struct udevice * dev,unsigned int selector)217 static const char *mtk_get_pin_name(struct udevice *dev,
218 unsigned int selector)
219 {
220 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
221
222 if (!priv->soc->pins[selector].name)
223 return mtk_pinctrl_dummy_name;
224
225 return priv->soc->pins[selector].name;
226 }
227
mtk_get_pins_count(struct udevice * dev)228 static int mtk_get_pins_count(struct udevice *dev)
229 {
230 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
231
232 return priv->soc->npins;
233 }
234
mtk_get_pin_muxing(struct udevice * dev,unsigned int selector,char * buf,int size)235 static int mtk_get_pin_muxing(struct udevice *dev, unsigned int selector,
236 char *buf, int size)
237 {
238 int val, err;
239
240 err = mtk_hw_get_value(dev, selector, PINCTRL_PIN_REG_MODE, &val);
241 if (err)
242 return err;
243
244 snprintf(buf, size, "Aux Func.%d", val);
245 return 0;
246 }
247
mtk_get_group_name(struct udevice * dev,unsigned int selector)248 static const char *mtk_get_group_name(struct udevice *dev,
249 unsigned int selector)
250 {
251 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
252
253 if (!priv->soc->grps[selector].name)
254 return mtk_pinctrl_dummy_name;
255
256 return priv->soc->grps[selector].name;
257 }
258
mtk_get_functions_count(struct udevice * dev)259 static int mtk_get_functions_count(struct udevice *dev)
260 {
261 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
262
263 return priv->soc->nfuncs;
264 }
265
mtk_get_function_name(struct udevice * dev,unsigned int selector)266 static const char *mtk_get_function_name(struct udevice *dev,
267 unsigned int selector)
268 {
269 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
270
271 if (!priv->soc->funcs[selector].name)
272 return mtk_pinctrl_dummy_name;
273
274 return priv->soc->funcs[selector].name;
275 }
276
mtk_pinmux_group_set(struct udevice * dev,unsigned int group_selector,unsigned int func_selector)277 static int mtk_pinmux_group_set(struct udevice *dev,
278 unsigned int group_selector,
279 unsigned int func_selector)
280 {
281 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
282 const struct mtk_group_desc *grp =
283 &priv->soc->grps[group_selector];
284 int i;
285
286 for (i = 0; i < grp->num_pins; i++) {
287 int *pin_modes = grp->data;
288
289 mtk_hw_set_value(dev, grp->pins[i], PINCTRL_PIN_REG_MODE,
290 pin_modes[i]);
291 }
292
293 return 0;
294 }
295
296 #if CONFIG_IS_ENABLED(PINCONF)
297 static const struct pinconf_param mtk_conf_params[] = {
298 { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
299 { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
300 { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
301 { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
302 { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
303 { "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
304 { "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
305 { "output-enable", PIN_CONFIG_OUTPUT_ENABLE, 1 },
306 { "output-high", PIN_CONFIG_OUTPUT, 1, },
307 { "output-low", PIN_CONFIG_OUTPUT, 0, },
308 { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
309 };
310
311
mtk_pinconf_bias_set_v0(struct udevice * dev,u32 pin,u32 arg,u32 val)312 int mtk_pinconf_bias_set_v0(struct udevice *dev, u32 pin, u32 arg, u32 val)
313 {
314 int err, disable, pullup;
315
316 disable = (arg == PIN_CONFIG_BIAS_DISABLE);
317 pullup = (arg == PIN_CONFIG_BIAS_PULL_UP);
318
319 if (disable) {
320 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PU, 0);
321 if (err)
322 return err;
323 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PD, 0);
324 if (err)
325 return err;
326
327 } else {
328 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PU, pullup);
329 if (err)
330 return err;
331 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PD, !pullup);
332 if (err)
333 return err;
334 }
335
336 return 0;
337 }
338
mtk_pinconf_bias_set_v1(struct udevice * dev,u32 pin,u32 arg,u32 val)339 int mtk_pinconf_bias_set_v1(struct udevice *dev, u32 pin, u32 arg, u32 val)
340 {
341 int err, disable, pullup, r0, r1;
342
343 disable = (arg == PIN_CONFIG_BIAS_DISABLE);
344 pullup = (arg == PIN_CONFIG_BIAS_PULL_UP);
345 r0 = !!(val & 1);
346 r1 = !!(val & 2);
347
348 if (disable) {
349 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PULLEN, 0);
350 if (err)
351 return err;
352 } else {
353 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PULLEN, 1);
354 if (err)
355 return err;
356 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PULLSEL,
357 pullup);
358 if (err)
359 return err;
360 }
361
362 /* Also set PUPD/R0/R1 if the pin has them */
363 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PUPD, !pullup);
364 if (err != -EINVAL) {
365 mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_R0, r0);
366 mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_R1, r1);
367 }
368
369 return 0;
370 }
371
mtk_pinconf_input_enable_v1(struct udevice * dev,u32 pin,u32 arg)372 int mtk_pinconf_input_enable_v1(struct udevice *dev, u32 pin, u32 arg)
373 {
374 int err;
375
376 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_IES, 1);
377 if (err)
378 return err;
379 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_DIR, 0);
380 if (err)
381 return err;
382 return 0;
383 }
384
mtk_pinconf_drive_set_v0(struct udevice * dev,u32 pin,u32 arg)385 int mtk_pinconf_drive_set_v0(struct udevice *dev, u32 pin, u32 arg)
386 {
387 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
388 const struct mtk_pin_desc *desc = &priv->soc->pins[pin];
389 const struct mtk_drive_desc *tb;
390 int err = -ENOTSUPP;
391
392 tb = &mtk_drive[desc->drv_n];
393 /* 4mA when (e8, e4) = (0, 0)
394 * 8mA when (e8, e4) = (0, 1)
395 * 12mA when (e8, e4) = (1, 0)
396 * 16mA when (e8, e4) = (1, 1)
397 */
398 if ((arg >= tb->min && arg <= tb->max) && !(arg % tb->step)) {
399 arg = (arg / tb->step - 1) * tb->scal;
400 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_E4,
401 arg & 0x1);
402 if (err)
403 return err;
404 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_E8,
405 (arg & 0x2) >> 1);
406 if (err)
407 return err;
408 }
409
410 return 0;
411 }
412
413
mtk_pinconf_drive_set_v1(struct udevice * dev,u32 pin,u32 arg)414 int mtk_pinconf_drive_set_v1(struct udevice *dev, u32 pin, u32 arg)
415 {
416 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
417 const struct mtk_pin_desc *desc = &priv->soc->pins[pin];
418 const struct mtk_drive_desc *tb;
419 int err = -ENOTSUPP;
420
421 tb = &mtk_drive[desc->drv_n];
422 if ((arg >= tb->min && arg <= tb->max) && !(arg % tb->step)) {
423 arg = (arg / tb->step - 1) * tb->scal;
424 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_DRV, arg);
425 if (err)
426 return err;
427 }
428
429 return 0;
430 }
431
mtk_pinconf_set(struct udevice * dev,unsigned int pin,unsigned int param,unsigned int arg)432 static int mtk_pinconf_set(struct udevice *dev, unsigned int pin,
433 unsigned int param, unsigned int arg)
434 {
435 int err = 0;
436 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
437 int rev = priv->soc->rev;
438
439 switch (param) {
440 case PIN_CONFIG_BIAS_DISABLE:
441 case PIN_CONFIG_BIAS_PULL_UP:
442 case PIN_CONFIG_BIAS_PULL_DOWN:
443 if (rev == MTK_PINCTRL_V0)
444 err = mtk_pinconf_bias_set_v0(dev, pin, param, arg);
445 else
446 err = mtk_pinconf_bias_set_v1(dev, pin, param, arg);
447 if (err)
448 goto err;
449 break;
450 case PIN_CONFIG_OUTPUT_ENABLE:
451 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_SMT, 0);
452 if (err)
453 goto err;
454 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_DIR, 1);
455 if (err)
456 goto err;
457 break;
458 case PIN_CONFIG_INPUT_ENABLE:
459 if (rev == MTK_PINCTRL_V1)
460 err = mtk_pinconf_input_enable_v1(dev, pin, param);
461 if (err)
462 goto err;
463 break;
464 case PIN_CONFIG_OUTPUT:
465 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_DIR, 1);
466 if (err)
467 goto err;
468
469 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_DO, arg);
470 if (err)
471 goto err;
472 break;
473 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
474 /* arg = 1: Input mode & SMT enable ;
475 * arg = 0: Output mode & SMT disable
476 */
477 arg = arg ? 2 : 1;
478 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_DIR,
479 arg & 1);
480 if (err)
481 goto err;
482
483 err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_SMT,
484 !!(arg & 2));
485 if (err)
486 goto err;
487 break;
488 case PIN_CONFIG_DRIVE_STRENGTH:
489 if (rev == MTK_PINCTRL_V0)
490 err = mtk_pinconf_drive_set_v0(dev, pin, arg);
491 else
492 err = mtk_pinconf_drive_set_v1(dev, pin, arg);
493 if (err)
494 goto err;
495 break;
496
497 default:
498 err = -ENOTSUPP;
499 }
500
501 err:
502
503 return err;
504 }
505
mtk_pinconf_group_set(struct udevice * dev,unsigned int group_selector,unsigned int param,unsigned int arg)506 static int mtk_pinconf_group_set(struct udevice *dev,
507 unsigned int group_selector,
508 unsigned int param, unsigned int arg)
509 {
510 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
511 const struct mtk_group_desc *grp =
512 &priv->soc->grps[group_selector];
513 int i, ret;
514
515 for (i = 0; i < grp->num_pins; i++) {
516 ret = mtk_pinconf_set(dev, grp->pins[i], param, arg);
517 if (ret)
518 return ret;
519 }
520
521 return 0;
522 }
523 #endif
524
525 const struct pinctrl_ops mtk_pinctrl_ops = {
526 .get_pins_count = mtk_get_pins_count,
527 .get_pin_name = mtk_get_pin_name,
528 .get_pin_muxing = mtk_get_pin_muxing,
529 .get_groups_count = mtk_get_groups_count,
530 .get_group_name = mtk_get_group_name,
531 .get_functions_count = mtk_get_functions_count,
532 .get_function_name = mtk_get_function_name,
533 .pinmux_group_set = mtk_pinmux_group_set,
534 #if CONFIG_IS_ENABLED(PINCONF)
535 .pinconf_num_params = ARRAY_SIZE(mtk_conf_params),
536 .pinconf_params = mtk_conf_params,
537 .pinconf_set = mtk_pinconf_set,
538 .pinconf_group_set = mtk_pinconf_group_set,
539 #endif
540 .set_state = pinctrl_generic_set_state,
541 };
542
543 #if CONFIG_IS_ENABLED(DM_GPIO) || \
544 (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_GPIO_SUPPORT))
mtk_gpio_get(struct udevice * dev,unsigned int off)545 static int mtk_gpio_get(struct udevice *dev, unsigned int off)
546 {
547 int val, err;
548
549 err = mtk_hw_get_value(dev->parent, off, PINCTRL_PIN_REG_DI, &val);
550 if (err)
551 return err;
552
553 return !!val;
554 }
555
mtk_gpio_set(struct udevice * dev,unsigned int off,int val)556 static int mtk_gpio_set(struct udevice *dev, unsigned int off, int val)
557 {
558 return mtk_hw_set_value(dev->parent, off, PINCTRL_PIN_REG_DO, !!val);
559 }
560
mtk_gpio_get_direction(struct udevice * dev,unsigned int off)561 static int mtk_gpio_get_direction(struct udevice *dev, unsigned int off)
562 {
563 int val, err;
564
565 err = mtk_hw_get_value(dev->parent, off, PINCTRL_PIN_REG_DIR, &val);
566 if (err)
567 return err;
568
569 return val ? GPIOF_OUTPUT : GPIOF_INPUT;
570 }
571
mtk_gpio_direction_input(struct udevice * dev,unsigned int off)572 static int mtk_gpio_direction_input(struct udevice *dev, unsigned int off)
573 {
574 return mtk_hw_set_value(dev->parent, off, PINCTRL_PIN_REG_DIR, 0);
575 }
576
mtk_gpio_direction_output(struct udevice * dev,unsigned int off,int val)577 static int mtk_gpio_direction_output(struct udevice *dev,
578 unsigned int off, int val)
579 {
580 mtk_gpio_set(dev, off, val);
581
582 /* And set the requested value */
583 return mtk_hw_set_value(dev->parent, off, PINCTRL_PIN_REG_DIR, 1);
584 }
585
mtk_gpio_request(struct udevice * dev,unsigned int off,const char * label)586 static int mtk_gpio_request(struct udevice *dev, unsigned int off,
587 const char *label)
588 {
589 struct mtk_pinctrl_priv *priv = dev_get_priv(dev->parent);
590
591 return mtk_hw_set_value(dev->parent, off, PINCTRL_PIN_REG_MODE,
592 priv->soc->gpio_mode);
593 }
594
mtk_gpio_probe(struct udevice * dev)595 static int mtk_gpio_probe(struct udevice *dev)
596 {
597 struct mtk_pinctrl_priv *priv = dev_get_priv(dev->parent);
598 struct gpio_dev_priv *uc_priv;
599
600 uc_priv = dev_get_uclass_priv(dev);
601 uc_priv->bank_name = priv->soc->name;
602 uc_priv->gpio_count = priv->soc->npins;
603
604 return 0;
605 }
606
607 static const struct dm_gpio_ops mtk_gpio_ops = {
608 .request = mtk_gpio_request,
609 .set_value = mtk_gpio_set,
610 .get_value = mtk_gpio_get,
611 .get_function = mtk_gpio_get_direction,
612 .direction_input = mtk_gpio_direction_input,
613 .direction_output = mtk_gpio_direction_output,
614 };
615
616 static struct driver mtk_gpio_driver = {
617 .name = "mediatek_gpio",
618 .id = UCLASS_GPIO,
619 .probe = mtk_gpio_probe,
620 .ops = &mtk_gpio_ops,
621 };
622
mtk_gpiochip_register(struct udevice * parent)623 static int mtk_gpiochip_register(struct udevice *parent)
624 {
625 struct uclass_driver *drv;
626 struct udevice *dev;
627 int ret;
628 ofnode node;
629
630 drv = lists_uclass_lookup(UCLASS_GPIO);
631 if (!drv)
632 return -ENOENT;
633
634 ret = -ENOENT;
635 dev_for_each_subnode(node, parent)
636 if (ofnode_read_bool(node, "gpio-controller")) {
637 ret = 0;
638 break;
639 }
640
641 if (ret)
642 return ret;
643
644 ret = device_bind_with_driver_data(parent, &mtk_gpio_driver,
645 "mediatek_gpio", 0, node,
646 &dev);
647 if (ret)
648 return ret;
649
650 return 0;
651 }
652 #endif
653
mtk_pinctrl_common_probe(struct udevice * dev,struct mtk_pinctrl_soc * soc)654 int mtk_pinctrl_common_probe(struct udevice *dev,
655 struct mtk_pinctrl_soc *soc)
656 {
657 struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
658 int ret = 0;
659
660 priv->base = dev_read_addr_ptr(dev);
661 if (!priv->base)
662 return -EINVAL;
663
664 priv->soc = soc;
665
666 #if CONFIG_IS_ENABLED(DM_GPIO) || \
667 (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_GPIO_SUPPORT))
668 ret = mtk_gpiochip_register(dev);
669 #endif
670
671 return ret;
672 }
673