root/drivers/pinctrl/mediatek/pinctrl-moore.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mtk_pinmux_set_mux
  2. mtk_pinmux_gpio_request_enable
  3. mtk_pinmux_gpio_set_direction
  4. mtk_pinconf_get
  5. mtk_pinconf_set
  6. mtk_pinconf_group_get
  7. mtk_pinconf_group_set
  8. mtk_gpio_get
  9. mtk_gpio_set
  10. mtk_gpio_direction_input
  11. mtk_gpio_direction_output
  12. mtk_gpio_to_irq
  13. mtk_gpio_set_config
  14. mtk_build_gpiochip
  15. mtk_build_groups
  16. mtk_build_functions
  17. mtk_moore_pinctrl_probe

   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 }

/* [<][>][^][v][top][bottom][index][help] */