uboot/drivers/pinctrl/mtmips/pinctrl-mt7628.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 2019 MediaTek Inc. All Rights Reserved.
   4 *
   5 * Author: Weijie Gao <weijie.gao@mediatek.com>
   6 */
   7
   8#include <common.h>
   9#include <dm.h>
  10#include <asm/global_data.h>
  11#include <dm/pinctrl.h>
  12#include <linux/bitops.h>
  13#include <linux/io.h>
  14
  15#include "pinctrl-mtmips-common.h"
  16
  17DECLARE_GLOBAL_DATA_PTR;
  18
  19#define AGPIO_OFS                       0
  20#define GPIOMODE1_OFS                   0x24
  21#define GPIOMODE2_OFS                   0x28
  22
  23#define EPHY4_1_PAD_SHIFT               17
  24#define EPHY4_1_PAD_MASK                0x0f
  25#define EPHY0_SHIFT                     16
  26#define RF_OLT_MODE_SHIFT               12
  27#define N9_EINT_SRC_SHIFT               9
  28#define WLED_OD_SHIFT                   8
  29#define REF_CLKO_PAD_SHIFT              4
  30#define I2S_CLK_PAD_SHIFT               3
  31#define I2S_WS_PAD_SHIFT                2
  32#define I2S_SDO_PAD_SHIFT               1
  33#define I2S_SDI_PAD_SHIFT               0
  34
  35#define GM4_MASK                        3
  36
  37#define P4LED_K_SHIFT                   26
  38#define P3LED_K_SHIFT                   24
  39#define P2LED_K_SHIFT                   22
  40#define P1LED_K_SHIFT                   20
  41#define P0LED_K_SHIFT                   18
  42#define WLED_K_SHIFT                    16
  43#define P4LED_A_SHIFT                   10
  44#define P3LED_A_SHIFT                   8
  45#define P2LED_A_SHIFT                   6
  46#define P1LED_A_SHIFT                   4
  47#define P0LED_A_SHIFT                   2
  48#define WLED_A_SHIFT                    0
  49
  50#define PWM1_SHIFT                      30
  51#define PWM0_SHIFT                      28
  52#define UART2_SHIFT                     26
  53#define UART1_SHIFT                     24
  54#define I2C_SHIFT                       20
  55#define REFCLK_SHIFT                    18
  56#define PERST_SHIFT                     16
  57#define ESD_SHIFT                       15
  58#define WDT_SHIFT                       14
  59#define SPI_SHIFT                       12
  60#define SDMODE_SHIFT                    10
  61#define UART0_SHIFT                     8
  62#define I2S_SHIFT                       6
  63#define SPI_CS1_SHIFT                   4
  64#define SPIS_SHIFT                      2
  65#define GPIO0_SHIFT                     0
  66
  67#define PAD_PU_G0_REG                   0x00
  68#define PAD_PU_G1_REG                   0x04
  69#define PAD_PD_G0_REG                   0x10
  70#define PAD_PD_G1_REG                   0x14
  71#define PAD_SR_G0_REG                   0x20
  72#define PAD_SR_G1_REG                   0x24
  73#define PAD_SMT_G0_REG                  0x30
  74#define PAD_SMT_G1_REG                  0x34
  75#define PAD_E2_G0_REG                   0x40
  76#define PAD_E2_G1_REG                   0x44
  77#define PAD_E4_G0_REG                   0x50
  78#define PAD_E4_G1_REG                   0x54
  79#define PAD_E8_G0_REG                   0x60
  80#define PAD_E8_G1_REG                   0x64
  81
  82#define PIN_CONFIG_DRIVE_STRENGTH_28    (PIN_CONFIG_END + 1)
  83#define PIN_CONFIG_DRIVE_STRENGTH_4G    (PIN_CONFIG_END + 2)
  84
  85struct mt7628_pinctrl_priv {
  86        struct mtmips_pinctrl_priv mp;
  87
  88        void __iomem *pcbase;
  89};
  90
  91#if CONFIG_IS_ENABLED(PINMUX)
  92static const struct mtmips_pmx_func ephy4_1_pad_grp[] = {
  93        FUNC("digital", 0xf),
  94        FUNC("analog", 0),
  95};
  96
  97static const struct mtmips_pmx_func ephy0_grp[] = {
  98        FUNC("disable", 1),
  99        FUNC("enable", 0),
 100};
 101
 102static const struct mtmips_pmx_func rf_olt_grp[] = {
 103        FUNC("enable", 1),
 104        FUNC("disable", 0),
 105};
 106
 107static const struct mtmips_pmx_func n9_eint_src_grp[] = {
 108        FUNC("gpio", 1),
 109        FUNC("utif", 0),
 110};
 111
 112static const struct mtmips_pmx_func wlen_od_grp[] = {
 113        FUNC("enable", 1),
 114        FUNC("disable", 0),
 115};
 116
 117static const struct mtmips_pmx_func ref_clko_grp[] = {
 118        FUNC("digital", 1),
 119        FUNC("analog", 0),
 120};
 121
 122static const struct mtmips_pmx_func i2s_clk_grp[] = {
 123        FUNC("digital", 1),
 124        FUNC("analog", 0),
 125};
 126
 127static const struct mtmips_pmx_func i2s_ws_grp[] = {
 128        FUNC("digital", 1),
 129        FUNC("analog", 0),
 130};
 131
 132static const struct mtmips_pmx_func i2s_sdo_grp[] = {
 133        FUNC("digital", 1),
 134        FUNC("analog", 0),
 135};
 136
 137static const struct mtmips_pmx_func i2s_sdi_grp[] = {
 138        FUNC("digital", 1),
 139        FUNC("analog", 0),
 140};
 141
 142static const struct mtmips_pmx_func pwm1_grp[] = {
 143        FUNC("sdxc d6", 3),
 144        FUNC("utif", 2),
 145        FUNC("gpio", 1),
 146        FUNC("pwm1", 0),
 147};
 148
 149static const struct mtmips_pmx_func pwm0_grp[] = {
 150        FUNC("sdxc d7", 3),
 151        FUNC("utif", 2),
 152        FUNC("gpio", 1),
 153        FUNC("pwm0", 0),
 154};
 155
 156static const struct mtmips_pmx_func uart2_grp[] = {
 157        FUNC("sdxc d5 d4", 3),
 158        FUNC("pwm", 2),
 159        FUNC("gpio", 1),
 160        FUNC("uart2", 0),
 161};
 162
 163static const struct mtmips_pmx_func uart1_grp[] = {
 164        FUNC("sw_r", 3),
 165        FUNC("pwm", 2),
 166        FUNC("gpio", 1),
 167        FUNC("uart1", 0),
 168};
 169
 170static const struct mtmips_pmx_func i2c_grp[] = {
 171        FUNC("-", 3),
 172        FUNC("debug", 2),
 173        FUNC("gpio", 1),
 174        FUNC("i2c", 0),
 175};
 176
 177static const struct mtmips_pmx_func refclk_grp[] = {
 178        FUNC("gpio", 1),
 179        FUNC("refclk", 0),
 180};
 181
 182static const struct mtmips_pmx_func perst_grp[] = {
 183        FUNC("gpio", 1),
 184        FUNC("perst", 0),
 185};
 186
 187static const struct mtmips_pmx_func esd_grp[] = {
 188        FUNC("router", 1),
 189        FUNC("iot", 0),
 190};
 191
 192static const struct mtmips_pmx_func wdt_grp[] = {
 193        FUNC("gpio", 1),
 194        FUNC("wdt", 0),
 195};
 196
 197static const struct mtmips_pmx_func spi_grp[] = {
 198        FUNC("gpio", 1),
 199        FUNC("spi", 0),
 200};
 201
 202static const struct mtmips_pmx_func sd_mode_grp[] = {
 203        FUNC("n9 jtag", 3),
 204        FUNC("utif1", 2),
 205        FUNC("gpio", 1),
 206        FUNC("sdxc", 0),
 207};
 208
 209static const struct mtmips_pmx_func uart0_grp[] = {
 210        FUNC("-", 3),
 211        FUNC("-", 2),
 212        FUNC("gpio", 1),
 213        FUNC("uart0", 0),
 214};
 215
 216static const struct mtmips_pmx_func i2s_grp[] = {
 217        FUNC("antenna", 3),
 218        FUNC("pcm", 2),
 219        FUNC("gpio", 1),
 220        FUNC("i2s", 0),
 221};
 222
 223static const struct mtmips_pmx_func spi_cs1_grp[] = {
 224        FUNC("-", 3),
 225        FUNC("refclk", 2),
 226        FUNC("gpio", 1),
 227        FUNC("spi cs1", 0),
 228};
 229
 230static const struct mtmips_pmx_func spis_grp[] = {
 231        FUNC("pwm_uart2", 3),
 232        FUNC("utif", 2),
 233        FUNC("gpio", 1),
 234        FUNC("spis", 0),
 235};
 236
 237static const struct mtmips_pmx_func gpio0_grp[] = {
 238        FUNC("perst", 3),
 239        FUNC("refclk", 2),
 240        FUNC("gpio", 1),
 241        FUNC("gpio0", 0),
 242};
 243
 244static const struct mtmips_pmx_func wled_a_grp[] = {
 245        FUNC("-", 3),
 246        FUNC("-", 2),
 247        FUNC("gpio", 1),
 248        FUNC("led", 0),
 249};
 250
 251static const struct mtmips_pmx_func p0led_a_grp[] = {
 252        FUNC("jtag", 3),
 253        FUNC("rsvd", 2),
 254        FUNC("gpio", 1),
 255        FUNC("led", 0),
 256};
 257
 258static const struct mtmips_pmx_func p1led_a_grp[] = {
 259        FUNC("jtag", 3),
 260        FUNC("utif", 2),
 261        FUNC("gpio", 1),
 262        FUNC("led", 0),
 263};
 264
 265static const struct mtmips_pmx_func p2led_a_grp[] = {
 266        FUNC("jtag", 3),
 267        FUNC("utif", 2),
 268        FUNC("gpio", 1),
 269        FUNC("led", 0),
 270};
 271
 272static const struct mtmips_pmx_func p3led_a_grp[] = {
 273        FUNC("jtag", 3),
 274        FUNC("utif", 2),
 275        FUNC("gpio", 1),
 276        FUNC("led", 0),
 277};
 278
 279static const struct mtmips_pmx_func p4led_a_grp[] = {
 280        FUNC("jtag", 3),
 281        FUNC("utif", 2),
 282        FUNC("gpio", 1),
 283        FUNC("led", 0),
 284};
 285
 286static const struct mtmips_pmx_func wled_k_grp[] = {
 287        FUNC("-", 3),
 288        FUNC("-", 2),
 289        FUNC("gpio", 1),
 290        FUNC("led", 0),
 291};
 292
 293static const struct mtmips_pmx_func p0led_k_grp[] = {
 294        FUNC("jtag", 3),
 295        FUNC("rsvd", 2),
 296        FUNC("gpio", 1),
 297        FUNC("led", 0),
 298};
 299
 300static const struct mtmips_pmx_func p1led_k_grp[] = {
 301        FUNC("jtag", 3),
 302        FUNC("utif", 2),
 303        FUNC("gpio", 1),
 304        FUNC("led", 0),
 305};
 306
 307static const struct mtmips_pmx_func p2led_k_grp[] = {
 308        FUNC("jtag", 3),
 309        FUNC("utif", 2),
 310        FUNC("gpio", 1),
 311        FUNC("led", 0),
 312};
 313
 314static const struct mtmips_pmx_func p3led_k_grp[] = {
 315        FUNC("jtag", 3),
 316        FUNC("utif", 2),
 317        FUNC("gpio", 1),
 318        FUNC("led", 0),
 319};
 320
 321static const struct mtmips_pmx_func p4led_k_grp[] = {
 322        FUNC("jtag", 3),
 323        FUNC("utif", 2),
 324        FUNC("gpio", 1),
 325        FUNC("led", 0),
 326};
 327
 328static const struct mtmips_pmx_group mt7628_pinmux_data[] = {
 329        GRP("ephy4_1_pad", ephy4_1_pad_grp, AGPIO_OFS, EPHY4_1_PAD_SHIFT,
 330            EPHY4_1_PAD_MASK),
 331        GRP("ephy0", ephy0_grp, AGPIO_OFS, EPHY0_SHIFT, 1),
 332        GRP("rf_olt", rf_olt_grp, AGPIO_OFS, RF_OLT_MODE_SHIFT, 1),
 333        GRP("n9_eint_src", n9_eint_src_grp, AGPIO_OFS, N9_EINT_SRC_SHIFT, 1),
 334        GRP("wlen_od", wlen_od_grp, AGPIO_OFS, WLED_OD_SHIFT, 1),
 335        GRP("ref_clko_pad", ref_clko_grp, AGPIO_OFS, REF_CLKO_PAD_SHIFT, 1),
 336        GRP("i2s_clk_pad", i2s_clk_grp, AGPIO_OFS, I2S_CLK_PAD_SHIFT, 1),
 337        GRP("i2s_ws_pad", i2s_ws_grp, AGPIO_OFS, I2S_WS_PAD_SHIFT, 1),
 338        GRP("i2s_sdo_pad", i2s_sdo_grp, AGPIO_OFS, I2S_SDO_PAD_SHIFT, 1),
 339        GRP("i2s_sdi_pad", i2s_sdi_grp, AGPIO_OFS, I2S_SDI_PAD_SHIFT, 1),
 340        GRP("pwm1", pwm1_grp, GPIOMODE1_OFS, PWM1_SHIFT, GM4_MASK),
 341        GRP("pwm0", pwm0_grp, GPIOMODE1_OFS, PWM0_SHIFT, GM4_MASK),
 342        GRP("uart2", uart2_grp, GPIOMODE1_OFS, UART2_SHIFT, GM4_MASK),
 343        GRP("uart1", uart1_grp, GPIOMODE1_OFS, UART1_SHIFT, GM4_MASK),
 344        GRP("i2c", i2c_grp, GPIOMODE1_OFS, I2C_SHIFT, GM4_MASK),
 345        GRP("refclk", refclk_grp, GPIOMODE1_OFS, REFCLK_SHIFT, 1),
 346        GRP("perst", perst_grp, GPIOMODE1_OFS, PERST_SHIFT, 1),
 347        GRP("sd router", esd_grp, GPIOMODE1_OFS, ESD_SHIFT, 1),
 348        GRP("wdt", wdt_grp, GPIOMODE1_OFS, WDT_SHIFT, 1),
 349        GRP("spi", spi_grp, GPIOMODE1_OFS, SPI_SHIFT, 1),
 350        GRP("sdmode", sd_mode_grp, GPIOMODE1_OFS, SDMODE_SHIFT, GM4_MASK),
 351        GRP("uart0", uart0_grp, GPIOMODE1_OFS, UART0_SHIFT, GM4_MASK),
 352        GRP("i2s", i2s_grp, GPIOMODE1_OFS, I2S_SHIFT, GM4_MASK),
 353        GRP("spi cs1", spi_cs1_grp, GPIOMODE1_OFS, SPI_CS1_SHIFT, GM4_MASK),
 354        GRP("spis", spis_grp, GPIOMODE1_OFS, SPIS_SHIFT, GM4_MASK),
 355        GRP("gpio0", gpio0_grp, GPIOMODE1_OFS, GPIO0_SHIFT, GM4_MASK),
 356        GRP("wled_a", wled_a_grp, GPIOMODE2_OFS, WLED_A_SHIFT, GM4_MASK),
 357        GRP("p0led_a", p0led_a_grp, GPIOMODE2_OFS, P0LED_A_SHIFT, GM4_MASK),
 358        GRP("p1led_a", p1led_a_grp, GPIOMODE2_OFS, P1LED_A_SHIFT, GM4_MASK),
 359        GRP("p2led_a", p2led_a_grp, GPIOMODE2_OFS, P2LED_A_SHIFT, GM4_MASK),
 360        GRP("p3led_a", p3led_a_grp, GPIOMODE2_OFS, P3LED_A_SHIFT, GM4_MASK),
 361        GRP("p4led_a", p4led_a_grp, GPIOMODE2_OFS, P4LED_A_SHIFT, GM4_MASK),
 362        GRP("wled_k", wled_k_grp, GPIOMODE2_OFS, WLED_K_SHIFT, GM4_MASK),
 363        GRP("p0led_k", p0led_k_grp, GPIOMODE2_OFS, P0LED_K_SHIFT, GM4_MASK),
 364        GRP("p1led_k", p1led_k_grp, GPIOMODE2_OFS, P1LED_K_SHIFT, GM4_MASK),
 365        GRP("p2led_k", p2led_k_grp, GPIOMODE2_OFS, P2LED_K_SHIFT, GM4_MASK),
 366        GRP("p3led_k", p3led_k_grp, GPIOMODE2_OFS, P3LED_K_SHIFT, GM4_MASK),
 367        GRP("p4led_k", p4led_k_grp, GPIOMODE2_OFS, P4LED_K_SHIFT, GM4_MASK),
 368};
 369
 370static int mt7628_get_groups_count(struct udevice *dev)
 371{
 372        return ARRAY_SIZE(mt7628_pinmux_data);
 373}
 374
 375static const char *mt7628_get_group_name(struct udevice *dev,
 376                                         unsigned int selector)
 377{
 378        return mt7628_pinmux_data[selector].name;
 379}
 380#endif /* CONFIG_IS_ENABLED(PINMUX) */
 381
 382#if CONFIG_IS_ENABLED(PINCONF)
 383static const struct pinconf_param mt7628_conf_params[] = {
 384        { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
 385        { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
 386        { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
 387        { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
 388        { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
 389        { "drive-strength-28", PIN_CONFIG_DRIVE_STRENGTH_28, 0 },
 390        { "drive-strength-4g", PIN_CONFIG_DRIVE_STRENGTH_4G, 0 },
 391        { "slew-rate", PIN_CONFIG_SLEW_RATE, 0 },
 392};
 393
 394static const char *const mt7628_pins[] = {
 395        "i2s_sdi",
 396        "i2s_sdo",
 397        "i2s_ws",
 398        "i2s_clk",
 399        "i2s_sclk",
 400        "i2c_sd",
 401        "spi_cs1",
 402        "spi_clk",
 403        "spi_mosi",
 404        "spi_miso",
 405        "spi_cs0",
 406        "gpio0",
 407        "uart0_txd",
 408        "uart0_rxd",
 409        "spis_cs",
 410        "spis_clk",
 411        "spis_miso",
 412        "spis_mosi",
 413        "pwm_ch0",
 414        "pwm_ch1",
 415        "uart2_txd",
 416        "uart2_rxd",
 417        "sd_wp",
 418        "sd_cd",
 419        "sd_d1",
 420        "sd_d0",
 421        "sd_clk",
 422        "sd_cmd",
 423        "sd_d3",
 424        "sd_d2",
 425        "ephy_led4_k",
 426        "ephy_led3_k",
 427        "ephy_led2_k",
 428        "ephy_led1_k",
 429        "ephy_led0_k",
 430        "wled_k",
 431        "perst_n",
 432        "co_clko",
 433        "wdt",
 434        "ephy_led4_a",
 435        "ephy_led3_a",
 436        "ephy_led2_a",
 437        "ephy_led1_a",
 438        "ephy_led0_a",
 439        "wled_a",
 440        "uart1_txd",
 441        "uart1_rxd",
 442};
 443
 444static const u32 mt7628_drv_strength_28_tbl[] = {2, 4, 6, 8};
 445static const u32 mt7628_drv_strength_4g_tbl[] = {4, 8, 12, 16};
 446
 447static int mt7628_set_drv_strength(void __iomem *base, u32 val, u32 bit,
 448                                   const u32 tbl[], u32 reg_lo, u32 reg_hi)
 449{
 450        int i;
 451
 452        for (i = 0; i < 4; i++)
 453                if (tbl[i] == val)
 454                        break;
 455
 456        if (i >= 4)
 457                return -EINVAL;
 458
 459        clrsetbits_32(base + reg_lo, BIT(bit), (i & 1) << bit);
 460        clrsetbits_32(base + reg_hi, BIT(bit), ((i >> 1) & 1) << bit);
 461
 462        return 0;
 463}
 464
 465static int mt7628_get_pins_count(struct udevice *dev)
 466{
 467        return ARRAY_SIZE(mt7628_pins);
 468}
 469
 470static const char *mt7628_get_pin_name(struct udevice *dev,
 471                                       unsigned int selector)
 472{
 473        return mt7628_pins[selector];
 474}
 475
 476static int mt7628_pinconf_set(struct udevice *dev, unsigned int pin_selector,
 477                              unsigned int param, unsigned int argument)
 478{
 479        struct mt7628_pinctrl_priv *priv = dev_get_priv(dev);
 480        u32 offs, bit;
 481        int ret = 0;
 482
 483        offs = (pin_selector / 32) * 4;
 484        bit = pin_selector % 32;
 485
 486        switch (param) {
 487        case PIN_CONFIG_BIAS_DISABLE:
 488                clrbits_32(priv->pcbase + offs + PAD_PU_G0_REG, BIT(bit));
 489                clrbits_32(priv->pcbase + offs + PAD_PD_G0_REG, BIT(bit));
 490                break;
 491        case PIN_CONFIG_BIAS_PULL_UP:
 492                setbits_32(priv->pcbase + offs + PAD_PU_G0_REG, BIT(bit));
 493                clrbits_32(priv->pcbase + offs + PAD_PD_G0_REG, BIT(bit));
 494                break;
 495        case PIN_CONFIG_BIAS_PULL_DOWN:
 496                clrbits_32(priv->pcbase + offs + PAD_PU_G0_REG, BIT(bit));
 497                setbits_32(priv->pcbase + offs + PAD_PD_G0_REG, BIT(bit));
 498                break;
 499        case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
 500                clrsetbits_32(priv->pcbase + offs + PAD_SMT_G0_REG,
 501                              BIT(bit), (!!argument) << bit);
 502                break;
 503        case PIN_CONFIG_DRIVE_STRENGTH_28:
 504                ret = mt7628_set_drv_strength(priv->pcbase + offs, argument,
 505                                              bit, mt7628_drv_strength_28_tbl,
 506                                              PAD_E2_G0_REG, PAD_E4_G0_REG);
 507                break;
 508        case PIN_CONFIG_DRIVE_STRENGTH_4G:
 509                ret = mt7628_set_drv_strength(priv->pcbase + offs, argument,
 510                                              bit, mt7628_drv_strength_4g_tbl,
 511                                              PAD_E4_G0_REG, PAD_E8_G0_REG);
 512                break;
 513        case PIN_CONFIG_SLEW_RATE:
 514                clrsetbits_32(priv->pcbase + offs + PAD_SR_G0_REG,
 515                              BIT(bit), (!!argument) << bit);
 516                break;
 517        default:
 518                ret = -EINVAL;
 519        }
 520
 521        return ret;
 522}
 523#endif
 524
 525static int mt7628_pinctrl_probe(struct udevice *dev)
 526{
 527        struct mt7628_pinctrl_priv *priv = dev_get_priv(dev);
 528        int ret = 0;
 529
 530#if CONFIG_IS_ENABLED(PINMUX)
 531        ret = mtmips_pinctrl_probe(&priv->mp, ARRAY_SIZE(mt7628_pinmux_data),
 532                                   mt7628_pinmux_data);
 533#endif /* CONFIG_IS_ENABLED(PINMUX) */
 534
 535        return ret;
 536}
 537
 538static int mt7628_pinctrl_of_to_plat(struct udevice *dev)
 539{
 540        struct mt7628_pinctrl_priv *priv = dev_get_priv(dev);
 541
 542        priv->mp.base = (void __iomem *)dev_remap_addr_index(dev, 0);
 543
 544        if (!priv->mp.base)
 545                return -EINVAL;
 546
 547        priv->pcbase = (void __iomem *)dev_remap_addr_index(dev, 1);
 548
 549        if (!priv->pcbase)
 550                return -EINVAL;
 551
 552        return 0;
 553}
 554
 555static const struct pinctrl_ops mt7628_pinctrl_ops = {
 556#if CONFIG_IS_ENABLED(PINMUX)
 557        .get_groups_count = mt7628_get_groups_count,
 558        .get_group_name = mt7628_get_group_name,
 559        .get_functions_count = mtmips_get_functions_count,
 560        .get_function_name = mtmips_get_function_name,
 561        .pinmux_group_set = mtmips_pinmux_group_set,
 562#endif /* CONFIG_IS_ENABLED(PINMUX) */
 563#if CONFIG_IS_ENABLED(PINCONF)
 564        .pinconf_num_params = ARRAY_SIZE(mt7628_conf_params),
 565        .pinconf_params = mt7628_conf_params,
 566        .get_pins_count = mt7628_get_pins_count,
 567        .get_pin_name = mt7628_get_pin_name,
 568        .pinconf_set = mt7628_pinconf_set,
 569#endif /* CONFIG_IS_ENABLED(PINCONF) */
 570        .set_state = pinctrl_generic_set_state,
 571};
 572
 573static const struct udevice_id mt7628_pinctrl_ids[] = {
 574        { .compatible = "mediatek,mt7628-pinctrl" },
 575        { }
 576};
 577
 578U_BOOT_DRIVER(mt7628_pinctrl) = {
 579        .name = "mt7628-pinctrl",
 580        .id = UCLASS_PINCTRL,
 581        .of_match = mt7628_pinctrl_ids,
 582        .of_to_plat = mt7628_pinctrl_of_to_plat,
 583        .ops = &mt7628_pinctrl_ops,
 584        .probe = mt7628_pinctrl_probe,
 585        .priv_auto      = sizeof(struct mt7628_pinctrl_priv),
 586};
 587