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