Merge tag 'v5.7-rc7' into perf/core, to pick up fixes
[linux-2.6-microblaze.git] / drivers / pinctrl / mediatek / pinctrl-moore.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * MediaTek Pinctrl Moore Driver, which implement the generic dt-binding
4  * pinctrl-bindings.txt for MediaTek SoC.
5  *
6  * Copyright (C) 2017-2018 MediaTek Inc.
7  * Author: Sean Wang <sean.wang@mediatek.com>
8  *
9  */
10
11 #include <linux/gpio/driver.h>
12 #include "pinctrl-moore.h"
13
14 #define PINCTRL_PINCTRL_DEV             KBUILD_MODNAME
15
16 /* Custom pinconf parameters */
17 #define MTK_PIN_CONFIG_TDSEL    (PIN_CONFIG_END + 1)
18 #define MTK_PIN_CONFIG_RDSEL    (PIN_CONFIG_END + 2)
19 #define MTK_PIN_CONFIG_PU_ADV   (PIN_CONFIG_END + 3)
20 #define MTK_PIN_CONFIG_PD_ADV   (PIN_CONFIG_END + 4)
21
22 static const struct pinconf_generic_params mtk_custom_bindings[] = {
23         {"mediatek,tdsel",      MTK_PIN_CONFIG_TDSEL,           0},
24         {"mediatek,rdsel",      MTK_PIN_CONFIG_RDSEL,           0},
25         {"mediatek,pull-up-adv", MTK_PIN_CONFIG_PU_ADV,         1},
26         {"mediatek,pull-down-adv", MTK_PIN_CONFIG_PD_ADV,       1},
27 };
28
29 #ifdef CONFIG_DEBUG_FS
30 static const struct pin_config_item mtk_conf_items[] = {
31         PCONFDUMP(MTK_PIN_CONFIG_TDSEL, "tdsel", NULL, true),
32         PCONFDUMP(MTK_PIN_CONFIG_RDSEL, "rdsel", NULL, true),
33         PCONFDUMP(MTK_PIN_CONFIG_PU_ADV, "pu-adv", NULL, true),
34         PCONFDUMP(MTK_PIN_CONFIG_PD_ADV, "pd-adv", NULL, true),
35 };
36 #endif
37
38 static int mtk_pinmux_set_mux(struct pinctrl_dev *pctldev,
39                               unsigned int selector, unsigned int group)
40 {
41         struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
42         struct function_desc *func;
43         struct group_desc *grp;
44         int i;
45
46         func = pinmux_generic_get_function(pctldev, selector);
47         if (!func)
48                 return -EINVAL;
49
50         grp = pinctrl_generic_get_group(pctldev, group);
51         if (!grp)
52                 return -EINVAL;
53
54         dev_dbg(pctldev->dev, "enable function %s group %s\n",
55                 func->name, grp->name);
56
57         for (i = 0; i < grp->num_pins; i++) {
58                 const struct mtk_pin_desc *desc;
59                 int *pin_modes = grp->data;
60                 int pin = grp->pins[i];
61
62                 desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin];
63
64                 mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE,
65                                  pin_modes[i]);
66         }
67
68         return 0;
69 }
70
71 static int mtk_pinmux_gpio_request_enable(struct pinctrl_dev *pctldev,
72                                           struct pinctrl_gpio_range *range,
73                                           unsigned int pin)
74 {
75         struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
76         const struct mtk_pin_desc *desc;
77
78         desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin];
79
80         return mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE,
81                                 hw->soc->gpio_m);
82 }
83
84 static int mtk_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
85                                          struct pinctrl_gpio_range *range,
86                                          unsigned int pin, bool input)
87 {
88         struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
89         const struct mtk_pin_desc *desc;
90
91         desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin];
92
93         /* hardware would take 0 as input direction */
94         return mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR, !input);
95 }
96
97 static int mtk_pinconf_get(struct pinctrl_dev *pctldev,
98                            unsigned int pin, unsigned long *config)
99 {
100         struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
101         u32 param = pinconf_to_config_param(*config);
102         int val, val2, err, reg, ret = 1;
103         const struct mtk_pin_desc *desc;
104
105         desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin];
106
107         switch (param) {
108         case PIN_CONFIG_BIAS_DISABLE:
109                 if (hw->soc->bias_disable_get) {
110                         err = hw->soc->bias_disable_get(hw, desc, &ret);
111                         if (err)
112                                 return err;
113                 } else {
114                         return -ENOTSUPP;
115                 }
116                 break;
117         case PIN_CONFIG_BIAS_PULL_UP:
118                 if (hw->soc->bias_get) {
119                         err = hw->soc->bias_get(hw, desc, 1, &ret);
120                         if (err)
121                                 return err;
122                 } else {
123                         return -ENOTSUPP;
124                 }
125                 break;
126         case PIN_CONFIG_BIAS_PULL_DOWN:
127                 if (hw->soc->bias_get) {
128                         err = hw->soc->bias_get(hw, desc, 0, &ret);
129                         if (err)
130                                 return err;
131                 } else {
132                         return -ENOTSUPP;
133                 }
134                 break;
135         case PIN_CONFIG_SLEW_RATE:
136                 err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_SR, &val);
137                 if (err)
138                         return err;
139
140                 if (!val)
141                         return -EINVAL;
142
143                 break;
144         case PIN_CONFIG_INPUT_ENABLE:
145         case PIN_CONFIG_OUTPUT_ENABLE:
146                 err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_DIR, &val);
147                 if (err)
148                         return err;
149
150                 /* HW takes input mode as zero; output mode as non-zero */
151                 if ((val && param == PIN_CONFIG_INPUT_ENABLE) ||
152                     (!val && param == PIN_CONFIG_OUTPUT_ENABLE))
153                         return -EINVAL;
154
155                 break;
156         case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
157                 err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_DIR, &val);
158                 if (err)
159                         return err;
160
161                 err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_SMT, &val2);
162                 if (err)
163                         return err;
164
165                 if (val || !val2)
166                         return -EINVAL;
167
168                 break;
169         case PIN_CONFIG_DRIVE_STRENGTH:
170                 if (hw->soc->drive_get) {
171                         err = hw->soc->drive_get(hw, desc, &ret);
172                         if (err)
173                                 return err;
174                 } else {
175                         err = -ENOTSUPP;
176                 }
177                 break;
178         case MTK_PIN_CONFIG_TDSEL:
179         case MTK_PIN_CONFIG_RDSEL:
180                 reg = (param == MTK_PIN_CONFIG_TDSEL) ?
181                        PINCTRL_PIN_REG_TDSEL : PINCTRL_PIN_REG_RDSEL;
182
183                 err = mtk_hw_get_value(hw, desc, reg, &val);
184                 if (err)
185                         return err;
186
187                 ret = val;
188
189                 break;
190         case MTK_PIN_CONFIG_PU_ADV:
191         case MTK_PIN_CONFIG_PD_ADV:
192                 if (hw->soc->adv_pull_get) {
193                         bool pullup;
194
195                         pullup = param == MTK_PIN_CONFIG_PU_ADV;
196                         err = hw->soc->adv_pull_get(hw, desc, pullup, &ret);
197                         if (err)
198                                 return err;
199                 } else {
200                         return -ENOTSUPP;
201                 }
202                 break;
203         default:
204                 return -ENOTSUPP;
205         }
206
207         *config = pinconf_to_config_packed(param, ret);
208
209         return 0;
210 }
211
212 static int mtk_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
213                            unsigned long *configs, unsigned int num_configs)
214 {
215         struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
216         const struct mtk_pin_desc *desc;
217         u32 reg, param, arg;
218         int cfg, err = 0;
219
220         desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin];
221
222         for (cfg = 0; cfg < num_configs; cfg++) {
223                 param = pinconf_to_config_param(configs[cfg]);
224                 arg = pinconf_to_config_argument(configs[cfg]);
225
226                 switch (param) {
227                 case PIN_CONFIG_BIAS_DISABLE:
228                         if (hw->soc->bias_disable_set) {
229                                 err = hw->soc->bias_disable_set(hw, desc);
230                                 if (err)
231                                         return err;
232                         } else {
233                                 return -ENOTSUPP;
234                         }
235                         break;
236                 case PIN_CONFIG_BIAS_PULL_UP:
237                         if (hw->soc->bias_set) {
238                                 err = hw->soc->bias_set(hw, desc, 1);
239                                 if (err)
240                                         return err;
241                         } else {
242                                 return -ENOTSUPP;
243                         }
244                         break;
245                 case PIN_CONFIG_BIAS_PULL_DOWN:
246                         if (hw->soc->bias_set) {
247                                 err = hw->soc->bias_set(hw, desc, 0);
248                                 if (err)
249                                         return err;
250                         } else {
251                                 return -ENOTSUPP;
252                         }
253                         break;
254                 case PIN_CONFIG_OUTPUT_ENABLE:
255                         err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_SMT,
256                                                MTK_DISABLE);
257                         if (err)
258                                 goto err;
259
260                         err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR,
261                                                MTK_OUTPUT);
262                         if (err)
263                                 goto err;
264                         break;
265                 case PIN_CONFIG_INPUT_ENABLE:
266
267                         if (hw->soc->ies_present) {
268                                 mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_IES,
269                                                  MTK_ENABLE);
270                         }
271
272                         err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR,
273                                                MTK_INPUT);
274                         if (err)
275                                 goto err;
276                         break;
277                 case PIN_CONFIG_SLEW_RATE:
278                         err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_SR,
279                                                arg);
280                         if (err)
281                                 goto err;
282
283                         break;
284                 case PIN_CONFIG_OUTPUT:
285                         err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR,
286                                                MTK_OUTPUT);
287                         if (err)
288                                 goto err;
289
290                         err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DO,
291                                                arg);
292                         if (err)
293                                 goto err;
294                         break;
295                 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
296                         /* arg = 1: Input mode & SMT enable ;
297                          * arg = 0: Output mode & SMT disable
298                          */
299                         arg = arg ? 2 : 1;
300                         err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DIR,
301                                                arg & 1);
302                         if (err)
303                                 goto err;
304
305                         err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_SMT,
306                                                !!(arg & 2));
307                         if (err)
308                                 goto err;
309                         break;
310                 case PIN_CONFIG_DRIVE_STRENGTH:
311                         if (hw->soc->drive_set) {
312                                 err = hw->soc->drive_set(hw, desc, arg);
313                                 if (err)
314                                         return err;
315                         } else {
316                                 err = -ENOTSUPP;
317                         }
318                         break;
319                 case MTK_PIN_CONFIG_TDSEL:
320                 case MTK_PIN_CONFIG_RDSEL:
321                         reg = (param == MTK_PIN_CONFIG_TDSEL) ?
322                                PINCTRL_PIN_REG_TDSEL : PINCTRL_PIN_REG_RDSEL;
323
324                         err = mtk_hw_set_value(hw, desc, reg, arg);
325                         if (err)
326                                 goto err;
327                         break;
328                 case MTK_PIN_CONFIG_PU_ADV:
329                 case MTK_PIN_CONFIG_PD_ADV:
330                         if (hw->soc->adv_pull_set) {
331                                 bool pullup;
332
333                                 pullup = param == MTK_PIN_CONFIG_PU_ADV;
334                                 err = hw->soc->adv_pull_set(hw, desc, pullup,
335                                                             arg);
336                                 if (err)
337                                         return err;
338                         } else {
339                                 return -ENOTSUPP;
340                         }
341                         break;
342                 default:
343                         err = -ENOTSUPP;
344                 }
345         }
346 err:
347         return err;
348 }
349
350 static int mtk_pinconf_group_get(struct pinctrl_dev *pctldev,
351                                  unsigned int group, unsigned long *config)
352 {
353         const unsigned int *pins;
354         unsigned int i, npins, old = 0;
355         int ret;
356
357         ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
358         if (ret)
359                 return ret;
360
361         for (i = 0; i < npins; i++) {
362                 if (mtk_pinconf_get(pctldev, pins[i], config))
363                         return -ENOTSUPP;
364
365                 /* configs do not match between two pins */
366                 if (i && old != *config)
367                         return -ENOTSUPP;
368
369                 old = *config;
370         }
371
372         return 0;
373 }
374
375 static int mtk_pinconf_group_set(struct pinctrl_dev *pctldev,
376                                  unsigned int group, unsigned long *configs,
377                                  unsigned int num_configs)
378 {
379         const unsigned int *pins;
380         unsigned int i, npins;
381         int ret;
382
383         ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
384         if (ret)
385                 return ret;
386
387         for (i = 0; i < npins; i++) {
388                 ret = mtk_pinconf_set(pctldev, pins[i], configs, num_configs);
389                 if (ret)
390                         return ret;
391         }
392
393         return 0;
394 }
395
396 static const struct pinctrl_ops mtk_pctlops = {
397         .get_groups_count = pinctrl_generic_get_group_count,
398         .get_group_name = pinctrl_generic_get_group_name,
399         .get_group_pins = pinctrl_generic_get_group_pins,
400         .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
401         .dt_free_map = pinconf_generic_dt_free_map,
402 };
403
404 static const struct pinmux_ops mtk_pmxops = {
405         .get_functions_count = pinmux_generic_get_function_count,
406         .get_function_name = pinmux_generic_get_function_name,
407         .get_function_groups = pinmux_generic_get_function_groups,
408         .set_mux = mtk_pinmux_set_mux,
409         .gpio_request_enable = mtk_pinmux_gpio_request_enable,
410         .gpio_set_direction = mtk_pinmux_gpio_set_direction,
411         .strict = true,
412 };
413
414 static const struct pinconf_ops mtk_confops = {
415         .is_generic = true,
416         .pin_config_get = mtk_pinconf_get,
417         .pin_config_set = mtk_pinconf_set,
418         .pin_config_group_get = mtk_pinconf_group_get,
419         .pin_config_group_set = mtk_pinconf_group_set,
420         .pin_config_config_dbg_show = pinconf_generic_dump_config,
421 };
422
423 static struct pinctrl_desc mtk_desc = {
424         .name = PINCTRL_PINCTRL_DEV,
425         .pctlops = &mtk_pctlops,
426         .pmxops = &mtk_pmxops,
427         .confops = &mtk_confops,
428         .owner = THIS_MODULE,
429 };
430
431 static int mtk_gpio_get(struct gpio_chip *chip, unsigned int gpio)
432 {
433         struct mtk_pinctrl *hw = gpiochip_get_data(chip);
434         const struct mtk_pin_desc *desc;
435         int value, err;
436
437         desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio];
438
439         err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_DI, &value);
440         if (err)
441                 return err;
442
443         return !!value;
444 }
445
446 static void mtk_gpio_set(struct gpio_chip *chip, unsigned int gpio, int value)
447 {
448         struct mtk_pinctrl *hw = gpiochip_get_data(chip);
449         const struct mtk_pin_desc *desc;
450
451         desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio];
452
453         mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_DO, !!value);
454 }
455
456 static int mtk_gpio_direction_input(struct gpio_chip *chip, unsigned int gpio)
457 {
458         return pinctrl_gpio_direction_input(chip->base + gpio);
459 }
460
461 static int mtk_gpio_direction_output(struct gpio_chip *chip, unsigned int gpio,
462                                      int value)
463 {
464         mtk_gpio_set(chip, gpio, value);
465
466         return pinctrl_gpio_direction_output(chip->base + gpio);
467 }
468
469 static int mtk_gpio_to_irq(struct gpio_chip *chip, unsigned int offset)
470 {
471         struct mtk_pinctrl *hw = gpiochip_get_data(chip);
472         const struct mtk_pin_desc *desc;
473
474         if (!hw->eint)
475                 return -ENOTSUPP;
476
477         desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset];
478
479         if (desc->eint.eint_n == (u16)EINT_NA)
480                 return -ENOTSUPP;
481
482         return mtk_eint_find_irq(hw->eint, desc->eint.eint_n);
483 }
484
485 static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
486                                unsigned long config)
487 {
488         struct mtk_pinctrl *hw = gpiochip_get_data(chip);
489         const struct mtk_pin_desc *desc;
490         u32 debounce;
491
492         desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset];
493
494         if (!hw->eint ||
495             pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE ||
496             desc->eint.eint_n == (u16)EINT_NA)
497                 return -ENOTSUPP;
498
499         debounce = pinconf_to_config_argument(config);
500
501         return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, debounce);
502 }
503
504 static int mtk_build_gpiochip(struct mtk_pinctrl *hw, struct device_node *np)
505 {
506         struct gpio_chip *chip = &hw->chip;
507         int ret;
508
509         chip->label             = PINCTRL_PINCTRL_DEV;
510         chip->parent            = hw->dev;
511         chip->request           = gpiochip_generic_request;
512         chip->free              = gpiochip_generic_free;
513         chip->direction_input   = mtk_gpio_direction_input;
514         chip->direction_output  = mtk_gpio_direction_output;
515         chip->get               = mtk_gpio_get;
516         chip->set               = mtk_gpio_set;
517         chip->to_irq            = mtk_gpio_to_irq,
518         chip->set_config        = mtk_gpio_set_config,
519         chip->base              = -1;
520         chip->ngpio             = hw->soc->npins;
521         chip->of_node           = np;
522         chip->of_gpio_n_cells   = 2;
523
524         ret = gpiochip_add_data(chip, hw);
525         if (ret < 0)
526                 return ret;
527
528         /* Just for backward compatible for these old pinctrl nodes without
529          * "gpio-ranges" property. Otherwise, called directly from a
530          * DeviceTree-supported pinctrl driver is DEPRECATED.
531          * Please see Section 2.1 of
532          * Documentation/devicetree/bindings/gpio/gpio.txt on how to
533          * bind pinctrl and gpio drivers via the "gpio-ranges" property.
534          */
535         if (!of_find_property(np, "gpio-ranges", NULL)) {
536                 ret = gpiochip_add_pin_range(chip, dev_name(hw->dev), 0, 0,
537                                              chip->ngpio);
538                 if (ret < 0) {
539                         gpiochip_remove(chip);
540                         return ret;
541                 }
542         }
543
544         return 0;
545 }
546
547 static int mtk_build_groups(struct mtk_pinctrl *hw)
548 {
549         int err, i;
550
551         for (i = 0; i < hw->soc->ngrps; i++) {
552                 const struct group_desc *group = hw->soc->grps + i;
553
554                 err = pinctrl_generic_add_group(hw->pctrl, group->name,
555                                                 group->pins, group->num_pins,
556                                                 group->data);
557                 if (err < 0) {
558                         dev_err(hw->dev, "Failed to register group %s\n",
559                                 group->name);
560                         return err;
561                 }
562         }
563
564         return 0;
565 }
566
567 static int mtk_build_functions(struct mtk_pinctrl *hw)
568 {
569         int i, err;
570
571         for (i = 0; i < hw->soc->nfuncs ; i++) {
572                 const struct function_desc *func = hw->soc->funcs + i;
573
574                 err = pinmux_generic_add_function(hw->pctrl, func->name,
575                                                   func->group_names,
576                                                   func->num_group_names,
577                                                   func->data);
578                 if (err < 0) {
579                         dev_err(hw->dev, "Failed to register function %s\n",
580                                 func->name);
581                         return err;
582                 }
583         }
584
585         return 0;
586 }
587
588 int mtk_moore_pinctrl_probe(struct platform_device *pdev,
589                             const struct mtk_pin_soc *soc)
590 {
591         struct pinctrl_pin_desc *pins;
592         struct resource *res;
593         struct mtk_pinctrl *hw;
594         int err, i;
595
596         hw = devm_kzalloc(&pdev->dev, sizeof(*hw), GFP_KERNEL);
597         if (!hw)
598                 return -ENOMEM;
599
600         hw->soc = soc;
601         hw->dev = &pdev->dev;
602
603         if (!hw->soc->nbase_names) {
604                 dev_err(&pdev->dev,
605                         "SoC should be assigned at least one register base\n");
606                 return -EINVAL;
607         }
608
609         hw->base = devm_kmalloc_array(&pdev->dev, hw->soc->nbase_names,
610                                       sizeof(*hw->base), GFP_KERNEL);
611         if (!hw->base)
612                 return -ENOMEM;
613
614         for (i = 0; i < hw->soc->nbase_names; i++) {
615                 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
616                                                    hw->soc->base_names[i]);
617                 if (!res) {
618                         dev_err(&pdev->dev, "missing IO resource\n");
619                         return -ENXIO;
620                 }
621
622                 hw->base[i] = devm_ioremap_resource(&pdev->dev, res);
623                 if (IS_ERR(hw->base[i]))
624                         return PTR_ERR(hw->base[i]);
625         }
626
627         hw->nbase = hw->soc->nbase_names;
628
629         /* Copy from internal struct mtk_pin_desc to register to the core */
630         pins = devm_kmalloc_array(&pdev->dev, hw->soc->npins, sizeof(*pins),
631                                   GFP_KERNEL);
632         if (!pins)
633                 return -ENOMEM;
634
635         for (i = 0; i < hw->soc->npins; i++) {
636                 pins[i].number = hw->soc->pins[i].number;
637                 pins[i].name = hw->soc->pins[i].name;
638         }
639
640         /* Setup pins descriptions per SoC types */
641         mtk_desc.pins = (const struct pinctrl_pin_desc *)pins;
642         mtk_desc.npins = hw->soc->npins;
643         mtk_desc.num_custom_params = ARRAY_SIZE(mtk_custom_bindings);
644         mtk_desc.custom_params = mtk_custom_bindings;
645 #ifdef CONFIG_DEBUG_FS
646         mtk_desc.custom_conf_items = mtk_conf_items;
647 #endif
648
649         err = devm_pinctrl_register_and_init(&pdev->dev, &mtk_desc, hw,
650                                              &hw->pctrl);
651         if (err)
652                 return err;
653
654         /* Setup groups descriptions per SoC types */
655         err = mtk_build_groups(hw);
656         if (err) {
657                 dev_err(&pdev->dev, "Failed to build groups\n");
658                 return err;
659         }
660
661         /* Setup functions descriptions per SoC types */
662         err = mtk_build_functions(hw);
663         if (err) {
664                 dev_err(&pdev->dev, "Failed to build functions\n");
665                 return err;
666         }
667
668         /* For able to make pinctrl_claim_hogs, we must not enable pinctrl
669          * until all groups and functions are being added one.
670          */
671         err = pinctrl_enable(hw->pctrl);
672         if (err)
673                 return err;
674
675         err = mtk_build_eint(hw, pdev);
676         if (err)
677                 dev_warn(&pdev->dev,
678                          "Failed to add EINT, but pinctrl still can work\n");
679
680         /* Build gpiochip should be after pinctrl_enable is done */
681         err = mtk_build_gpiochip(hw, pdev->dev.of_node);
682         if (err) {
683                 dev_err(&pdev->dev, "Failed to add gpio_chip\n");
684                 return err;
685         }
686
687         platform_set_drvdata(pdev, hw);
688
689         return 0;
690 }