uboot/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * U-Boot Marvell 37xx SoC pinctrl driver
   4 *
   5 * Copyright (C) 2017 Stefan Roese <sr@denx.de>
   6 *
   7 * This driver is based on the Linux driver version, which is:
   8 * Copyright (C) 2017 Marvell
   9 * Gregory CLEMENT <gregory.clement@free-electrons.com>
  10 *
  11 * Additionally parts are derived from the Meson U-Boot pinctrl driver,
  12 * which is:
  13 * (C) Copyright 2016 - Beniamino Galvani <b.galvani@gmail.com>
  14 * Based on code from Linux kernel:
  15 * Copyright (C) 2016 Endless Mobile, Inc.
  16 * https://spdx.org/licenses
  17 */
  18
  19#include <common.h>
  20#include <config.h>
  21#include <dm.h>
  22#include <dm/device-internal.h>
  23#include <dm/lists.h>
  24#include <dm/pinctrl.h>
  25#include <dm/root.h>
  26#include <errno.h>
  27#include <fdtdec.h>
  28#include <regmap.h>
  29#include <asm/gpio.h>
  30#include <asm/system.h>
  31#include <asm/io.h>
  32
  33DECLARE_GLOBAL_DATA_PTR;
  34
  35#define OUTPUT_EN       0x0
  36#define INPUT_VAL       0x10
  37#define OUTPUT_VAL      0x18
  38#define OUTPUT_CTL      0x20
  39#define SELECTION       0x30
  40
  41#define IRQ_EN          0x0
  42#define IRQ_POL         0x08
  43#define IRQ_STATUS      0x10
  44#define IRQ_WKUP        0x18
  45
  46#define NB_FUNCS 3
  47#define GPIO_PER_REG    32
  48
  49/**
  50 * struct armada_37xx_pin_group: represents group of pins of a pinmux function.
  51 * The pins of a pinmux groups are composed of one or two groups of contiguous
  52 * pins.
  53 * @name:       Name of the pin group, used to lookup the group.
  54 * @start_pins: Index of the first pin of the main range of pins belonging to
  55 *              the group
  56 * @npins:      Number of pins included in the first range
  57 * @reg_mask:   Bit mask matching the group in the selection register
  58 * @extra_pins: Index of the first pin of the optional second range of pins
  59 *              belonging to the group
  60 * @npins:      Number of pins included in the second optional range
  61 * @funcs:      A list of pinmux functions that can be selected for this group.
  62 * @pins:       List of the pins included in the group
  63 */
  64struct armada_37xx_pin_group {
  65        const char      *name;
  66        unsigned int    start_pin;
  67        unsigned int    npins;
  68        u32             reg_mask;
  69        u32             val[NB_FUNCS];
  70        unsigned int    extra_pin;
  71        unsigned int    extra_npins;
  72        const char      *funcs[NB_FUNCS];
  73        unsigned int    *pins;
  74};
  75
  76struct armada_37xx_pin_data {
  77        u8                              nr_pins;
  78        char                            *name;
  79        struct armada_37xx_pin_group    *groups;
  80        int                             ngroups;
  81};
  82
  83struct armada_37xx_pmx_func {
  84        const char              *name;
  85        const char              **groups;
  86        unsigned int            ngroups;
  87};
  88
  89struct armada_37xx_pinctrl {
  90        void __iomem                    *base;
  91        const struct armada_37xx_pin_data       *data;
  92        struct udevice                  *dev;
  93        struct pinctrl_dev              *pctl_dev;
  94        struct armada_37xx_pin_group    *groups;
  95        unsigned int                    ngroups;
  96        struct armada_37xx_pmx_func     *funcs;
  97        unsigned int                    nfuncs;
  98};
  99
 100#define PIN_GRP(_name, _start, _nr, _mask, _func1, _func2)      \
 101        {                                       \
 102                .name = _name,                  \
 103                .start_pin = _start,            \
 104                .npins = _nr,                   \
 105                .reg_mask = _mask,              \
 106                .val = {0, _mask},              \
 107                .funcs = {_func1, _func2}       \
 108        }
 109
 110#define PIN_GRP_GPIO(_name, _start, _nr, _mask, _func1) \
 111        {                                       \
 112                .name = _name,                  \
 113                .start_pin = _start,            \
 114                .npins = _nr,                   \
 115                .reg_mask = _mask,              \
 116                .val = {0, _mask},              \
 117                .funcs = {_func1, "gpio"}       \
 118        }
 119
 120#define PIN_GRP_GPIO_2(_name, _start, _nr, _mask, _val1, _val2, _func1)   \
 121        {                                       \
 122                .name = _name,                  \
 123                .start_pin = _start,            \
 124                .npins = _nr,                   \
 125                .reg_mask = _mask,              \
 126                .val = {_val1, _val2},          \
 127                .funcs = {_func1, "gpio"}       \
 128        }
 129
 130#define PIN_GRP_GPIO_3(_name, _start, _nr, _mask, _v1, _v2, _v3, _f1, _f2) \
 131        {                                       \
 132                .name = _name,                  \
 133                .start_pin = _start,            \
 134                .npins = _nr,                   \
 135                .reg_mask = _mask,              \
 136                .val = {_v1, _v2, _v3}, \
 137                .funcs = {_f1, _f2, "gpio"}     \
 138        }
 139
 140#define PIN_GRP_EXTRA(_name, _start, _nr, _mask, _v1, _v2, _start2, _nr2, \
 141                      _f1, _f2)                         \
 142        {                                               \
 143                .name = _name,                          \
 144                .start_pin = _start,                    \
 145                .npins = _nr,                           \
 146                .reg_mask = _mask,                      \
 147                .val = {_v1, _v2},                      \
 148                .extra_pin = _start2,                   \
 149                .extra_npins = _nr2,                    \
 150                .funcs = {_f1, _f2}                     \
 151        }
 152
 153static struct armada_37xx_pin_group armada_37xx_nb_groups[] = {
 154        PIN_GRP_GPIO("jtag", 20, 5, BIT(0), "jtag"),
 155        PIN_GRP_GPIO("sdio0", 8, 3, BIT(1), "sdio"),
 156        PIN_GRP_GPIO("emmc_nb", 27, 9, BIT(2), "emmc"),
 157        PIN_GRP_GPIO("pwm0", 11, 1, BIT(3), "pwm"),
 158        PIN_GRP_GPIO("pwm1", 12, 1, BIT(4), "pwm"),
 159        PIN_GRP_GPIO("pwm2", 13, 1, BIT(5), "pwm"),
 160        PIN_GRP_GPIO("pwm3", 14, 1, BIT(6), "pwm"),
 161        PIN_GRP_GPIO("pmic1", 7, 1, BIT(7), "pmic"),
 162        PIN_GRP_GPIO("pmic0", 6, 1, BIT(8), "pmic"),
 163        PIN_GRP_GPIO("i2c2", 2, 2, BIT(9), "i2c"),
 164        PIN_GRP_GPIO("i2c1", 0, 2, BIT(10), "i2c"),
 165        PIN_GRP_GPIO("spi_cs1", 17, 1, BIT(12), "spi"),
 166        PIN_GRP_GPIO_2("spi_cs2", 18, 1, BIT(13) | BIT(19), 0, BIT(13), "spi"),
 167        PIN_GRP_GPIO_2("spi_cs3", 19, 1, BIT(14) | BIT(19), 0, BIT(14), "spi"),
 168        PIN_GRP_GPIO("onewire", 4, 1, BIT(16), "onewire"),
 169        PIN_GRP_GPIO("uart1", 25, 2, BIT(17), "uart"),
 170        PIN_GRP_GPIO("spi_quad", 15, 2, BIT(18), "spi"),
 171        PIN_GRP_EXTRA("uart2", 9, 2, BIT(1) | BIT(13) | BIT(14) | BIT(19),
 172                      BIT(1) | BIT(13) | BIT(14), BIT(1) | BIT(19),
 173                      18, 2, "gpio", "uart"),
 174        PIN_GRP_GPIO("led0_od", 11, 1, BIT(20), "led"),
 175        PIN_GRP_GPIO("led1_od", 12, 1, BIT(21), "led"),
 176        PIN_GRP_GPIO("led2_od", 13, 1, BIT(22), "led"),
 177        PIN_GRP_GPIO("led3_od", 14, 1, BIT(23), "led"),
 178
 179};
 180
 181static struct armada_37xx_pin_group armada_37xx_sb_groups[] = {
 182        PIN_GRP_GPIO("usb32_drvvbus0", 0, 1, BIT(0), "drvbus"),
 183        PIN_GRP_GPIO("usb2_drvvbus1", 1, 1, BIT(1), "drvbus"),
 184        PIN_GRP_GPIO("sdio_sb", 24, 6, BIT(2), "sdio"),
 185        PIN_GRP_GPIO("rgmii", 6, 12, BIT(3), "mii"),
 186        PIN_GRP_GPIO("smi", 18, 2, BIT(4), "smi"),
 187        PIN_GRP_GPIO("pcie1", 3, 3, BIT(5) | BIT(9) | BIT(10), "pcie"),
 188        PIN_GRP_GPIO("ptp", 20, 3, BIT(11) | BIT(12) | BIT(13), "ptp"),
 189        PIN_GRP("ptp_clk", 21, 1, BIT(6), "ptp", "mii"),
 190        PIN_GRP("ptp_trig", 22, 1, BIT(7), "ptp", "mii"),
 191        PIN_GRP_GPIO_3("mii_col", 23, 1, BIT(8) | BIT(14), 0, BIT(8), BIT(14),
 192                       "mii", "mii_err"),
 193};
 194
 195const struct armada_37xx_pin_data armada_37xx_pin_nb = {
 196        .nr_pins = 36,
 197        .name = "GPIO1",
 198        .groups = armada_37xx_nb_groups,
 199        .ngroups = ARRAY_SIZE(armada_37xx_nb_groups),
 200};
 201
 202const struct armada_37xx_pin_data armada_37xx_pin_sb = {
 203        .nr_pins = 30,
 204        .name = "GPIO2",
 205        .groups = armada_37xx_sb_groups,
 206        .ngroups = ARRAY_SIZE(armada_37xx_sb_groups),
 207};
 208
 209static inline void armada_37xx_update_reg(unsigned int *reg,
 210                                          unsigned int *offset)
 211{
 212        /* We never have more than 2 registers */
 213        if (*offset >= GPIO_PER_REG) {
 214                *offset -= GPIO_PER_REG;
 215                *reg += sizeof(u32);
 216        }
 217}
 218
 219static int armada_37xx_get_func_reg(struct armada_37xx_pin_group *grp,
 220                                    const char *func)
 221{
 222        int f;
 223
 224        for (f = 0; (f < NB_FUNCS) && grp->funcs[f]; f++)
 225                if (!strcmp(grp->funcs[f], func))
 226                        return f;
 227
 228        return -ENOTSUPP;
 229}
 230
 231static int armada_37xx_pmx_get_groups_count(struct udevice *dev)
 232{
 233        struct armada_37xx_pinctrl *info = dev_get_priv(dev);
 234
 235        return info->ngroups;
 236}
 237
 238static const char *armada_37xx_pmx_dummy_name = "_dummy";
 239
 240static const char *armada_37xx_pmx_get_group_name(struct udevice *dev,
 241                                                  unsigned selector)
 242{
 243        struct armada_37xx_pinctrl *info = dev_get_priv(dev);
 244
 245        if (!info->groups[selector].name)
 246                return armada_37xx_pmx_dummy_name;
 247
 248        return info->groups[selector].name;
 249}
 250
 251static int armada_37xx_pmx_get_funcs_count(struct udevice *dev)
 252{
 253        struct armada_37xx_pinctrl *info = dev_get_priv(dev);
 254
 255        return info->nfuncs;
 256}
 257
 258static const char *armada_37xx_pmx_get_func_name(struct udevice *dev,
 259                                                 unsigned selector)
 260{
 261        struct armada_37xx_pinctrl *info = dev_get_priv(dev);
 262
 263        return info->funcs[selector].name;
 264}
 265
 266static int armada_37xx_pmx_set_by_name(struct udevice *dev,
 267                                       const char *name,
 268                                       struct armada_37xx_pin_group *grp)
 269{
 270        struct armada_37xx_pinctrl *info = dev_get_priv(dev);
 271        unsigned int reg = SELECTION;
 272        unsigned int mask = grp->reg_mask;
 273        int func, val;
 274
 275        dev_dbg(info->dev, "enable function %s group %s\n",
 276                name, grp->name);
 277
 278        func = armada_37xx_get_func_reg(grp, name);
 279
 280        if (func < 0)
 281                return func;
 282
 283        val = grp->val[func];
 284
 285        clrsetbits_le32(info->base + reg, mask, val);
 286
 287        return 0;
 288}
 289
 290static int armada_37xx_pmx_group_set(struct udevice *dev,
 291                                     unsigned group_selector,
 292                                     unsigned func_selector)
 293{
 294        struct armada_37xx_pinctrl *info = dev_get_priv(dev);
 295        struct armada_37xx_pin_group *grp = &info->groups[group_selector];
 296        const char *name = info->funcs[func_selector].name;
 297
 298        return armada_37xx_pmx_set_by_name(dev, name, grp);
 299}
 300
 301/**
 302 * armada_37xx_add_function() - Add a new function to the list
 303 * @funcs: array of function to add the new one
 304 * @funcsize: size of the remaining space for the function
 305 * @name: name of the function to add
 306 *
 307 * If it is a new function then create it by adding its name else
 308 * increment the number of group associated to this function.
 309 */
 310static int armada_37xx_add_function(struct armada_37xx_pmx_func *funcs,
 311                                    int *funcsize, const char *name)
 312{
 313        int i = 0;
 314
 315        if (*funcsize <= 0)
 316                return -EOVERFLOW;
 317
 318        while (funcs->ngroups) {
 319                /* function already there */
 320                if (strcmp(funcs->name, name) == 0) {
 321                        funcs->ngroups++;
 322
 323                        return -EEXIST;
 324                }
 325                funcs++;
 326                i++;
 327        }
 328
 329        /* append new unique function */
 330        funcs->name = name;
 331        funcs->ngroups = 1;
 332        (*funcsize)--;
 333
 334        return 0;
 335}
 336
 337/**
 338 * armada_37xx_fill_group() - complete the group array
 339 * @info: info driver instance
 340 *
 341 * Based on the data available from the armada_37xx_pin_group array
 342 * completes the last member of the struct for each function: the list
 343 * of the groups associated to this function.
 344 *
 345 */
 346static int armada_37xx_fill_group(struct armada_37xx_pinctrl *info)
 347{
 348        int n, num = 0, funcsize = info->data->nr_pins;
 349
 350        for (n = 0; n < info->ngroups; n++) {
 351                struct armada_37xx_pin_group *grp = &info->groups[n];
 352                int i, j, f;
 353
 354                grp->pins = devm_kzalloc(info->dev,
 355                                         (grp->npins + grp->extra_npins) *
 356                                         sizeof(*grp->pins), GFP_KERNEL);
 357                if (!grp->pins)
 358                        return -ENOMEM;
 359
 360                for (i = 0; i < grp->npins; i++)
 361                        grp->pins[i] = grp->start_pin + i;
 362
 363                for (j = 0; j < grp->extra_npins; j++)
 364                        grp->pins[i+j] = grp->extra_pin + j;
 365
 366                for (f = 0; (f < NB_FUNCS) && grp->funcs[f]; f++) {
 367                        int ret;
 368                        /* check for unique functions and count groups */
 369                        ret = armada_37xx_add_function(info->funcs, &funcsize,
 370                                            grp->funcs[f]);
 371                        if (ret == -EOVERFLOW)
 372                                dev_err(info->dev,
 373                                        "More functions than pins(%d)\n",
 374                                        info->data->nr_pins);
 375                        if (ret < 0)
 376                                continue;
 377                        num++;
 378                }
 379        }
 380
 381        info->nfuncs = num;
 382
 383        return 0;
 384}
 385
 386/**
 387 * armada_37xx_fill_funcs() - complete the funcs array
 388 * @info: info driver instance
 389 *
 390 * Based on the data available from the armada_37xx_pin_group array
 391 * completes the last two member of the struct for each group:
 392 * - the list of the pins included in the group
 393 * - the list of pinmux functions that can be selected for this group
 394 *
 395 */
 396static int armada_37xx_fill_func(struct armada_37xx_pinctrl *info)
 397{
 398        struct armada_37xx_pmx_func *funcs = info->funcs;
 399        int n;
 400
 401        for (n = 0; n < info->nfuncs; n++) {
 402                const char *name = funcs[n].name;
 403                const char **groups;
 404                int g;
 405
 406                funcs[n].groups = devm_kzalloc(info->dev, funcs[n].ngroups *
 407                                               sizeof(*(funcs[n].groups)),
 408                                               GFP_KERNEL);
 409                if (!funcs[n].groups)
 410                        return -ENOMEM;
 411
 412                groups = funcs[n].groups;
 413
 414                for (g = 0; g < info->ngroups; g++) {
 415                        struct armada_37xx_pin_group *gp = &info->groups[g];
 416                        int f;
 417
 418                        for (f = 0; (f < NB_FUNCS) && gp->funcs[f]; f++) {
 419                                if (strcmp(gp->funcs[f], name) == 0) {
 420                                        *groups = gp->name;
 421                                        groups++;
 422                                }
 423                        }
 424                }
 425        }
 426        return 0;
 427}
 428
 429static int armada_37xx_gpio_get(struct udevice *dev, unsigned int offset)
 430{
 431        struct armada_37xx_pinctrl *info = dev_get_priv(dev->parent);
 432        unsigned int reg = INPUT_VAL;
 433        unsigned int val, mask;
 434
 435        armada_37xx_update_reg(&reg, &offset);
 436        mask = BIT(offset);
 437
 438        val = readl(info->base + reg);
 439
 440        return (val & mask) != 0;
 441}
 442
 443static int armada_37xx_gpio_set(struct udevice *dev, unsigned int offset,
 444                                int value)
 445{
 446        struct armada_37xx_pinctrl *info = dev_get_priv(dev->parent);
 447        unsigned int reg = OUTPUT_VAL;
 448        unsigned int mask, val;
 449
 450        armada_37xx_update_reg(&reg, &offset);
 451        mask = BIT(offset);
 452        val = value ? mask : 0;
 453
 454        clrsetbits_le32(info->base + reg, mask, val);
 455
 456        return 0;
 457}
 458
 459static int armada_37xx_gpio_get_direction(struct udevice *dev,
 460                                          unsigned int offset)
 461{
 462        struct armada_37xx_pinctrl *info = dev_get_priv(dev->parent);
 463        unsigned int reg = OUTPUT_EN;
 464        unsigned int val, mask;
 465
 466        armada_37xx_update_reg(&reg, &offset);
 467        mask = BIT(offset);
 468        val = readl(info->base + reg);
 469
 470        if (val & mask)
 471                return GPIOF_OUTPUT;
 472        else
 473                return GPIOF_INPUT;
 474}
 475
 476static int armada_37xx_gpio_direction_input(struct udevice *dev,
 477                                            unsigned int offset)
 478{
 479        struct armada_37xx_pinctrl *info = dev_get_priv(dev->parent);
 480        unsigned int reg = OUTPUT_EN;
 481        unsigned int mask;
 482
 483        armada_37xx_update_reg(&reg, &offset);
 484        mask = BIT(offset);
 485
 486        clrbits_le32(info->base + reg, mask);
 487
 488        return 0;
 489}
 490
 491static int armada_37xx_gpio_direction_output(struct udevice *dev,
 492                                             unsigned int offset, int value)
 493{
 494        struct armada_37xx_pinctrl *info = dev_get_priv(dev->parent);
 495        unsigned int reg = OUTPUT_EN;
 496        unsigned int mask;
 497
 498        armada_37xx_update_reg(&reg, &offset);
 499        mask = BIT(offset);
 500
 501        setbits_le32(info->base + reg, mask);
 502
 503        /* And set the requested value */
 504        return armada_37xx_gpio_set(dev, offset, value);
 505}
 506
 507static int armada_37xx_gpio_probe(struct udevice *dev)
 508{
 509        struct armada_37xx_pinctrl *info = dev_get_priv(dev->parent);
 510        struct gpio_dev_priv *uc_priv;
 511
 512        uc_priv = dev_get_uclass_priv(dev);
 513        uc_priv->bank_name = info->data->name;
 514        uc_priv->gpio_count = info->data->nr_pins;
 515
 516        return 0;
 517}
 518
 519static const struct dm_gpio_ops armada_37xx_gpio_ops = {
 520        .set_value = armada_37xx_gpio_set,
 521        .get_value = armada_37xx_gpio_get,
 522        .get_function = armada_37xx_gpio_get_direction,
 523        .direction_input = armada_37xx_gpio_direction_input,
 524        .direction_output = armada_37xx_gpio_direction_output,
 525};
 526
 527static struct driver armada_37xx_gpio_driver = {
 528        .name   = "armada-37xx-gpio",
 529        .id     = UCLASS_GPIO,
 530        .probe  = armada_37xx_gpio_probe,
 531        .ops    = &armada_37xx_gpio_ops,
 532};
 533
 534static int armada_37xx_gpiochip_register(struct udevice *parent,
 535                                         struct armada_37xx_pinctrl *info)
 536{
 537        const void *blob = gd->fdt_blob;
 538        int node = dev_of_offset(parent);
 539        struct uclass_driver *drv;
 540        struct udevice *dev;
 541        int ret = -ENODEV;
 542        int subnode;
 543        char *name;
 544
 545        /* Lookup GPIO driver */
 546        drv = lists_uclass_lookup(UCLASS_GPIO);
 547        if (!drv) {
 548                puts("Cannot find GPIO driver\n");
 549                return -ENOENT;
 550        }
 551
 552        fdt_for_each_subnode(subnode, blob, node) {
 553                if (fdtdec_get_bool(blob, subnode, "gpio-controller")) {
 554                        ret = 0;
 555                        break;
 556                }
 557        };
 558        if (ret)
 559                return ret;
 560
 561        name = calloc(1, 32);
 562        sprintf(name, "armada-37xx-gpio");
 563
 564        /* Create child device UCLASS_GPIO and bind it */
 565        device_bind(parent, &armada_37xx_gpio_driver, name, NULL, subnode,
 566                    &dev);
 567        dev_set_of_offset(dev, subnode);
 568
 569        return 0;
 570}
 571
 572const struct pinctrl_ops armada_37xx_pinctrl_ops  = {
 573        .get_groups_count = armada_37xx_pmx_get_groups_count,
 574        .get_group_name = armada_37xx_pmx_get_group_name,
 575        .get_functions_count = armada_37xx_pmx_get_funcs_count,
 576        .get_function_name = armada_37xx_pmx_get_func_name,
 577        .pinmux_group_set = armada_37xx_pmx_group_set,
 578        .set_state = pinctrl_generic_set_state,
 579};
 580
 581int armada_37xx_pinctrl_probe(struct udevice *dev)
 582{
 583        struct armada_37xx_pinctrl *info = dev_get_priv(dev);
 584        const struct armada_37xx_pin_data *pin_data;
 585        int ret;
 586
 587        info->data = (struct armada_37xx_pin_data *)dev_get_driver_data(dev);
 588        pin_data = info->data;
 589
 590        info->base = (void __iomem *)devfdt_get_addr(dev);
 591        if (!info->base) {
 592                pr_err("unable to find regmap\n");
 593                return -ENODEV;
 594        }
 595
 596        info->groups = pin_data->groups;
 597        info->ngroups = pin_data->ngroups;
 598
 599        /*
 600         * we allocate functions for number of pins and hope there are
 601         * fewer unique functions than pins available
 602         */
 603        info->funcs = devm_kzalloc(info->dev, pin_data->nr_pins *
 604                           sizeof(struct armada_37xx_pmx_func), GFP_KERNEL);
 605        if (!info->funcs)
 606                return -ENOMEM;
 607
 608
 609        ret = armada_37xx_fill_group(info);
 610        if (ret)
 611                return ret;
 612
 613        ret = armada_37xx_fill_func(info);
 614        if (ret)
 615                return ret;
 616
 617        ret = armada_37xx_gpiochip_register(dev, info);
 618        if (ret)
 619                return ret;
 620
 621        return 0;
 622}
 623
 624static const struct udevice_id armada_37xx_pinctrl_of_match[] = {
 625        {
 626                .compatible = "marvell,armada3710-sb-pinctrl",
 627                .data = (ulong)&armada_37xx_pin_sb,
 628        },
 629        {
 630                .compatible = "marvell,armada3710-nb-pinctrl",
 631                .data = (ulong)&armada_37xx_pin_nb,
 632        },
 633        { /* sentinel */ }
 634};
 635
 636U_BOOT_DRIVER(armada_37xx_pinctrl) = {
 637        .name = "armada-37xx-pinctrl",
 638        .id = UCLASS_PINCTRL,
 639        .of_match = of_match_ptr(armada_37xx_pinctrl_of_match),
 640        .probe = armada_37xx_pinctrl_probe,
 641        .priv_auto_alloc_size = sizeof(struct armada_37xx_pinctrl),
 642        .ops = &armada_37xx_pinctrl_ops,
 643};
 644