14af4eb66SBilly Tsai // SPDX-License-Identifier: GPL-2.0-only 24af4eb66SBilly Tsai /* 34af4eb66SBilly Tsai * Pinctrl driver for Aspeed G7 SoC1 44af4eb66SBilly Tsai * 54af4eb66SBilly Tsai * Copyright (C) 2026 Aspeed Technology Inc. 64af4eb66SBilly Tsai */ 74af4eb66SBilly Tsai 84af4eb66SBilly Tsai #include <linux/errno.h> 94af4eb66SBilly Tsai #include <linux/mfd/syscon.h> 104af4eb66SBilly Tsai #include <linux/module.h> 114af4eb66SBilly Tsai #include <linux/of.h> 124af4eb66SBilly Tsai #include <linux/pinctrl/pinconf-generic.h> 134af4eb66SBilly Tsai #include <linux/pinctrl/pinconf.h> 144af4eb66SBilly Tsai #include <linux/pinctrl/pinctrl.h> 154af4eb66SBilly Tsai #include <linux/pinctrl/pinmux.h> 164af4eb66SBilly Tsai #include <linux/platform_device.h> 174af4eb66SBilly Tsai #include <linux/regmap.h> 184af4eb66SBilly Tsai #include <linux/slab.h> 194af4eb66SBilly Tsai 204af4eb66SBilly Tsai #include "../core.h" 214af4eb66SBilly Tsai #include "../pinconf.h" 224af4eb66SBilly Tsai #include "../pinctrl-utils.h" 234af4eb66SBilly Tsai #include "../pinmux.h" 244af4eb66SBilly Tsai 254af4eb66SBilly Tsai #define ASPEED_G7_SOC1_NR_PINS 220 264af4eb66SBilly Tsai #define ASPEED_G7_SOC1_REG_WIDTH 32 274af4eb66SBilly Tsai #define ASPEED_G7_SOC1_REG_STRIDE 4 284af4eb66SBilly Tsai 294af4eb66SBilly Tsai #define ASPEED_G7_SOC1_MUX_BASE 0x400 304af4eb66SBilly Tsai #define ASPEED_G7_SOC1_BIAS_BASE 0x480 314af4eb66SBilly Tsai #define ASPEED_G7_SOC1_DRV_BASE 0x4C0 324af4eb66SBilly Tsai #define ASPEED_G7_SOC1_PCIE_REG 0x908 334af4eb66SBilly Tsai #define ASPEED_G7_SOC1_USB_MODE_REG 0x3B0 344af4eb66SBilly Tsai #define ASPEED_G7_SOC1_SGMII_REG 0x47C 354af4eb66SBilly Tsai 364af4eb66SBilly Tsai /* 374af4eb66SBilly Tsai * Each pin occupies a 4-bit slot in the MUX registers (MUX_BITS_PER_PIN), 384af4eb66SBilly Tsai * but only bits [2:0] select the mux function; bit 3 is reserved read-only 394af4eb66SBilly Tsai * and must not be written. MUX_FUNC_MASK therefore covers 3 bits, not 4. 404af4eb66SBilly Tsai */ 414af4eb66SBilly Tsai #define ASPEED_G7_SOC1_MUX_FUNC_MASK 0x7 424af4eb66SBilly Tsai #define ASPEED_G7_SOC1_MUX_BITS_PER_PIN 4 434af4eb66SBilly Tsai #define ASPEED_G7_SOC1_MUX_PINS_PER_REG \ 444af4eb66SBilly Tsai (ASPEED_G7_SOC1_REG_WIDTH / ASPEED_G7_SOC1_MUX_BITS_PER_PIN) 454af4eb66SBilly Tsai 464af4eb66SBilly Tsai #define ASPEED_G7_SOC1_BIAS_FUNC_MASK 0x1 474af4eb66SBilly Tsai #define ASPEED_G7_SOC1_BIAS_BITS_PER_PIN 1 484af4eb66SBilly Tsai #define ASPEED_G7_SOC1_BIAS_PINS_PER_REG \ 494af4eb66SBilly Tsai (ASPEED_G7_SOC1_REG_WIDTH / ASPEED_G7_SOC1_BIAS_BITS_PER_PIN) 504af4eb66SBilly Tsai 514af4eb66SBilly Tsai #define ASPEED_G7_SOC1_DRV_FUNC_MASK 0x3 524af4eb66SBilly Tsai #define ASPEED_G7_SOC1_DRV_BITS_PER_PIN 2 534af4eb66SBilly Tsai #define ASPEED_G7_SOC1_DRV_PINS_PER_REG \ 544af4eb66SBilly Tsai (ASPEED_G7_SOC1_REG_WIDTH / ASPEED_G7_SOC1_DRV_BITS_PER_PIN) 554af4eb66SBilly Tsai 564af4eb66SBilly Tsai #define ASPEED_G7_SOC1_DRV_STRENGTH_STEP_MA 4 574af4eb66SBilly Tsai #define ASPEED_G7_SOC1_DRV_STRENGTH_HW_BASE 1 584af4eb66SBilly Tsai #define ASPEED_G7_SOC1_DRV_STRENGTH_MIN_MA \ 594af4eb66SBilly Tsai (ASPEED_G7_SOC1_DRV_STRENGTH_HW_BASE * ASPEED_G7_SOC1_DRV_STRENGTH_STEP_MA) 604af4eb66SBilly Tsai #define ASPEED_G7_SOC1_DRV_STRENGTH_MAX_MA \ 614af4eb66SBilly Tsai ((ASPEED_G7_SOC1_DRV_FUNC_MASK + ASPEED_G7_SOC1_DRV_STRENGTH_HW_BASE) * \ 624af4eb66SBilly Tsai ASPEED_G7_SOC1_DRV_STRENGTH_STEP_MA) 634af4eb66SBilly Tsai 644af4eb66SBilly Tsai /* 654af4eb66SBilly Tsai * NOTE: The numeric values of these enum entries are significant. 664af4eb66SBilly Tsai * They must match the SoC GPIO numbering / ball-to-GPIO ID mapping. 674af4eb66SBilly Tsai * Do not reorder alphabetically. 684af4eb66SBilly Tsai */ 694af4eb66SBilly Tsai enum { 704af4eb66SBilly Tsai C16, 714af4eb66SBilly Tsai C14, 724af4eb66SBilly Tsai C11, 734af4eb66SBilly Tsai D9, 744af4eb66SBilly Tsai F14, 754af4eb66SBilly Tsai D10, 764af4eb66SBilly Tsai C12, 774af4eb66SBilly Tsai C13, 784af4eb66SBilly Tsai AC26, 794af4eb66SBilly Tsai AA25, 804af4eb66SBilly Tsai AB23, 814af4eb66SBilly Tsai U22, 824af4eb66SBilly Tsai V21, 834af4eb66SBilly Tsai N26, 844af4eb66SBilly Tsai P25, 854af4eb66SBilly Tsai N25, 864af4eb66SBilly Tsai V23, 874af4eb66SBilly Tsai W22, 884af4eb66SBilly Tsai AB26, 894af4eb66SBilly Tsai AD26, 904af4eb66SBilly Tsai P26, 914af4eb66SBilly Tsai AE26, 924af4eb66SBilly Tsai AF26, 934af4eb66SBilly Tsai AF25, 944af4eb66SBilly Tsai AE25, 954af4eb66SBilly Tsai AD25, 964af4eb66SBilly Tsai AF23, 974af4eb66SBilly Tsai AF20, 984af4eb66SBilly Tsai AF21, 994af4eb66SBilly Tsai AE21, 1004af4eb66SBilly Tsai AE23, 1014af4eb66SBilly Tsai AD22, 1024af4eb66SBilly Tsai AF17, 1034af4eb66SBilly Tsai AA16, 1044af4eb66SBilly Tsai Y16, 1054af4eb66SBilly Tsai V17, 1064af4eb66SBilly Tsai J13, 1074af4eb66SBilly Tsai AB16, 1084af4eb66SBilly Tsai AC16, 1094af4eb66SBilly Tsai AF16, 1104af4eb66SBilly Tsai AA15, 1114af4eb66SBilly Tsai AB15, 1124af4eb66SBilly Tsai AC15, 1134af4eb66SBilly Tsai AD15, 1144af4eb66SBilly Tsai Y15, 1154af4eb66SBilly Tsai AA14, 1164af4eb66SBilly Tsai W16, 1174af4eb66SBilly Tsai V16, 1184af4eb66SBilly Tsai AB18, 1194af4eb66SBilly Tsai AC18, 1204af4eb66SBilly Tsai K13, 1214af4eb66SBilly Tsai AA17, 1224af4eb66SBilly Tsai AB17, 1234af4eb66SBilly Tsai AD16, 1244af4eb66SBilly Tsai AC17, 1254af4eb66SBilly Tsai AD17, 1264af4eb66SBilly Tsai AE16, 1274af4eb66SBilly Tsai AE17, 1284af4eb66SBilly Tsai AB24, 1294af4eb66SBilly Tsai W26, 1304af4eb66SBilly Tsai HOLE0, 1314af4eb66SBilly Tsai HOLE1, 1324af4eb66SBilly Tsai HOLE2, 1334af4eb66SBilly Tsai HOLE3, 1344af4eb66SBilly Tsai W25, 1354af4eb66SBilly Tsai Y23, 1364af4eb66SBilly Tsai Y24, 1374af4eb66SBilly Tsai W21, 1384af4eb66SBilly Tsai AA23, 1394af4eb66SBilly Tsai AC22, 1404af4eb66SBilly Tsai AB22, 1414af4eb66SBilly Tsai Y21, 1424af4eb66SBilly Tsai AE20, 1434af4eb66SBilly Tsai AF19, 1444af4eb66SBilly Tsai Y22, 1454af4eb66SBilly Tsai AA20, 1464af4eb66SBilly Tsai AA22, 1474af4eb66SBilly Tsai AB20, 1484af4eb66SBilly Tsai AF18, 1494af4eb66SBilly Tsai AE19, 1504af4eb66SBilly Tsai AD20, 1514af4eb66SBilly Tsai AC20, 1524af4eb66SBilly Tsai AA21, 1534af4eb66SBilly Tsai AB21, 1544af4eb66SBilly Tsai AC19, 1554af4eb66SBilly Tsai AE18, 1564af4eb66SBilly Tsai AD19, 1574af4eb66SBilly Tsai AD18, 1584af4eb66SBilly Tsai U25, 1594af4eb66SBilly Tsai U26, 1604af4eb66SBilly Tsai Y26, 1614af4eb66SBilly Tsai AA24, 1624af4eb66SBilly Tsai R25, 1634af4eb66SBilly Tsai AA26, 1644af4eb66SBilly Tsai R26, 1654af4eb66SBilly Tsai Y25, 1664af4eb66SBilly Tsai B16, 1674af4eb66SBilly Tsai D14, 1684af4eb66SBilly Tsai B15, 1694af4eb66SBilly Tsai B14, 1704af4eb66SBilly Tsai C17, 1714af4eb66SBilly Tsai B13, 1724af4eb66SBilly Tsai E14, 1734af4eb66SBilly Tsai C15, 1744af4eb66SBilly Tsai D24, 1754af4eb66SBilly Tsai B23, 1764af4eb66SBilly Tsai B22, 1774af4eb66SBilly Tsai C23, 1784af4eb66SBilly Tsai B18, 1794af4eb66SBilly Tsai B21, 1804af4eb66SBilly Tsai M15, 1814af4eb66SBilly Tsai B19, 1824af4eb66SBilly Tsai B26, 1834af4eb66SBilly Tsai A25, 1844af4eb66SBilly Tsai A24, 1854af4eb66SBilly Tsai B24, 1864af4eb66SBilly Tsai E26, 1874af4eb66SBilly Tsai A21, 1884af4eb66SBilly Tsai A19, 1894af4eb66SBilly Tsai A18, 1904af4eb66SBilly Tsai D26, 1914af4eb66SBilly Tsai C26, 1924af4eb66SBilly Tsai A23, 1934af4eb66SBilly Tsai A22, 1944af4eb66SBilly Tsai B25, 1954af4eb66SBilly Tsai F26, 1964af4eb66SBilly Tsai A26, 1974af4eb66SBilly Tsai A14, 1984af4eb66SBilly Tsai E10, 1994af4eb66SBilly Tsai E13, 2004af4eb66SBilly Tsai D12, 2014af4eb66SBilly Tsai F10, 2024af4eb66SBilly Tsai E11, 2034af4eb66SBilly Tsai F11, 2044af4eb66SBilly Tsai F13, 2054af4eb66SBilly Tsai N15, 2064af4eb66SBilly Tsai C20, 2074af4eb66SBilly Tsai C19, 2084af4eb66SBilly Tsai A8, 2094af4eb66SBilly Tsai R14, 2104af4eb66SBilly Tsai A7, 2114af4eb66SBilly Tsai P14, 2124af4eb66SBilly Tsai D20, 2134af4eb66SBilly Tsai A6, 2144af4eb66SBilly Tsai B6, 2154af4eb66SBilly Tsai N14, 2164af4eb66SBilly Tsai B7, 2174af4eb66SBilly Tsai B8, 2184af4eb66SBilly Tsai B9, 2194af4eb66SBilly Tsai M14, 2204af4eb66SBilly Tsai J11, 2214af4eb66SBilly Tsai E7, 2224af4eb66SBilly Tsai D19, 2234af4eb66SBilly Tsai B11, 2244af4eb66SBilly Tsai D15, 2254af4eb66SBilly Tsai B12, 2264af4eb66SBilly Tsai B10, 2274af4eb66SBilly Tsai P13, 2284af4eb66SBilly Tsai C18, 2294af4eb66SBilly Tsai C6, 2304af4eb66SBilly Tsai C7, 2314af4eb66SBilly Tsai D7, 2324af4eb66SBilly Tsai N13, 2334af4eb66SBilly Tsai C8, 2344af4eb66SBilly Tsai C9, 2354af4eb66SBilly Tsai C10, 2364af4eb66SBilly Tsai M16, 2374af4eb66SBilly Tsai A15, 2384af4eb66SBilly Tsai G11, 2394af4eb66SBilly Tsai H7, 2404af4eb66SBilly Tsai H8, 2414af4eb66SBilly Tsai H9, 2424af4eb66SBilly Tsai H10, 2434af4eb66SBilly Tsai H11, 2444af4eb66SBilly Tsai J9, 2454af4eb66SBilly Tsai J10, 2464af4eb66SBilly Tsai E9, 2474af4eb66SBilly Tsai F9, 2484af4eb66SBilly Tsai F8, 2494af4eb66SBilly Tsai M13, 2504af4eb66SBilly Tsai F7, 2514af4eb66SBilly Tsai D8, 2524af4eb66SBilly Tsai E8, 2534af4eb66SBilly Tsai L12, 2544af4eb66SBilly Tsai F12, 2554af4eb66SBilly Tsai E12, 2564af4eb66SBilly Tsai J12, 2574af4eb66SBilly Tsai G7, 2584af4eb66SBilly Tsai G8, 2594af4eb66SBilly Tsai G9, 2604af4eb66SBilly Tsai G10, 2614af4eb66SBilly Tsai K12, 2624af4eb66SBilly Tsai W17, 2634af4eb66SBilly Tsai V18, 2644af4eb66SBilly Tsai W18, 2654af4eb66SBilly Tsai Y17, 2664af4eb66SBilly Tsai AA18, 2674af4eb66SBilly Tsai AA13, 2684af4eb66SBilly Tsai Y18, 2694af4eb66SBilly Tsai AA12, 2704af4eb66SBilly Tsai W20, 2714af4eb66SBilly Tsai V20, 2724af4eb66SBilly Tsai Y11, 2734af4eb66SBilly Tsai V14, 2744af4eb66SBilly Tsai V19, 2754af4eb66SBilly Tsai W14, 2764af4eb66SBilly Tsai Y20, 2774af4eb66SBilly Tsai AB19, 2784af4eb66SBilly Tsai U21, 2794af4eb66SBilly Tsai T24, 2804af4eb66SBilly Tsai V24, 2814af4eb66SBilly Tsai V22, 2824af4eb66SBilly Tsai T23, 2834af4eb66SBilly Tsai AC25, 2844af4eb66SBilly Tsai AB25, 2854af4eb66SBilly Tsai AC24, 2864af4eb66SBilly Tsai PCIERC2_PERST, 2874af4eb66SBilly Tsai PORTC_MODE, 2884af4eb66SBilly Tsai PORTD_MODE, 2894af4eb66SBilly Tsai SGMII0, 2904af4eb66SBilly Tsai }; 2914af4eb66SBilly Tsai 2924af4eb66SBilly Tsai struct aspeed_g7_soc1_pinctrl { 2934af4eb66SBilly Tsai struct device *dev; 2944af4eb66SBilly Tsai struct regmap *regmap; 2954af4eb66SBilly Tsai struct pinctrl_dev *pctl; 2964af4eb66SBilly Tsai }; 2974af4eb66SBilly Tsai 2984af4eb66SBilly Tsai struct aspeed_g7_field { 2994af4eb66SBilly Tsai unsigned int reg; 3004af4eb66SBilly Tsai unsigned int shift; 3014af4eb66SBilly Tsai unsigned int mask; 3024af4eb66SBilly Tsai }; 3034af4eb66SBilly Tsai 3044af4eb66SBilly Tsai static struct aspeed_g7_field 3054af4eb66SBilly Tsai aspeed_g7_soc1_pinmux_field_from_pin(unsigned int pin) 3064af4eb66SBilly Tsai { 3074af4eb66SBilly Tsai return (struct aspeed_g7_field){ 3084af4eb66SBilly Tsai .reg = ASPEED_G7_SOC1_MUX_BASE + 3094af4eb66SBilly Tsai (pin / ASPEED_G7_SOC1_MUX_PINS_PER_REG) * 3104af4eb66SBilly Tsai ASPEED_G7_SOC1_REG_STRIDE, 3114af4eb66SBilly Tsai .shift = (pin % ASPEED_G7_SOC1_MUX_PINS_PER_REG) * 3124af4eb66SBilly Tsai ASPEED_G7_SOC1_MUX_BITS_PER_PIN, 3134af4eb66SBilly Tsai .mask = ASPEED_G7_SOC1_MUX_FUNC_MASK, 3144af4eb66SBilly Tsai }; 3154af4eb66SBilly Tsai } 3164af4eb66SBilly Tsai 3174af4eb66SBilly Tsai static struct aspeed_g7_field 3184af4eb66SBilly Tsai aspeed_g7_soc1_bias_field_from_pin(unsigned int pin) 3194af4eb66SBilly Tsai { 3204af4eb66SBilly Tsai return (struct aspeed_g7_field){ 3214af4eb66SBilly Tsai .reg = ASPEED_G7_SOC1_BIAS_BASE + 3224af4eb66SBilly Tsai (pin / ASPEED_G7_SOC1_BIAS_PINS_PER_REG) * 3234af4eb66SBilly Tsai ASPEED_G7_SOC1_REG_STRIDE, 3244af4eb66SBilly Tsai .shift = pin % ASPEED_G7_SOC1_BIAS_PINS_PER_REG, 3254af4eb66SBilly Tsai .mask = ASPEED_G7_SOC1_BIAS_FUNC_MASK, 3264af4eb66SBilly Tsai }; 3274af4eb66SBilly Tsai } 3284af4eb66SBilly Tsai 3294af4eb66SBilly Tsai static struct aspeed_g7_field 3304af4eb66SBilly Tsai aspeed_g7_soc1_drv_field_from_idx(unsigned int idx) 3314af4eb66SBilly Tsai { 3324af4eb66SBilly Tsai return (struct aspeed_g7_field){ 3334af4eb66SBilly Tsai .reg = ASPEED_G7_SOC1_DRV_BASE + 3344af4eb66SBilly Tsai (idx / ASPEED_G7_SOC1_DRV_PINS_PER_REG) * 3354af4eb66SBilly Tsai ASPEED_G7_SOC1_REG_STRIDE, 3364af4eb66SBilly Tsai .shift = (idx % ASPEED_G7_SOC1_DRV_PINS_PER_REG) * 3374af4eb66SBilly Tsai ASPEED_G7_SOC1_DRV_BITS_PER_PIN, 3384af4eb66SBilly Tsai .mask = ASPEED_G7_SOC1_DRV_FUNC_MASK, 3394af4eb66SBilly Tsai }; 3404af4eb66SBilly Tsai } 3414af4eb66SBilly Tsai 3424af4eb66SBilly Tsai #define PIN(n) PINCTRL_PIN(n, #n) 3434af4eb66SBilly Tsai 3444af4eb66SBilly Tsai static const struct pinctrl_pin_desc aspeed_g7_soc1_pins[] = { 3454af4eb66SBilly Tsai PIN(C16), 3464af4eb66SBilly Tsai PIN(C14), 3474af4eb66SBilly Tsai PIN(C11), 3484af4eb66SBilly Tsai PIN(D9), 3494af4eb66SBilly Tsai PIN(F14), 3504af4eb66SBilly Tsai PIN(D10), 3514af4eb66SBilly Tsai PIN(C12), 3524af4eb66SBilly Tsai PIN(C13), 3534af4eb66SBilly Tsai PIN(AC26), 3544af4eb66SBilly Tsai PIN(AA25), 3554af4eb66SBilly Tsai PIN(AB23), 3564af4eb66SBilly Tsai PIN(U22), 3574af4eb66SBilly Tsai PIN(V21), 3584af4eb66SBilly Tsai PIN(N26), 3594af4eb66SBilly Tsai PIN(P25), 3604af4eb66SBilly Tsai PIN(N25), 3614af4eb66SBilly Tsai PIN(V23), 3624af4eb66SBilly Tsai PIN(W22), 3634af4eb66SBilly Tsai PIN(AB26), 3644af4eb66SBilly Tsai PIN(AD26), 3654af4eb66SBilly Tsai PIN(P26), 3664af4eb66SBilly Tsai PIN(AE26), 3674af4eb66SBilly Tsai PIN(AF26), 3684af4eb66SBilly Tsai PIN(AF25), 3694af4eb66SBilly Tsai PIN(AE25), 3704af4eb66SBilly Tsai PIN(AD25), 3714af4eb66SBilly Tsai PIN(AF23), 3724af4eb66SBilly Tsai PIN(AF20), 3734af4eb66SBilly Tsai PIN(AF21), 3744af4eb66SBilly Tsai PIN(AE21), 3754af4eb66SBilly Tsai PIN(AE23), 3764af4eb66SBilly Tsai PIN(AD22), 3774af4eb66SBilly Tsai PIN(AF17), 3784af4eb66SBilly Tsai PIN(AA16), 3794af4eb66SBilly Tsai PIN(Y16), 3804af4eb66SBilly Tsai PIN(V17), 3814af4eb66SBilly Tsai PIN(J13), 3824af4eb66SBilly Tsai PIN(AB16), 3834af4eb66SBilly Tsai PIN(AC16), 3844af4eb66SBilly Tsai PIN(AF16), 3854af4eb66SBilly Tsai PIN(AA15), 3864af4eb66SBilly Tsai PIN(AB15), 3874af4eb66SBilly Tsai PIN(AC15), 3884af4eb66SBilly Tsai PIN(AD15), 3894af4eb66SBilly Tsai PIN(Y15), 3904af4eb66SBilly Tsai PIN(AA14), 3914af4eb66SBilly Tsai PIN(W16), 3924af4eb66SBilly Tsai PIN(V16), 3934af4eb66SBilly Tsai PIN(AB18), 3944af4eb66SBilly Tsai PIN(AC18), 3954af4eb66SBilly Tsai PIN(K13), 3964af4eb66SBilly Tsai PIN(AA17), 3974af4eb66SBilly Tsai PIN(AB17), 3984af4eb66SBilly Tsai PIN(AD16), 3994af4eb66SBilly Tsai PIN(AC17), 4004af4eb66SBilly Tsai PIN(AD17), 4014af4eb66SBilly Tsai PIN(AE16), 4024af4eb66SBilly Tsai PIN(AE17), 4034af4eb66SBilly Tsai PIN(AB24), 4044af4eb66SBilly Tsai PIN(W26), 4054af4eb66SBilly Tsai PIN(HOLE0), 4064af4eb66SBilly Tsai PIN(HOLE1), 4074af4eb66SBilly Tsai PIN(HOLE2), 4084af4eb66SBilly Tsai PIN(HOLE3), 4094af4eb66SBilly Tsai PIN(W25), 4104af4eb66SBilly Tsai PIN(Y23), 4114af4eb66SBilly Tsai PIN(Y24), 4124af4eb66SBilly Tsai PIN(W21), 4134af4eb66SBilly Tsai PIN(AA23), 4144af4eb66SBilly Tsai PIN(AC22), 4154af4eb66SBilly Tsai PIN(AB22), 4164af4eb66SBilly Tsai PIN(Y21), 4174af4eb66SBilly Tsai PIN(AE20), 4184af4eb66SBilly Tsai PIN(AF19), 4194af4eb66SBilly Tsai PIN(Y22), 4204af4eb66SBilly Tsai PIN(AA20), 4214af4eb66SBilly Tsai PIN(AA22), 4224af4eb66SBilly Tsai PIN(AB20), 4234af4eb66SBilly Tsai PIN(AF18), 4244af4eb66SBilly Tsai PIN(AE19), 4254af4eb66SBilly Tsai PIN(AD20), 4264af4eb66SBilly Tsai PIN(AC20), 4274af4eb66SBilly Tsai PIN(AA21), 4284af4eb66SBilly Tsai PIN(AB21), 4294af4eb66SBilly Tsai PIN(AC19), 4304af4eb66SBilly Tsai PIN(AE18), 4314af4eb66SBilly Tsai PIN(AD19), 4324af4eb66SBilly Tsai PIN(AD18), 4334af4eb66SBilly Tsai PIN(U25), 4344af4eb66SBilly Tsai PIN(U26), 4354af4eb66SBilly Tsai PIN(Y26), 4364af4eb66SBilly Tsai PIN(AA24), 4374af4eb66SBilly Tsai PIN(R25), 4384af4eb66SBilly Tsai PIN(AA26), 4394af4eb66SBilly Tsai PIN(R26), 4404af4eb66SBilly Tsai PIN(Y25), 4414af4eb66SBilly Tsai PIN(B16), 4424af4eb66SBilly Tsai PIN(D14), 4434af4eb66SBilly Tsai PIN(B15), 4444af4eb66SBilly Tsai PIN(B14), 4454af4eb66SBilly Tsai PIN(C17), 4464af4eb66SBilly Tsai PIN(B13), 4474af4eb66SBilly Tsai PIN(E14), 4484af4eb66SBilly Tsai PIN(C15), 4494af4eb66SBilly Tsai PIN(D24), 4504af4eb66SBilly Tsai PIN(B23), 4514af4eb66SBilly Tsai PIN(B22), 4524af4eb66SBilly Tsai PIN(C23), 4534af4eb66SBilly Tsai PIN(B18), 4544af4eb66SBilly Tsai PIN(B21), 4554af4eb66SBilly Tsai PIN(M15), 4564af4eb66SBilly Tsai PIN(B19), 4574af4eb66SBilly Tsai PIN(B26), 4584af4eb66SBilly Tsai PIN(A25), 4594af4eb66SBilly Tsai PIN(A24), 4604af4eb66SBilly Tsai PIN(B24), 4614af4eb66SBilly Tsai PIN(E26), 4624af4eb66SBilly Tsai PIN(A21), 4634af4eb66SBilly Tsai PIN(A19), 4644af4eb66SBilly Tsai PIN(A18), 4654af4eb66SBilly Tsai PIN(D26), 4664af4eb66SBilly Tsai PIN(C26), 4674af4eb66SBilly Tsai PIN(A23), 4684af4eb66SBilly Tsai PIN(A22), 4694af4eb66SBilly Tsai PIN(B25), 4704af4eb66SBilly Tsai PIN(F26), 4714af4eb66SBilly Tsai PIN(A26), 4724af4eb66SBilly Tsai PIN(A14), 4734af4eb66SBilly Tsai PIN(E10), 4744af4eb66SBilly Tsai PIN(E13), 4754af4eb66SBilly Tsai PIN(D12), 4764af4eb66SBilly Tsai PIN(F10), 4774af4eb66SBilly Tsai PIN(E11), 4784af4eb66SBilly Tsai PIN(F11), 4794af4eb66SBilly Tsai PIN(F13), 4804af4eb66SBilly Tsai PIN(N15), 4814af4eb66SBilly Tsai PIN(C20), 4824af4eb66SBilly Tsai PIN(C19), 4834af4eb66SBilly Tsai PIN(A8), 4844af4eb66SBilly Tsai PIN(R14), 4854af4eb66SBilly Tsai PIN(A7), 4864af4eb66SBilly Tsai PIN(P14), 4874af4eb66SBilly Tsai PIN(D20), 4884af4eb66SBilly Tsai PIN(A6), 4894af4eb66SBilly Tsai PIN(B6), 4904af4eb66SBilly Tsai PIN(N14), 4914af4eb66SBilly Tsai PIN(B7), 4924af4eb66SBilly Tsai PIN(B8), 4934af4eb66SBilly Tsai PIN(B9), 4944af4eb66SBilly Tsai PIN(M14), 4954af4eb66SBilly Tsai PIN(J11), 4964af4eb66SBilly Tsai PIN(E7), 4974af4eb66SBilly Tsai PIN(D19), 4984af4eb66SBilly Tsai PIN(B11), 4994af4eb66SBilly Tsai PIN(D15), 5004af4eb66SBilly Tsai PIN(B12), 5014af4eb66SBilly Tsai PIN(B10), 5024af4eb66SBilly Tsai PIN(P13), 5034af4eb66SBilly Tsai PIN(C18), 5044af4eb66SBilly Tsai PIN(C6), 5054af4eb66SBilly Tsai PIN(C7), 5064af4eb66SBilly Tsai PIN(D7), 5074af4eb66SBilly Tsai PIN(N13), 5084af4eb66SBilly Tsai PIN(C8), 5094af4eb66SBilly Tsai PIN(C9), 5104af4eb66SBilly Tsai PIN(C10), 5114af4eb66SBilly Tsai PIN(M16), 5124af4eb66SBilly Tsai PIN(A15), 5134af4eb66SBilly Tsai PIN(G11), 5144af4eb66SBilly Tsai PIN(H7), 5154af4eb66SBilly Tsai PIN(H8), 5164af4eb66SBilly Tsai PIN(H9), 5174af4eb66SBilly Tsai PIN(H10), 5184af4eb66SBilly Tsai PIN(H11), 5194af4eb66SBilly Tsai PIN(J9), 5204af4eb66SBilly Tsai PIN(J10), 5214af4eb66SBilly Tsai PIN(E9), 5224af4eb66SBilly Tsai PIN(F9), 5234af4eb66SBilly Tsai PIN(F8), 5244af4eb66SBilly Tsai PIN(M13), 5254af4eb66SBilly Tsai PIN(F7), 5264af4eb66SBilly Tsai PIN(D8), 5274af4eb66SBilly Tsai PIN(E8), 5284af4eb66SBilly Tsai PIN(L12), 5294af4eb66SBilly Tsai PIN(F12), 5304af4eb66SBilly Tsai PIN(E12), 5314af4eb66SBilly Tsai PIN(J12), 5324af4eb66SBilly Tsai PIN(G7), 5334af4eb66SBilly Tsai PIN(G8), 5344af4eb66SBilly Tsai PIN(G9), 5354af4eb66SBilly Tsai PIN(G10), 5364af4eb66SBilly Tsai PIN(K12), 5374af4eb66SBilly Tsai PIN(W17), 5384af4eb66SBilly Tsai PIN(V18), 5394af4eb66SBilly Tsai PIN(W18), 5404af4eb66SBilly Tsai PIN(Y17), 5414af4eb66SBilly Tsai PIN(AA18), 5424af4eb66SBilly Tsai PIN(AA13), 5434af4eb66SBilly Tsai PIN(Y18), 5444af4eb66SBilly Tsai PIN(AA12), 5454af4eb66SBilly Tsai PIN(W20), 5464af4eb66SBilly Tsai PIN(V20), 5474af4eb66SBilly Tsai PIN(Y11), 5484af4eb66SBilly Tsai PIN(V14), 5494af4eb66SBilly Tsai PIN(V19), 5504af4eb66SBilly Tsai PIN(W14), 5514af4eb66SBilly Tsai PIN(Y20), 5524af4eb66SBilly Tsai PIN(AB19), 5534af4eb66SBilly Tsai PIN(U21), 5544af4eb66SBilly Tsai PIN(T24), 5554af4eb66SBilly Tsai PIN(V24), 5564af4eb66SBilly Tsai PIN(V22), 5574af4eb66SBilly Tsai PIN(T23), 5584af4eb66SBilly Tsai PIN(AC25), 5594af4eb66SBilly Tsai PIN(AB25), 5604af4eb66SBilly Tsai PIN(AC24), 5614af4eb66SBilly Tsai PIN(PCIERC2_PERST), 5624af4eb66SBilly Tsai PIN(PORTC_MODE), 5634af4eb66SBilly Tsai PIN(PORTD_MODE), 5644af4eb66SBilly Tsai PIN(SGMII0), 5654af4eb66SBilly Tsai }; 5664af4eb66SBilly Tsai 5674af4eb66SBilly Tsai static const struct pinctrl_ops aspeed_g7_soc1_pctl_ops = { 5684af4eb66SBilly Tsai .get_groups_count = pinctrl_generic_get_group_count, 5694af4eb66SBilly Tsai .get_group_name = pinctrl_generic_get_group_name, 5704af4eb66SBilly Tsai .get_group_pins = pinctrl_generic_get_group_pins, 5714af4eb66SBilly Tsai .dt_node_to_map = pinconf_generic_dt_node_to_map_all, 5724af4eb66SBilly Tsai .dt_free_map = pinctrl_utils_free_map, 5734af4eb66SBilly Tsai }; 5744af4eb66SBilly Tsai 5754af4eb66SBilly Tsai struct aspeed_g7_soc1_function { 5764af4eb66SBilly Tsai struct pinfunction pinfunction; 5774af4eb66SBilly Tsai const u8 *muxvals; 5784af4eb66SBilly Tsai }; 5794af4eb66SBilly Tsai 5804af4eb66SBilly Tsai static int aspeed_g7_soc1_drive_strength_to_hw(u32 strength, 5814af4eb66SBilly Tsai unsigned int *val) 5824af4eb66SBilly Tsai { 5834af4eb66SBilly Tsai if (strength < ASPEED_G7_SOC1_DRV_STRENGTH_MIN_MA || 5844af4eb66SBilly Tsai strength > ASPEED_G7_SOC1_DRV_STRENGTH_MAX_MA || 5854af4eb66SBilly Tsai strength % ASPEED_G7_SOC1_DRV_STRENGTH_STEP_MA) 5864af4eb66SBilly Tsai return -EINVAL; 5874af4eb66SBilly Tsai 5884af4eb66SBilly Tsai *val = (strength / ASPEED_G7_SOC1_DRV_STRENGTH_STEP_MA) - 5894af4eb66SBilly Tsai ASPEED_G7_SOC1_DRV_STRENGTH_HW_BASE; 5904af4eb66SBilly Tsai 5914af4eb66SBilly Tsai return 0; 5924af4eb66SBilly Tsai } 5934af4eb66SBilly Tsai 5944af4eb66SBilly Tsai static int aspeed_g7_soc1_set_mux(struct pinctrl_dev *pctldev, 5954af4eb66SBilly Tsai unsigned int fselector, unsigned int group) 5964af4eb66SBilly Tsai { 5974af4eb66SBilly Tsai struct aspeed_g7_soc1_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 5984af4eb66SBilly Tsai const struct aspeed_g7_soc1_function *soc1_func; 5994af4eb66SBilly Tsai const struct function_desc *fd; 6004af4eb66SBilly Tsai const struct pinfunction *func; 6014af4eb66SBilly Tsai const struct pingroup *grp; 6024af4eb66SBilly Tsai struct group_desc *gd; 6034af4eb66SBilly Tsai const char *gname; 6044af4eb66SBilly Tsai int i, g_idx = -1, ret; 6054af4eb66SBilly Tsai 6064af4eb66SBilly Tsai gd = pinctrl_generic_get_group(pctldev, group); 6074af4eb66SBilly Tsai if (!gd) 6084af4eb66SBilly Tsai return -EINVAL; 6094af4eb66SBilly Tsai 6104af4eb66SBilly Tsai grp = &gd->grp; 6114af4eb66SBilly Tsai 6124af4eb66SBilly Tsai fd = pinmux_generic_get_function(pctldev, fselector); 6134af4eb66SBilly Tsai if (!fd) 6144af4eb66SBilly Tsai return -EINVAL; 6154af4eb66SBilly Tsai 6164af4eb66SBilly Tsai soc1_func = fd->data; 6174af4eb66SBilly Tsai if (!soc1_func) 6184af4eb66SBilly Tsai return -EINVAL; 6194af4eb66SBilly Tsai 6204af4eb66SBilly Tsai func = &soc1_func->pinfunction; 6214af4eb66SBilly Tsai gname = grp->name; 6224af4eb66SBilly Tsai 6234af4eb66SBilly Tsai for (i = 0; i < func->ngroups; i++) { 6244af4eb66SBilly Tsai if (!strcmp(gname, func->groups[i])) { 6254af4eb66SBilly Tsai g_idx = i; 6264af4eb66SBilly Tsai break; 6274af4eb66SBilly Tsai } 6284af4eb66SBilly Tsai } 6294af4eb66SBilly Tsai 6304af4eb66SBilly Tsai if (g_idx < 0) 6314af4eb66SBilly Tsai return -EINVAL; 6324af4eb66SBilly Tsai 6334af4eb66SBilly Tsai for (i = 0; i < grp->npins; i++) { 6344af4eb66SBilly Tsai unsigned int val = soc1_func->muxvals[g_idx]; 6354af4eb66SBilly Tsai unsigned int pin = grp->pins[i]; 6364af4eb66SBilly Tsai struct aspeed_g7_field field; 6374af4eb66SBilly Tsai 6384af4eb66SBilly Tsai if (pin == PCIERC2_PERST) { 6394af4eb66SBilly Tsai /* 6404af4eb66SBilly Tsai * PCIERC2_PERST is a special case: it is managed by a 6414af4eb66SBilly Tsai * dedicated control register (0x908) instead of the 6424af4eb66SBilly Tsai * standard 4-bit multi-function field. 6434af4eb66SBilly Tsai */ 6444af4eb66SBilly Tsai field.reg = ASPEED_G7_SOC1_PCIE_REG; 6454af4eb66SBilly Tsai field.shift = 0; 6464af4eb66SBilly Tsai field.mask = 0x1; 6474af4eb66SBilly Tsai val = 1; 6484af4eb66SBilly Tsai } else if (pin == PORTC_MODE || pin == PORTD_MODE) { 6494af4eb66SBilly Tsai /* 6504af4eb66SBilly Tsai * PORTC_MODE and PORTD_MODE are virtual "pins" that 6514af4eb66SBilly Tsai * control the USB 2.0 controller mode settings. 6524af4eb66SBilly Tsai * These reside in a specific control register (0x3B0) 6534af4eb66SBilly Tsai * with non-standard bit widths. 6544af4eb66SBilly Tsai */ 6554af4eb66SBilly Tsai field.reg = ASPEED_G7_SOC1_USB_MODE_REG; 6564af4eb66SBilly Tsai field.mask = 0x3; 6574af4eb66SBilly Tsai field.shift = pin == PORTC_MODE ? 0 : 2; 6584af4eb66SBilly Tsai } else if (pin == SGMII0) { 6594af4eb66SBilly Tsai /* 6604af4eb66SBilly Tsai * SGMII0 is a virtual pin whose mux control resides at 6614af4eb66SBilly Tsai * SCU47C bit 0, outside the contiguous pin-indexed MUX 6624af4eb66SBilly Tsai * register range starting at MUX_BASE. The field is 6634af4eb66SBilly Tsai * 1 bit wide; use a 1-bit mask to avoid clobbering 6644af4eb66SBilly Tsai * adjacent bits in SCU47C. 6654af4eb66SBilly Tsai */ 6664af4eb66SBilly Tsai field.reg = ASPEED_G7_SOC1_SGMII_REG; 6674af4eb66SBilly Tsai field.shift = 0; 6684af4eb66SBilly Tsai field.mask = 0x1; 6694af4eb66SBilly Tsai } else { 6704af4eb66SBilly Tsai /* Standard 4-bit-per-pin multi-function configuration */ 6714af4eb66SBilly Tsai field = aspeed_g7_soc1_pinmux_field_from_pin(pin); 6724af4eb66SBilly Tsai } 6734af4eb66SBilly Tsai 6744af4eb66SBilly Tsai dev_dbg(pctl->dev, 6754af4eb66SBilly Tsai "Setting pin %u reg 0x%x shift %u to function %s (muxval=0x%x)\n", 6764af4eb66SBilly Tsai pin, field.reg, field.shift, func->name, val); 6774af4eb66SBilly Tsai 6784af4eb66SBilly Tsai ret = regmap_update_bits(pctl->regmap, field.reg, 6794af4eb66SBilly Tsai field.mask << field.shift, 6804af4eb66SBilly Tsai val << field.shift); 6814af4eb66SBilly Tsai if (ret) 6824af4eb66SBilly Tsai return ret; 6834af4eb66SBilly Tsai } 6844af4eb66SBilly Tsai 6854af4eb66SBilly Tsai return 0; 6864af4eb66SBilly Tsai } 6874af4eb66SBilly Tsai 6884af4eb66SBilly Tsai static int aspeed_g7_soc1_gpio_request_enable(struct pinctrl_dev *pctldev, 6894af4eb66SBilly Tsai struct pinctrl_gpio_range *range, 6904af4eb66SBilly Tsai unsigned int pin) 6914af4eb66SBilly Tsai { 6924af4eb66SBilly Tsai struct aspeed_g7_soc1_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 6934af4eb66SBilly Tsai struct aspeed_g7_field field; 694*be3ee6e6SBilly Tsai unsigned int val = 0; 6954af4eb66SBilly Tsai int ret = -ENOTSUPP; 6964af4eb66SBilly Tsai 6974af4eb66SBilly Tsai if (pin <= AC24) { 698*be3ee6e6SBilly Tsai /* 699*be3ee6e6SBilly Tsai * Balls W17 through AB19 are the ADC-capable pins: mux 700*be3ee6e6SBilly Tsai * function 0 selects the ADC input and function 1 selects 701*be3ee6e6SBilly Tsai * GPIO, unlike all other pins where function 0 is GPIO. 702*be3ee6e6SBilly Tsai */ 703*be3ee6e6SBilly Tsai if (pin >= W17 && pin <= AB19) 704*be3ee6e6SBilly Tsai val = 1; 7054af4eb66SBilly Tsai field = aspeed_g7_soc1_pinmux_field_from_pin(pin); 7064af4eb66SBilly Tsai ret = regmap_update_bits(pctl->regmap, field.reg, 707*be3ee6e6SBilly Tsai field.mask << field.shift, 708*be3ee6e6SBilly Tsai val << field.shift); 7094af4eb66SBilly Tsai } 7104af4eb66SBilly Tsai 7114af4eb66SBilly Tsai return ret; 7124af4eb66SBilly Tsai } 7134af4eb66SBilly Tsai 7144af4eb66SBilly Tsai static const struct pinmux_ops aspeed_g7_soc1_pmx_ops = { 7154af4eb66SBilly Tsai .get_functions_count = pinmux_generic_get_function_count, 7164af4eb66SBilly Tsai .get_function_name = pinmux_generic_get_function_name, 7174af4eb66SBilly Tsai .get_function_groups = pinmux_generic_get_function_groups, 7184af4eb66SBilly Tsai .set_mux = aspeed_g7_soc1_set_mux, 7194af4eb66SBilly Tsai .gpio_request_enable = aspeed_g7_soc1_gpio_request_enable, 7204af4eb66SBilly Tsai .strict = true, 7214af4eb66SBilly Tsai }; 7224af4eb66SBilly Tsai 7234af4eb66SBilly Tsai /* 7244af4eb66SBilly Tsai * aspeed_g7_soc1_drv_map - Mapping table for pin drive strength control. 7254af4eb66SBilly Tsai * 7264af4eb66SBilly Tsai * In AST2700 SOC1, drive strength configuration is architecturally decoupled 7274af4eb66SBilly Tsai * from the main pin mux registers (0x400 range). It is managed by a separate 7284af4eb66SBilly Tsai * set of registers starting at 0x4C0. 7294af4eb66SBilly Tsai * 7304af4eb66SBilly Tsai * This table is required because: 7314af4eb66SBilly Tsai * 1. The mapping between physical pin IDs and drive strength control slots 7324af4eb66SBilly Tsai * is non-linear and sparse. 7334af4eb66SBilly Tsai * For example, W25 maps to field index 8 (stored as 9), 7344af4eb66SBilly Tsai * meaning it occupies bits [17:16] of the first 0x4C0 register. 7354af4eb66SBilly Tsai * 2. Only a subset of physical pins supports drive strength configuration. 7364af4eb66SBilly Tsai * 7374af4eb66SBilly Tsai * The table stores (drive strength field index + 1). 7384af4eb66SBilly Tsai * The field index refers to the 2-bit drive strength field position within the 7394af4eb66SBilly Tsai * 0x4C0 register range. A value of 0 indicates that the pin does not support 7404af4eb66SBilly Tsai * drive strength configuration (returning -ENOTSUPP). 7414af4eb66SBilly Tsai * This +1 offset allows us to rely on C's default zero-initialization for 7424af4eb66SBilly Tsai * unsupported pins while avoiding compiler warnings regarding overridden 7434af4eb66SBilly Tsai * initializers. 7444af4eb66SBilly Tsai */ 7454af4eb66SBilly Tsai static const int aspeed_g7_soc1_drv_map[ASPEED_G7_SOC1_NR_PINS] = { 7464af4eb66SBilly Tsai [C16] = 1, [C14] = 2, [C11] = 3, [D9] = 4, [F14] = 5, [D10] = 6, [C12] = 7, 7474af4eb66SBilly Tsai [C13] = 8, [W25] = 9, [Y23] = 10, [Y24] = 11, [W21] = 12, [AA23] = 13, [AC22] = 14, 7484af4eb66SBilly Tsai [AB22] = 15, [Y21] = 16, [AE20] = 17, [AF19] = 18, [Y22] = 19, [AA20] = 20, [AA22] = 21, 7494af4eb66SBilly Tsai [AB20] = 22, [AF18] = 23, [AE19] = 24, [AD20] = 25, [AC20] = 26, [AA21] = 27, [AB21] = 28, 7504af4eb66SBilly Tsai [AC19] = 29, [AE18] = 30, [AD19] = 31, [AD18] = 32, [U25] = 33, [U26] = 34, [Y26] = 35, 7514af4eb66SBilly Tsai [AA24] = 36, [R25] = 37, [AA26] = 38, [R26] = 39, [Y25] = 40, [B16] = 41, [D14] = 42, 7524af4eb66SBilly Tsai [B15] = 43, [B14] = 44, [C17] = 45, [B13] = 46, [E14] = 47, [C15] = 48, [D24] = 49, 7534af4eb66SBilly Tsai [B23] = 50, [B22] = 51, [C23] = 52, [B18] = 53, [B21] = 54, [M15] = 55, [B19] = 56, 7544af4eb66SBilly Tsai [B26] = 57, [A25] = 58, [A24] = 59, [B24] = 60, [E26] = 61, [A21] = 62, [A19] = 63, 7554af4eb66SBilly Tsai [A18] = 64, [D26] = 65, [C26] = 66, [A23] = 67, [A22] = 68, [B25] = 69, [F26] = 70, 7564af4eb66SBilly Tsai [A26] = 71, [A14] = 72, [E10] = 73, [E13] = 74, [D12] = 75, [F10] = 76, [E11] = 77, 7574af4eb66SBilly Tsai [F11] = 78, [F13] = 79, [N15] = 80, [C20] = 81, [C19] = 82, [A8] = 83, [R14] = 84, 7584af4eb66SBilly Tsai [A7] = 85, [P14] = 86, [D20] = 87, [A6] = 88, [B6] = 89, [N14] = 90, [B7] = 91, 7594af4eb66SBilly Tsai [B8] = 92, [B9] = 93, [M14] = 94, [J11] = 95, [E7] = 96, [D19] = 97, [B11] = 98, 7604af4eb66SBilly Tsai [D15] = 99, [B12] = 100, [B10] = 101, [P13] = 102, [C18] = 103, [C6] = 104, [C7] = 105, 7614af4eb66SBilly Tsai [D7] = 106, [N13] = 107, [C8] = 108, [C9] = 109, [C10] = 110, [M16] = 111, [A15] = 112, 7624af4eb66SBilly Tsai [E9] = 113, [F9] = 114, [F8] = 115, [M13] = 116, [F7] = 117, [D8] = 118, [E8] = 119, 7634af4eb66SBilly Tsai [L12] = 120, 7644af4eb66SBilly Tsai }; 7654af4eb66SBilly Tsai 7664af4eb66SBilly Tsai static int aspeed_g7_soc1_pin_config_get(struct pinctrl_dev *pctldev, 7674af4eb66SBilly Tsai unsigned int pin, 7684af4eb66SBilly Tsai unsigned long *config) 7694af4eb66SBilly Tsai { 7704af4eb66SBilly Tsai struct aspeed_g7_soc1_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 7714af4eb66SBilly Tsai enum pin_config_param param = pinconf_to_config_param(*config); 7724af4eb66SBilly Tsai struct aspeed_g7_field field; 7734af4eb66SBilly Tsai unsigned int val, val_raw; 7744af4eb66SBilly Tsai int ret, ds_idx; 7754af4eb66SBilly Tsai 7764af4eb66SBilly Tsai if (pin > AC24) 7774af4eb66SBilly Tsai return -EINVAL; 7784af4eb66SBilly Tsai 7794af4eb66SBilly Tsai switch (param) { 7804af4eb66SBilly Tsai case PIN_CONFIG_BIAS_DISABLE: 7814af4eb66SBilly Tsai field = aspeed_g7_soc1_bias_field_from_pin(pin); 7824af4eb66SBilly Tsai break; 7834af4eb66SBilly Tsai case PIN_CONFIG_BIAS_PULL_DOWN: 7844af4eb66SBilly Tsai case PIN_CONFIG_BIAS_PULL_UP: 7854af4eb66SBilly Tsai /* 7864af4eb66SBilly Tsai * The hardware has a single 1-bit enable/disable field per 7874af4eb66SBilly Tsai * pin; pull direction is fixed in silicon and cannot be read 7884af4eb66SBilly Tsai * back from the register. Reject readback requests for a 7894af4eb66SBilly Tsai * specific pull direction. 7904af4eb66SBilly Tsai */ 7914af4eb66SBilly Tsai return -ENOTSUPP; 7924af4eb66SBilly Tsai case PIN_CONFIG_DRIVE_STRENGTH: 7934af4eb66SBilly Tsai ds_idx = aspeed_g7_soc1_drv_map[pin]; 7944af4eb66SBilly Tsai if (!ds_idx) 7954af4eb66SBilly Tsai return -ENOTSUPP; 7964af4eb66SBilly Tsai ds_idx--; /* Adjust back to 0-based hardware index */ 7974af4eb66SBilly Tsai field = aspeed_g7_soc1_drv_field_from_idx(ds_idx); 7984af4eb66SBilly Tsai break; 7994af4eb66SBilly Tsai default: 8004af4eb66SBilly Tsai return -ENOTSUPP; 8014af4eb66SBilly Tsai } 8024af4eb66SBilly Tsai 8034af4eb66SBilly Tsai ret = regmap_read(pctl->regmap, field.reg, &val_raw); 8044af4eb66SBilly Tsai if (ret) 8054af4eb66SBilly Tsai return ret; 8064af4eb66SBilly Tsai 8074af4eb66SBilly Tsai val = (val_raw & (field.mask << field.shift)) >> field.shift; 8084af4eb66SBilly Tsai if (param == PIN_CONFIG_DRIVE_STRENGTH) 8094af4eb66SBilly Tsai val = (val + ASPEED_G7_SOC1_DRV_STRENGTH_HW_BASE) * 8104af4eb66SBilly Tsai ASPEED_G7_SOC1_DRV_STRENGTH_STEP_MA; 8114af4eb66SBilly Tsai 8124af4eb66SBilly Tsai if (!val) 8134af4eb66SBilly Tsai return -EINVAL; 8144af4eb66SBilly Tsai 8154af4eb66SBilly Tsai *config = pinconf_to_config_packed(param, val); 8164af4eb66SBilly Tsai 8174af4eb66SBilly Tsai return 0; 8184af4eb66SBilly Tsai } 8194af4eb66SBilly Tsai 8204af4eb66SBilly Tsai static int aspeed_g7_soc1_pin_config_set(struct pinctrl_dev *pctldev, 8214af4eb66SBilly Tsai unsigned int pin, 8224af4eb66SBilly Tsai unsigned long *configs, 8234af4eb66SBilly Tsai unsigned int num_configs) 8244af4eb66SBilly Tsai { 8254af4eb66SBilly Tsai struct aspeed_g7_soc1_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 8264af4eb66SBilly Tsai struct aspeed_g7_field field; 8274af4eb66SBilly Tsai enum pin_config_param param; 8284af4eb66SBilly Tsai int i, ret, ds_idx; 8294af4eb66SBilly Tsai unsigned int val; 8304af4eb66SBilly Tsai u32 arg; 8314af4eb66SBilly Tsai 8324af4eb66SBilly Tsai if (pin > AC24) 8334af4eb66SBilly Tsai return -EINVAL; 8344af4eb66SBilly Tsai 8354af4eb66SBilly Tsai for (i = 0; i < num_configs; i++) { 8364af4eb66SBilly Tsai param = pinconf_to_config_param(configs[i]); 8374af4eb66SBilly Tsai arg = pinconf_to_config_argument(configs[i]); 8384af4eb66SBilly Tsai 8394af4eb66SBilly Tsai switch (param) { 8404af4eb66SBilly Tsai case PIN_CONFIG_BIAS_PULL_DOWN: 8414af4eb66SBilly Tsai case PIN_CONFIG_BIAS_PULL_UP: 8424af4eb66SBilly Tsai /* 8434af4eb66SBilly Tsai * The hardware has one enable/disable bit per pin; 8444af4eb66SBilly Tsai * pull direction is fixed in silicon. Both PULL_UP 8454af4eb66SBilly Tsai * and PULL_DOWN map to "enable bias"; the caller must 8464af4eb66SBilly Tsai * request the direction that the hardware provides. 8474af4eb66SBilly Tsai */ 8484af4eb66SBilly Tsai case PIN_CONFIG_BIAS_DISABLE: 8494af4eb66SBilly Tsai field = aspeed_g7_soc1_bias_field_from_pin(pin); 8504af4eb66SBilly Tsai val = (param == PIN_CONFIG_BIAS_DISABLE) ? 1 : 0; 8514af4eb66SBilly Tsai break; 8524af4eb66SBilly Tsai case PIN_CONFIG_DRIVE_STRENGTH: 8534af4eb66SBilly Tsai ds_idx = aspeed_g7_soc1_drv_map[pin]; 8544af4eb66SBilly Tsai if (!ds_idx) 8554af4eb66SBilly Tsai return -ENOTSUPP; 8564af4eb66SBilly Tsai ds_idx--; /* Adjust back to 0-based hardware index */ 8574af4eb66SBilly Tsai field = aspeed_g7_soc1_drv_field_from_idx(ds_idx); 8584af4eb66SBilly Tsai ret = aspeed_g7_soc1_drive_strength_to_hw(arg, &val); 8594af4eb66SBilly Tsai if (ret) 8604af4eb66SBilly Tsai return ret; 8614af4eb66SBilly Tsai break; 8624af4eb66SBilly Tsai default: 8634af4eb66SBilly Tsai return -ENOTSUPP; 8644af4eb66SBilly Tsai } 8654af4eb66SBilly Tsai 8664af4eb66SBilly Tsai dev_dbg(pctl->dev, 8674af4eb66SBilly Tsai "Configuring pin %u reg 0x%x shift %u param %d arg %u val 0x%x\n", 8684af4eb66SBilly Tsai pin, field.reg, field.shift, param, arg, val); 8694af4eb66SBilly Tsai 8704af4eb66SBilly Tsai ret = regmap_update_bits(pctl->regmap, field.reg, 8714af4eb66SBilly Tsai field.mask << field.shift, 8724af4eb66SBilly Tsai val << field.shift); 8734af4eb66SBilly Tsai 8744af4eb66SBilly Tsai if (ret) 8754af4eb66SBilly Tsai return ret; 8764af4eb66SBilly Tsai } 8774af4eb66SBilly Tsai 8784af4eb66SBilly Tsai return 0; 8794af4eb66SBilly Tsai } 8804af4eb66SBilly Tsai 8814af4eb66SBilly Tsai static int aspeed_g7_soc1_pin_config_group_get(struct pinctrl_dev *pctldev, 8824af4eb66SBilly Tsai unsigned int selector, 8834af4eb66SBilly Tsai unsigned long *config) 8844af4eb66SBilly Tsai { 8854af4eb66SBilly Tsai const unsigned int *pins; 8864af4eb66SBilly Tsai unsigned int npins; 8874af4eb66SBilly Tsai int ret; 8884af4eb66SBilly Tsai 8894af4eb66SBilly Tsai ret = pinctrl_generic_get_group_pins(pctldev, selector, &pins, &npins); 8904af4eb66SBilly Tsai if (ret) 8914af4eb66SBilly Tsai return ret; 8924af4eb66SBilly Tsai if (!npins) 8934af4eb66SBilly Tsai return -ENODEV; 8944af4eb66SBilly Tsai 8954af4eb66SBilly Tsai return aspeed_g7_soc1_pin_config_get(pctldev, pins[0], config); 8964af4eb66SBilly Tsai } 8974af4eb66SBilly Tsai 8984af4eb66SBilly Tsai static int aspeed_g7_soc1_pin_config_group_set(struct pinctrl_dev *pctldev, 8994af4eb66SBilly Tsai unsigned int selector, 9004af4eb66SBilly Tsai unsigned long *configs, 9014af4eb66SBilly Tsai unsigned int num_configs) 9024af4eb66SBilly Tsai { 9034af4eb66SBilly Tsai const unsigned int *pins; 9044af4eb66SBilly Tsai unsigned int npins; 9054af4eb66SBilly Tsai int ret; 9064af4eb66SBilly Tsai int i; 9074af4eb66SBilly Tsai 9084af4eb66SBilly Tsai ret = pinctrl_generic_get_group_pins(pctldev, selector, &pins, &npins); 9094af4eb66SBilly Tsai if (ret) 9104af4eb66SBilly Tsai return ret; 9114af4eb66SBilly Tsai 9124af4eb66SBilly Tsai for (i = 0; i < npins; i++) { 9134af4eb66SBilly Tsai ret = aspeed_g7_soc1_pin_config_set(pctldev, pins[i], configs, 9144af4eb66SBilly Tsai num_configs); 9154af4eb66SBilly Tsai if (ret) 9164af4eb66SBilly Tsai return ret; 9174af4eb66SBilly Tsai } 9184af4eb66SBilly Tsai 9194af4eb66SBilly Tsai return 0; 9204af4eb66SBilly Tsai } 9214af4eb66SBilly Tsai 9224af4eb66SBilly Tsai static const struct pinconf_ops aspeed_g7_soc1_conf_ops = { 9234af4eb66SBilly Tsai .is_generic = true, 9244af4eb66SBilly Tsai .pin_config_get = aspeed_g7_soc1_pin_config_get, 9254af4eb66SBilly Tsai .pin_config_set = aspeed_g7_soc1_pin_config_set, 9264af4eb66SBilly Tsai .pin_config_group_get = aspeed_g7_soc1_pin_config_group_get, 9274af4eb66SBilly Tsai .pin_config_group_set = aspeed_g7_soc1_pin_config_group_set, 9284af4eb66SBilly Tsai .pin_config_config_dbg_show = pinconf_generic_dump_config, 9294af4eb66SBilly Tsai }; 9304af4eb66SBilly Tsai 9314af4eb66SBilly Tsai static const struct pinctrl_desc aspeed_g7_soc1_desc = { 9324af4eb66SBilly Tsai .name = "aspeed-g7-soc1-pinctrl", 9334af4eb66SBilly Tsai .pins = aspeed_g7_soc1_pins, 9344af4eb66SBilly Tsai .npins = ARRAY_SIZE(aspeed_g7_soc1_pins), 9354af4eb66SBilly Tsai .pctlops = &aspeed_g7_soc1_pctl_ops, 9364af4eb66SBilly Tsai .pmxops = &aspeed_g7_soc1_pmx_ops, 9374af4eb66SBilly Tsai .confops = &aspeed_g7_soc1_conf_ops, 9384af4eb66SBilly Tsai .owner = THIS_MODULE, 9394af4eb66SBilly Tsai }; 9404af4eb66SBilly Tsai 9414af4eb66SBilly Tsai #define PIN_GROUP(name, ...) static const unsigned int name ## _pins[] = { __VA_ARGS__ } 9424af4eb66SBilly Tsai 9434af4eb66SBilly Tsai /* Pin Groups and Functions */ 9444af4eb66SBilly Tsai PIN_GROUP(ADC0, W17); 9454af4eb66SBilly Tsai PIN_GROUP(ADC1, V18); 9464af4eb66SBilly Tsai PIN_GROUP(ADC10, Y11); 9474af4eb66SBilly Tsai PIN_GROUP(ADC11, V14); 9484af4eb66SBilly Tsai PIN_GROUP(ADC12, V19); 9494af4eb66SBilly Tsai PIN_GROUP(ADC13, W14); 9504af4eb66SBilly Tsai PIN_GROUP(ADC14, Y20); 9514af4eb66SBilly Tsai PIN_GROUP(ADC15, AB19); 9524af4eb66SBilly Tsai PIN_GROUP(ADC2, W18); 9534af4eb66SBilly Tsai PIN_GROUP(ADC3, Y17); 9544af4eb66SBilly Tsai PIN_GROUP(ADC4, AA18); 9554af4eb66SBilly Tsai PIN_GROUP(ADC5, AA13); 9564af4eb66SBilly Tsai PIN_GROUP(ADC6, Y18); 9574af4eb66SBilly Tsai PIN_GROUP(ADC7, AA12); 9584af4eb66SBilly Tsai PIN_GROUP(ADC8, W20); 9594af4eb66SBilly Tsai PIN_GROUP(ADC9, V20); 9604af4eb66SBilly Tsai PIN_GROUP(AUXPWRGOOD0, W14); 9614af4eb66SBilly Tsai PIN_GROUP(AUXPWRGOOD1, Y20); 9624af4eb66SBilly Tsai PIN_GROUP(CANBUS, G7, G8, G9); 9634af4eb66SBilly Tsai PIN_GROUP(DI2C0, C16, D9); 9644af4eb66SBilly Tsai PIN_GROUP(DI2C1, C14, F14); 9654af4eb66SBilly Tsai PIN_GROUP(DI2C10, R25, AA26); 9664af4eb66SBilly Tsai PIN_GROUP(DI2C11, R26, Y25); 9674af4eb66SBilly Tsai PIN_GROUP(DI2C12, W25, Y23); 9684af4eb66SBilly Tsai PIN_GROUP(DI2C13, Y24, W21); 9694af4eb66SBilly Tsai PIN_GROUP(DI2C14, AA23, AC22); 9704af4eb66SBilly Tsai PIN_GROUP(DI2C15, AB22, Y21); 9714af4eb66SBilly Tsai PIN_GROUP(DI2C2, D10, C12); 9724af4eb66SBilly Tsai PIN_GROUP(DI2C3, C11, C13); 9734af4eb66SBilly Tsai PIN_GROUP(DI2C8, U25, U26); 9744af4eb66SBilly Tsai PIN_GROUP(DI2C9, Y26, AA24); 9754af4eb66SBilly Tsai PIN_GROUP(DSGPM0, D19, B10, C7, D7); 9764af4eb66SBilly Tsai PIN_GROUP(ESPI0, B16, D14, B15, B14, C17, B13, E14, C15); 9774af4eb66SBilly Tsai PIN_GROUP(ESPI1, C16, C14, C11, D9, F14, D10, C12, C13); 9784af4eb66SBilly Tsai PIN_GROUP(FSI0, AD20, AC20); 9794af4eb66SBilly Tsai PIN_GROUP(FSI1, AA21, AB21); 9804af4eb66SBilly Tsai PIN_GROUP(FSI2, AC19, AE18); 9814af4eb66SBilly Tsai PIN_GROUP(FSI3, AD19, AD18); 9824af4eb66SBilly Tsai PIN_GROUP(FWQSPI, M16, A15); 9834af4eb66SBilly Tsai PIN_GROUP(FWSPIABR, A14); 9844af4eb66SBilly Tsai PIN_GROUP(FWWPN, N15); 9854af4eb66SBilly Tsai PIN_GROUP(HBLED, V24); 9864af4eb66SBilly Tsai PIN_GROUP(HVI3C0, U25, U26); 9874af4eb66SBilly Tsai PIN_GROUP(HVI3C1, Y26, AA24); 9884af4eb66SBilly Tsai PIN_GROUP(HVI3C12, W25, Y23); 9894af4eb66SBilly Tsai PIN_GROUP(HVI3C13, Y24, W21); 9904af4eb66SBilly Tsai PIN_GROUP(HVI3C14, AA23, AC22); 9914af4eb66SBilly Tsai PIN_GROUP(HVI3C15, AB22, Y21); 9924af4eb66SBilly Tsai PIN_GROUP(HVI3C2, R25, AA26); 9934af4eb66SBilly Tsai PIN_GROUP(HVI3C3, R26, Y25); 9944af4eb66SBilly Tsai PIN_GROUP(I2C0, G11, H7); 9954af4eb66SBilly Tsai PIN_GROUP(I2C1, H8, H9); 9964af4eb66SBilly Tsai PIN_GROUP(I2C10, G8, G9); 9974af4eb66SBilly Tsai PIN_GROUP(I2C11, G10, K12); 9984af4eb66SBilly Tsai PIN_GROUP(I2C12, AC18, AA17); 9994af4eb66SBilly Tsai PIN_GROUP(I2C13, AB17, AD16); 10004af4eb66SBilly Tsai PIN_GROUP(I2C14, AC17, AD17); 10014af4eb66SBilly Tsai PIN_GROUP(I2C15, AE16, AE17); 10024af4eb66SBilly Tsai PIN_GROUP(I2C2, H10, H11); 10034af4eb66SBilly Tsai PIN_GROUP(I2C3, J9, J10); 10044af4eb66SBilly Tsai PIN_GROUP(I2C4, E9, F9); 10054af4eb66SBilly Tsai PIN_GROUP(I2C5, F8, M13); 10064af4eb66SBilly Tsai PIN_GROUP(I2C6, F7, D8); 10074af4eb66SBilly Tsai PIN_GROUP(I2C7, E8, L12); 10084af4eb66SBilly Tsai PIN_GROUP(I2C8, F12, E12); 10094af4eb66SBilly Tsai PIN_GROUP(I2C9, J12, G7); 10104af4eb66SBilly Tsai PIN_GROUP(I2CF0, F12, E12, J12, G7); 10114af4eb66SBilly Tsai PIN_GROUP(I2CF1, E9, F9, F8, M13); 10124af4eb66SBilly Tsai PIN_GROUP(I2CF2, F7, D8, E8, L12); 10134af4eb66SBilly Tsai PIN_GROUP(I3C10, AC19, AE18); 10144af4eb66SBilly Tsai PIN_GROUP(I3C11, AD19, AD18); 10154af4eb66SBilly Tsai PIN_GROUP(I3C4, AE20, AF19); 10164af4eb66SBilly Tsai PIN_GROUP(I3C5, Y22, AA20); 10174af4eb66SBilly Tsai PIN_GROUP(I3C6, AA22, AB20); 10184af4eb66SBilly Tsai PIN_GROUP(I3C7, AF18, AE19); 10194af4eb66SBilly Tsai PIN_GROUP(I3C8, AD20, AC20); 10204af4eb66SBilly Tsai PIN_GROUP(I3C9, AA21, AB21); 10214af4eb66SBilly Tsai PIN_GROUP(JTAGM1, D12, F10, E11, F11, F13); 10224af4eb66SBilly Tsai PIN_GROUP(LPC0, AF26, AF25, B16, D14, B15, B14, C17, B13, E14, C15); 10234af4eb66SBilly Tsai PIN_GROUP(LPC1, C16, C14, C11, D9, F14, D10, C12, C13, AE16, AE17); 10244af4eb66SBilly Tsai PIN_GROUP(LTPI, U25, U26, Y26, AA24); 10254af4eb66SBilly Tsai PIN_GROUP(LTPI_PS_I2C0, G11, H7); 10264af4eb66SBilly Tsai PIN_GROUP(LTPI_PS_I2C1, H8, H9); 10274af4eb66SBilly Tsai PIN_GROUP(LTPI_PS_I2C2, H10, H11); 10284af4eb66SBilly Tsai PIN_GROUP(LTPI_PS_I2C3, J9, J10); 10294af4eb66SBilly Tsai PIN_GROUP(MACLINK0, U21); 10304af4eb66SBilly Tsai PIN_GROUP(MACLINK1, AC24); 10314af4eb66SBilly Tsai PIN_GROUP(MACLINK2, T24); 10324af4eb66SBilly Tsai PIN_GROUP(MDIO0, B9, M14); 10334af4eb66SBilly Tsai PIN_GROUP(MDIO1, C9, C10); 10344af4eb66SBilly Tsai PIN_GROUP(MDIO2, E10, E13); 10354af4eb66SBilly Tsai PIN_GROUP(NCTS0, AF17); 10364af4eb66SBilly Tsai PIN_GROUP(NCTS1, AA15); 10374af4eb66SBilly Tsai PIN_GROUP(NCTS5, V21); 10384af4eb66SBilly Tsai PIN_GROUP(NCTS6, AB26); 10394af4eb66SBilly Tsai PIN_GROUP(NDCD0, AA16); 10404af4eb66SBilly Tsai PIN_GROUP(NDCD1, AB15); 10414af4eb66SBilly Tsai PIN_GROUP(NDCD5, N26); 10424af4eb66SBilly Tsai PIN_GROUP(NDCD6, AD26); 10434af4eb66SBilly Tsai PIN_GROUP(NDSR0, Y16); 10444af4eb66SBilly Tsai PIN_GROUP(NDSR1, AC15); 10454af4eb66SBilly Tsai PIN_GROUP(NDSR5, P25); 10464af4eb66SBilly Tsai PIN_GROUP(NDSR6, P26); 10474af4eb66SBilly Tsai PIN_GROUP(NDTR0, J13); 10484af4eb66SBilly Tsai PIN_GROUP(NDTR1, Y15); 10494af4eb66SBilly Tsai PIN_GROUP(NDTR5, V23); 10504af4eb66SBilly Tsai PIN_GROUP(NDTR6, AF26); 10514af4eb66SBilly Tsai PIN_GROUP(NRI0, V17); 10524af4eb66SBilly Tsai PIN_GROUP(NRI1, AD15); 10534af4eb66SBilly Tsai PIN_GROUP(NRI5, N25); 10544af4eb66SBilly Tsai PIN_GROUP(NRI6, AE26); 10554af4eb66SBilly Tsai PIN_GROUP(NRTS0, AB16); 10564af4eb66SBilly Tsai PIN_GROUP(NRTS1, AA14); 10574af4eb66SBilly Tsai PIN_GROUP(NRTS5, W22); 10584af4eb66SBilly Tsai PIN_GROUP(NRTS6, AF25); 10594af4eb66SBilly Tsai PIN_GROUP(OSCCLK, C17); 10604af4eb66SBilly Tsai PIN_GROUP(PE2SGRSTN, E10, PCIERC2_PERST); 10614af4eb66SBilly Tsai PIN_GROUP(PWM0, AE25); 10624af4eb66SBilly Tsai PIN_GROUP(PWM1, AD25); 10634af4eb66SBilly Tsai PIN_GROUP(PWM10, AB17); 10644af4eb66SBilly Tsai PIN_GROUP(PWM11, AD16); 10654af4eb66SBilly Tsai PIN_GROUP(PWM12, AC17); 10664af4eb66SBilly Tsai PIN_GROUP(PWM13, AD17); 10674af4eb66SBilly Tsai PIN_GROUP(PWM14, AE16); 10684af4eb66SBilly Tsai PIN_GROUP(PWM15, AE17); 10694af4eb66SBilly Tsai PIN_GROUP(PWM2, AF23); 10704af4eb66SBilly Tsai PIN_GROUP(PWM3, AF20); 10714af4eb66SBilly Tsai PIN_GROUP(PWM4, AF21); 10724af4eb66SBilly Tsai PIN_GROUP(PWM5, AE21); 10734af4eb66SBilly Tsai PIN_GROUP(PWM6, AE23); 10744af4eb66SBilly Tsai PIN_GROUP(PWM7, AD22); 10754af4eb66SBilly Tsai PIN_GROUP(PWM8, K13); 10764af4eb66SBilly Tsai PIN_GROUP(PWM9, AA17); 10774af4eb66SBilly Tsai PIN_GROUP(QSPI0, C23, B18); 10784af4eb66SBilly Tsai PIN_GROUP(QSPI1, B24, E26); 10794af4eb66SBilly Tsai PIN_GROUP(QSPI2, B25, F26); 10804af4eb66SBilly Tsai PIN_GROUP(RGMII0, C20, C19, A8, R14, A7, P14, D20, A6, B6, N14, B7, B8); 10814af4eb66SBilly Tsai PIN_GROUP(RGMII1, D19, B11, D15, B12, B10, P13, C18, C6, C7, D7, N13, C8); 10824af4eb66SBilly Tsai PIN_GROUP(RMII0, C20, A8, R14, A7, P14, A6, B6, N14); 10834af4eb66SBilly Tsai PIN_GROUP(RMII0RCLKO, D20); 10844af4eb66SBilly Tsai PIN_GROUP(RMII1, D19, D15, B12, B10, P13, C6, C7, D7); 10854af4eb66SBilly Tsai PIN_GROUP(RMII1RCLKO, C18); 10864af4eb66SBilly Tsai PIN_GROUP(SALT0, AC17); 10874af4eb66SBilly Tsai PIN_GROUP(SALT1, AD17); 10884af4eb66SBilly Tsai PIN_GROUP(SALT10, Y18); 10894af4eb66SBilly Tsai PIN_GROUP(SALT11, AA12); 10904af4eb66SBilly Tsai PIN_GROUP(SALT12, AB26); 10914af4eb66SBilly Tsai PIN_GROUP(SALT13, AD26); 10924af4eb66SBilly Tsai PIN_GROUP(SALT14, P26); 10934af4eb66SBilly Tsai PIN_GROUP(SALT15, AE26); 10944af4eb66SBilly Tsai PIN_GROUP(SALT2, AC15); 10954af4eb66SBilly Tsai PIN_GROUP(SALT3, AD15); 10964af4eb66SBilly Tsai PIN_GROUP(SALT4, W17); 10974af4eb66SBilly Tsai PIN_GROUP(SALT5, V18); 10984af4eb66SBilly Tsai PIN_GROUP(SALT6, W18); 10994af4eb66SBilly Tsai PIN_GROUP(SALT7, Y17); 11004af4eb66SBilly Tsai PIN_GROUP(SALT8, AA18); 11014af4eb66SBilly Tsai PIN_GROUP(SALT9, AA13); 11024af4eb66SBilly Tsai PIN_GROUP(SD, C16, C14, C11, D9, F14, D10, C12, C13); 11034af4eb66SBilly Tsai PIN_GROUP(SGMII, SGMII0); 11044af4eb66SBilly Tsai PIN_GROUP(SGPM0, U21, T24, V22, T23); 11054af4eb66SBilly Tsai PIN_GROUP(SGPM1, AC25, AB25, AB24, W26); 11064af4eb66SBilly Tsai PIN_GROUP(SGPS, B11, C18, N13, C8); 11074af4eb66SBilly Tsai PIN_GROUP(SIOONCTRLN0, AE23); 11084af4eb66SBilly Tsai PIN_GROUP(SIOONCTRLN1, AA15); 11094af4eb66SBilly Tsai PIN_GROUP(SIOPBIN0, AD25); 11104af4eb66SBilly Tsai PIN_GROUP(SIOPBIN1, AA16); 11114af4eb66SBilly Tsai PIN_GROUP(SIOPBON0, AE25); 11124af4eb66SBilly Tsai PIN_GROUP(SIOPBON1, AF17); 11134af4eb66SBilly Tsai PIN_GROUP(SIOPWREQN0, AE21); 11144af4eb66SBilly Tsai PIN_GROUP(SIOPWREQN1, AB16); 11154af4eb66SBilly Tsai PIN_GROUP(SIOPWRGD1, AB15); 11164af4eb66SBilly Tsai PIN_GROUP(SIOS3N0, AF20); 11174af4eb66SBilly Tsai PIN_GROUP(SIOS3N1, V17); 11184af4eb66SBilly Tsai PIN_GROUP(SIOS5N0, AF21); 11194af4eb66SBilly Tsai PIN_GROUP(SIOS5N1, J13); 11204af4eb66SBilly Tsai PIN_GROUP(SIOSCIN0, AF23); 11214af4eb66SBilly Tsai PIN_GROUP(SIOSCIN1, Y16); 11224af4eb66SBilly Tsai PIN_GROUP(SMON0, U21, T24, V22, T23); 11234af4eb66SBilly Tsai PIN_GROUP(SMON1, W26, AC25, AB25); 11244af4eb66SBilly Tsai PIN_GROUP(SPI0, D24, B23, B22); 11254af4eb66SBilly Tsai PIN_GROUP(SPI0ABR, M15); 11264af4eb66SBilly Tsai PIN_GROUP(SPI0CS1, B21); 11274af4eb66SBilly Tsai PIN_GROUP(SPI0WPN, B19); 11284af4eb66SBilly Tsai PIN_GROUP(SPI1, B26, A25, A24); 11294af4eb66SBilly Tsai PIN_GROUP(SPI1ABR, A19); 11304af4eb66SBilly Tsai PIN_GROUP(SPI1CS1, A21); 11314af4eb66SBilly Tsai PIN_GROUP(SPI1WPN, A18); 11324af4eb66SBilly Tsai PIN_GROUP(SPI2, D26, C26, A23, A22); 11334af4eb66SBilly Tsai PIN_GROUP(SPI2CS1, A26); 11344af4eb66SBilly Tsai PIN_GROUP(TACH0, AC26); 11354af4eb66SBilly Tsai PIN_GROUP(TACH1, AA25); 11364af4eb66SBilly Tsai PIN_GROUP(TACH10, AB26); 11374af4eb66SBilly Tsai PIN_GROUP(TACH11, AD26); 11384af4eb66SBilly Tsai PIN_GROUP(TACH12, P26); 11394af4eb66SBilly Tsai PIN_GROUP(TACH13, AE26); 11404af4eb66SBilly Tsai PIN_GROUP(TACH14, AF26); 11414af4eb66SBilly Tsai PIN_GROUP(TACH15, AF25); 11424af4eb66SBilly Tsai PIN_GROUP(TACH2, AB23); 11434af4eb66SBilly Tsai PIN_GROUP(TACH3, U22); 11444af4eb66SBilly Tsai PIN_GROUP(TACH4, V21); 11454af4eb66SBilly Tsai PIN_GROUP(TACH5, N26); 11464af4eb66SBilly Tsai PIN_GROUP(TACH6, P25); 11474af4eb66SBilly Tsai PIN_GROUP(TACH7, N25); 11484af4eb66SBilly Tsai PIN_GROUP(TACH8, V23); 11494af4eb66SBilly Tsai PIN_GROUP(TACH9, W22); 11504af4eb66SBilly Tsai PIN_GROUP(THRU0, AC26, AA25); 11514af4eb66SBilly Tsai PIN_GROUP(THRU1, AB23, U22); 11524af4eb66SBilly Tsai PIN_GROUP(THRU2, A19, A18); 11534af4eb66SBilly Tsai PIN_GROUP(THRU3, B25, F26); 11544af4eb66SBilly Tsai PIN_GROUP(UART0, AC16, AF16); 11554af4eb66SBilly Tsai PIN_GROUP(UART1, W16, V16); 11564af4eb66SBilly Tsai PIN_GROUP(UART2, AB18, AC18); 11574af4eb66SBilly Tsai PIN_GROUP(UART3, K13, AA17); 11584af4eb66SBilly Tsai PIN_GROUP(UART5, AB17, AD16); 11594af4eb66SBilly Tsai PIN_GROUP(UART6, AC17, AD17); 11604af4eb66SBilly Tsai PIN_GROUP(UART7, AE16, AE17); 11614af4eb66SBilly Tsai PIN_GROUP(UART8, M15, B19); 11624af4eb66SBilly Tsai PIN_GROUP(UART9, B26, A25); 11634af4eb66SBilly Tsai PIN_GROUP(UART10, A24, B24); 11644af4eb66SBilly Tsai PIN_GROUP(UART11, E26, A21); 11654af4eb66SBilly Tsai PIN_GROUP(USB2CD, PORTC_MODE); 11664af4eb66SBilly Tsai PIN_GROUP(USB2CH, PORTC_MODE); 11674af4eb66SBilly Tsai PIN_GROUP(USB2CU, PORTC_MODE); 11684af4eb66SBilly Tsai PIN_GROUP(USB2CUD, PORTC_MODE); 11694af4eb66SBilly Tsai PIN_GROUP(USB2DD, PORTD_MODE); 11704af4eb66SBilly Tsai PIN_GROUP(USB2DH, PORTD_MODE); 11714af4eb66SBilly Tsai PIN_GROUP(USBUART, G10, K12); 11724af4eb66SBilly Tsai PIN_GROUP(VGA, J11, E7); 11734af4eb66SBilly Tsai PIN_GROUP(VPI, C16, C14, C11, D9, F14, D10, AC26, AA25, AB23, U22, V21, N26, 11744af4eb66SBilly Tsai P25, N25, V23, W22, AB26, AD26, P26, AE26, AF26, AF25, AE25, AD25, 11754af4eb66SBilly Tsai AF23, AF20, AF21, AE21); 11764af4eb66SBilly Tsai PIN_GROUP(WDTRST0N, K13); 11774af4eb66SBilly Tsai PIN_GROUP(WDTRST1N, AA17); 11784af4eb66SBilly Tsai PIN_GROUP(WDTRST2N, AB17); 11794af4eb66SBilly Tsai PIN_GROUP(WDTRST3N, AD16); 11804af4eb66SBilly Tsai PIN_GROUP(WDTRST4N, AC25); 11814af4eb66SBilly Tsai PIN_GROUP(WDTRST5N, AB25); 11824af4eb66SBilly Tsai PIN_GROUP(WDTRST6N, AC24); 11834af4eb66SBilly Tsai PIN_GROUP(WDTRST7N, AB24); 11844af4eb66SBilly Tsai 11854af4eb66SBilly Tsai #define GROUP(n) PINCTRL_PINGROUP(#n, n##_pins, ARRAY_SIZE(n##_pins)) 11864af4eb66SBilly Tsai 11874af4eb66SBilly Tsai static const struct pingroup aspeed_g7_soc1_groups[] = { 11884af4eb66SBilly Tsai GROUP(ADC0), 11894af4eb66SBilly Tsai GROUP(ADC1), 11904af4eb66SBilly Tsai GROUP(ADC10), 11914af4eb66SBilly Tsai GROUP(ADC11), 11924af4eb66SBilly Tsai GROUP(ADC12), 11934af4eb66SBilly Tsai GROUP(ADC13), 11944af4eb66SBilly Tsai GROUP(ADC14), 11954af4eb66SBilly Tsai GROUP(ADC15), 11964af4eb66SBilly Tsai GROUP(ADC2), 11974af4eb66SBilly Tsai GROUP(ADC3), 11984af4eb66SBilly Tsai GROUP(ADC4), 11994af4eb66SBilly Tsai GROUP(ADC5), 12004af4eb66SBilly Tsai GROUP(ADC6), 12014af4eb66SBilly Tsai GROUP(ADC7), 12024af4eb66SBilly Tsai GROUP(ADC8), 12034af4eb66SBilly Tsai GROUP(ADC9), 12044af4eb66SBilly Tsai GROUP(AUXPWRGOOD0), 12054af4eb66SBilly Tsai GROUP(AUXPWRGOOD1), 12064af4eb66SBilly Tsai GROUP(CANBUS), 12074af4eb66SBilly Tsai GROUP(DI2C0), 12084af4eb66SBilly Tsai GROUP(DI2C1), 12094af4eb66SBilly Tsai GROUP(DI2C10), 12104af4eb66SBilly Tsai GROUP(DI2C11), 12114af4eb66SBilly Tsai GROUP(DI2C12), 12124af4eb66SBilly Tsai GROUP(DI2C13), 12134af4eb66SBilly Tsai GROUP(DI2C14), 12144af4eb66SBilly Tsai GROUP(DI2C15), 12154af4eb66SBilly Tsai GROUP(DI2C2), 12164af4eb66SBilly Tsai GROUP(DI2C3), 12174af4eb66SBilly Tsai GROUP(DI2C8), 12184af4eb66SBilly Tsai GROUP(DI2C9), 12194af4eb66SBilly Tsai GROUP(DSGPM0), 12204af4eb66SBilly Tsai GROUP(ESPI0), 12214af4eb66SBilly Tsai GROUP(ESPI1), 12224af4eb66SBilly Tsai GROUP(FSI0), 12234af4eb66SBilly Tsai GROUP(FSI1), 12244af4eb66SBilly Tsai GROUP(FSI2), 12254af4eb66SBilly Tsai GROUP(FSI3), 12264af4eb66SBilly Tsai GROUP(FWQSPI), 12274af4eb66SBilly Tsai GROUP(FWSPIABR), 12284af4eb66SBilly Tsai GROUP(FWWPN), 12294af4eb66SBilly Tsai GROUP(HBLED), 12304af4eb66SBilly Tsai GROUP(HVI3C0), 12314af4eb66SBilly Tsai GROUP(HVI3C1), 12324af4eb66SBilly Tsai GROUP(HVI3C12), 12334af4eb66SBilly Tsai GROUP(HVI3C13), 12344af4eb66SBilly Tsai GROUP(HVI3C14), 12354af4eb66SBilly Tsai GROUP(HVI3C15), 12364af4eb66SBilly Tsai GROUP(HVI3C2), 12374af4eb66SBilly Tsai GROUP(HVI3C3), 12384af4eb66SBilly Tsai GROUP(I2C0), 12394af4eb66SBilly Tsai GROUP(I2C1), 12404af4eb66SBilly Tsai GROUP(I2C10), 12414af4eb66SBilly Tsai GROUP(I2C11), 12424af4eb66SBilly Tsai GROUP(I2C12), 12434af4eb66SBilly Tsai GROUP(I2C13), 12444af4eb66SBilly Tsai GROUP(I2C14), 12454af4eb66SBilly Tsai GROUP(I2C15), 12464af4eb66SBilly Tsai GROUP(I2C2), 12474af4eb66SBilly Tsai GROUP(I2C3), 12484af4eb66SBilly Tsai GROUP(I2C4), 12494af4eb66SBilly Tsai GROUP(I2C5), 12504af4eb66SBilly Tsai GROUP(I2C6), 12514af4eb66SBilly Tsai GROUP(I2C7), 12524af4eb66SBilly Tsai GROUP(I2C8), 12534af4eb66SBilly Tsai GROUP(I2C9), 12544af4eb66SBilly Tsai GROUP(I2CF0), 12554af4eb66SBilly Tsai GROUP(I2CF1), 12564af4eb66SBilly Tsai GROUP(I2CF2), 12574af4eb66SBilly Tsai GROUP(I3C10), 12584af4eb66SBilly Tsai GROUP(I3C11), 12594af4eb66SBilly Tsai GROUP(I3C4), 12604af4eb66SBilly Tsai GROUP(I3C5), 12614af4eb66SBilly Tsai GROUP(I3C6), 12624af4eb66SBilly Tsai GROUP(I3C7), 12634af4eb66SBilly Tsai GROUP(I3C8), 12644af4eb66SBilly Tsai GROUP(I3C9), 12654af4eb66SBilly Tsai GROUP(JTAGM1), 12664af4eb66SBilly Tsai GROUP(LPC0), 12674af4eb66SBilly Tsai GROUP(LPC1), 12684af4eb66SBilly Tsai GROUP(LTPI), 12694af4eb66SBilly Tsai GROUP(LTPI_PS_I2C0), 12704af4eb66SBilly Tsai GROUP(LTPI_PS_I2C1), 12714af4eb66SBilly Tsai GROUP(LTPI_PS_I2C2), 12724af4eb66SBilly Tsai GROUP(LTPI_PS_I2C3), 12734af4eb66SBilly Tsai GROUP(MACLINK0), 12744af4eb66SBilly Tsai GROUP(MACLINK1), 12754af4eb66SBilly Tsai GROUP(MACLINK2), 12764af4eb66SBilly Tsai GROUP(MDIO0), 12774af4eb66SBilly Tsai GROUP(MDIO1), 12784af4eb66SBilly Tsai GROUP(MDIO2), 12794af4eb66SBilly Tsai GROUP(NCTS0), 12804af4eb66SBilly Tsai GROUP(NCTS1), 12814af4eb66SBilly Tsai GROUP(NCTS5), 12824af4eb66SBilly Tsai GROUP(NCTS6), 12834af4eb66SBilly Tsai GROUP(NDCD0), 12844af4eb66SBilly Tsai GROUP(NDCD1), 12854af4eb66SBilly Tsai GROUP(NDCD5), 12864af4eb66SBilly Tsai GROUP(NDCD6), 12874af4eb66SBilly Tsai GROUP(NDSR0), 12884af4eb66SBilly Tsai GROUP(NDSR1), 12894af4eb66SBilly Tsai GROUP(NDSR5), 12904af4eb66SBilly Tsai GROUP(NDSR6), 12914af4eb66SBilly Tsai GROUP(NDTR0), 12924af4eb66SBilly Tsai GROUP(NDTR1), 12934af4eb66SBilly Tsai GROUP(NDTR5), 12944af4eb66SBilly Tsai GROUP(NDTR6), 12954af4eb66SBilly Tsai GROUP(NRI0), 12964af4eb66SBilly Tsai GROUP(NRI1), 12974af4eb66SBilly Tsai GROUP(NRI5), 12984af4eb66SBilly Tsai GROUP(NRI6), 12994af4eb66SBilly Tsai GROUP(NRTS0), 13004af4eb66SBilly Tsai GROUP(NRTS1), 13014af4eb66SBilly Tsai GROUP(NRTS5), 13024af4eb66SBilly Tsai GROUP(NRTS6), 13034af4eb66SBilly Tsai GROUP(OSCCLK), 13044af4eb66SBilly Tsai GROUP(PE2SGRSTN), 13054af4eb66SBilly Tsai GROUP(PWM0), 13064af4eb66SBilly Tsai GROUP(PWM1), 13074af4eb66SBilly Tsai GROUP(PWM10), 13084af4eb66SBilly Tsai GROUP(PWM11), 13094af4eb66SBilly Tsai GROUP(PWM12), 13104af4eb66SBilly Tsai GROUP(PWM13), 13114af4eb66SBilly Tsai GROUP(PWM14), 13124af4eb66SBilly Tsai GROUP(PWM15), 13134af4eb66SBilly Tsai GROUP(PWM2), 13144af4eb66SBilly Tsai GROUP(PWM3), 13154af4eb66SBilly Tsai GROUP(PWM4), 13164af4eb66SBilly Tsai GROUP(PWM5), 13174af4eb66SBilly Tsai GROUP(PWM6), 13184af4eb66SBilly Tsai GROUP(PWM7), 13194af4eb66SBilly Tsai GROUP(PWM8), 13204af4eb66SBilly Tsai GROUP(PWM9), 13214af4eb66SBilly Tsai GROUP(QSPI0), 13224af4eb66SBilly Tsai GROUP(QSPI1), 13234af4eb66SBilly Tsai GROUP(QSPI2), 13244af4eb66SBilly Tsai GROUP(RGMII0), 13254af4eb66SBilly Tsai GROUP(RGMII1), 13264af4eb66SBilly Tsai GROUP(RMII0), 13274af4eb66SBilly Tsai GROUP(RMII0RCLKO), 13284af4eb66SBilly Tsai GROUP(RMII1), 13294af4eb66SBilly Tsai GROUP(RMII1RCLKO), 13304af4eb66SBilly Tsai GROUP(SALT0), 13314af4eb66SBilly Tsai GROUP(SALT1), 13324af4eb66SBilly Tsai GROUP(SALT10), 13334af4eb66SBilly Tsai GROUP(SALT11), 13344af4eb66SBilly Tsai GROUP(SALT12), 13354af4eb66SBilly Tsai GROUP(SALT13), 13364af4eb66SBilly Tsai GROUP(SALT14), 13374af4eb66SBilly Tsai GROUP(SALT15), 13384af4eb66SBilly Tsai GROUP(SALT2), 13394af4eb66SBilly Tsai GROUP(SALT3), 13404af4eb66SBilly Tsai GROUP(SALT4), 13414af4eb66SBilly Tsai GROUP(SALT5), 13424af4eb66SBilly Tsai GROUP(SALT6), 13434af4eb66SBilly Tsai GROUP(SALT7), 13444af4eb66SBilly Tsai GROUP(SALT8), 13454af4eb66SBilly Tsai GROUP(SALT9), 13464af4eb66SBilly Tsai GROUP(SD), 13474af4eb66SBilly Tsai GROUP(SGMII), 13484af4eb66SBilly Tsai GROUP(SGPM0), 13494af4eb66SBilly Tsai GROUP(SGPM1), 13504af4eb66SBilly Tsai GROUP(SGPS), 13514af4eb66SBilly Tsai GROUP(SIOONCTRLN0), 13524af4eb66SBilly Tsai GROUP(SIOONCTRLN1), 13534af4eb66SBilly Tsai GROUP(SIOPBIN0), 13544af4eb66SBilly Tsai GROUP(SIOPBIN1), 13554af4eb66SBilly Tsai GROUP(SIOPBON0), 13564af4eb66SBilly Tsai GROUP(SIOPBON1), 13574af4eb66SBilly Tsai GROUP(SIOPWREQN0), 13584af4eb66SBilly Tsai GROUP(SIOPWREQN1), 13594af4eb66SBilly Tsai GROUP(SIOPWRGD1), 13604af4eb66SBilly Tsai GROUP(SIOS3N0), 13614af4eb66SBilly Tsai GROUP(SIOS3N1), 13624af4eb66SBilly Tsai GROUP(SIOS5N0), 13634af4eb66SBilly Tsai GROUP(SIOS5N1), 13644af4eb66SBilly Tsai GROUP(SIOSCIN0), 13654af4eb66SBilly Tsai GROUP(SIOSCIN1), 13664af4eb66SBilly Tsai GROUP(SMON0), 13674af4eb66SBilly Tsai GROUP(SMON1), 13684af4eb66SBilly Tsai GROUP(SPI0), 13694af4eb66SBilly Tsai GROUP(SPI0ABR), 13704af4eb66SBilly Tsai GROUP(SPI0CS1), 13714af4eb66SBilly Tsai GROUP(SPI0WPN), 13724af4eb66SBilly Tsai GROUP(SPI1), 13734af4eb66SBilly Tsai GROUP(SPI1ABR), 13744af4eb66SBilly Tsai GROUP(SPI1CS1), 13754af4eb66SBilly Tsai GROUP(SPI1WPN), 13764af4eb66SBilly Tsai GROUP(SPI2), 13774af4eb66SBilly Tsai GROUP(SPI2CS1), 13784af4eb66SBilly Tsai GROUP(TACH0), 13794af4eb66SBilly Tsai GROUP(TACH1), 13804af4eb66SBilly Tsai GROUP(TACH10), 13814af4eb66SBilly Tsai GROUP(TACH11), 13824af4eb66SBilly Tsai GROUP(TACH12), 13834af4eb66SBilly Tsai GROUP(TACH13), 13844af4eb66SBilly Tsai GROUP(TACH14), 13854af4eb66SBilly Tsai GROUP(TACH15), 13864af4eb66SBilly Tsai GROUP(TACH2), 13874af4eb66SBilly Tsai GROUP(TACH3), 13884af4eb66SBilly Tsai GROUP(TACH4), 13894af4eb66SBilly Tsai GROUP(TACH5), 13904af4eb66SBilly Tsai GROUP(TACH6), 13914af4eb66SBilly Tsai GROUP(TACH7), 13924af4eb66SBilly Tsai GROUP(TACH8), 13934af4eb66SBilly Tsai GROUP(TACH9), 13944af4eb66SBilly Tsai GROUP(THRU0), 13954af4eb66SBilly Tsai GROUP(THRU1), 13964af4eb66SBilly Tsai GROUP(THRU2), 13974af4eb66SBilly Tsai GROUP(THRU3), 13984af4eb66SBilly Tsai GROUP(UART0), 13994af4eb66SBilly Tsai GROUP(UART1), 14004af4eb66SBilly Tsai GROUP(UART10), 14014af4eb66SBilly Tsai GROUP(UART11), 14024af4eb66SBilly Tsai GROUP(UART2), 14034af4eb66SBilly Tsai GROUP(UART3), 14044af4eb66SBilly Tsai GROUP(UART5), 14054af4eb66SBilly Tsai GROUP(UART6), 14064af4eb66SBilly Tsai GROUP(UART7), 14074af4eb66SBilly Tsai GROUP(UART8), 14084af4eb66SBilly Tsai GROUP(UART9), 14094af4eb66SBilly Tsai GROUP(USB2CD), 14104af4eb66SBilly Tsai GROUP(USB2CH), 14114af4eb66SBilly Tsai GROUP(USB2CU), 14124af4eb66SBilly Tsai GROUP(USB2CUD), 14134af4eb66SBilly Tsai GROUP(USB2DD), 14144af4eb66SBilly Tsai GROUP(USB2DH), 14154af4eb66SBilly Tsai GROUP(USBUART), 14164af4eb66SBilly Tsai GROUP(VGA), 14174af4eb66SBilly Tsai GROUP(VPI), 14184af4eb66SBilly Tsai GROUP(WDTRST0N), 14194af4eb66SBilly Tsai GROUP(WDTRST1N), 14204af4eb66SBilly Tsai GROUP(WDTRST2N), 14214af4eb66SBilly Tsai GROUP(WDTRST3N), 14224af4eb66SBilly Tsai GROUP(WDTRST4N), 14234af4eb66SBilly Tsai GROUP(WDTRST5N), 14244af4eb66SBilly Tsai GROUP(WDTRST6N), 14254af4eb66SBilly Tsai GROUP(WDTRST7N), 14264af4eb66SBilly Tsai }; 14274af4eb66SBilly Tsai 14284af4eb66SBilly Tsai /** 14294af4eb66SBilly Tsai * VM() - Helper macro to unwrap a parenthesized list of arguments. 14304af4eb66SBilly Tsai * @...: The parenthesized list to be unwrapped. 14314af4eb66SBilly Tsai * 14324af4eb66SBilly Tsai * Since the C preprocessor treats commas inside braces {} as argument 14334af4eb66SBilly Tsai * separators for macros, we wrap lists (like mux values) in parentheses () 14344af4eb66SBilly Tsai * to protect them during macro expansion. This macro strips those 14354af4eb66SBilly Tsai * parentheses when the values are needed for array initialization. 14364af4eb66SBilly Tsai */ 14374af4eb66SBilly Tsai #define VM(...) __VA_ARGS__ 14384af4eb66SBilly Tsai 14394af4eb66SBilly Tsai /** 14404af4eb66SBilly Tsai * FUNC() - Macro to initialize an aspeed_g7_soc1_function entry. 14414af4eb66SBilly Tsai * @n: Name of the pin function. 14424af4eb66SBilly Tsai * @m: Parenthesized list of mux values, mapped 1:1 to the groups list. 14434af4eb66SBilly Tsai * @...: Variable list of pin group names associated with this function. 14444af4eb66SBilly Tsai * 14454af4eb66SBilly Tsai * This macro solves complex static initialization by: 14464af4eb66SBilly Tsai * 1. Creating anonymous arrays for both group names and mux values 14474af4eb66SBilly Tsai * using C99 Compound Literals. 14484af4eb66SBilly Tsai * 2. Using VM(m) to unwrap mux values into the array initializer. 14494af4eb66SBilly Tsai * 3. Calculating the number of groups via sizeof() division, which 14504af4eb66SBilly Tsai * bypasses the __must_be_array() check performed by ARRAY_SIZE() 14514af4eb66SBilly Tsai * that often fails on compound literals in the kernel environment. 14524af4eb66SBilly Tsai * 14534af4eb66SBilly Tsai * Example: FUNC(i2c0, (1, 4), "i2c0", "di2c0") 14544af4eb66SBilly Tsai * Maps "i2c0" group to mux value 1 and "di2c0" group to mux value 4. 14554af4eb66SBilly Tsai */ 14564af4eb66SBilly Tsai #define FUNC(n, m, ...) \ 14574af4eb66SBilly Tsai { \ 14584af4eb66SBilly Tsai .pinfunction = { \ 14594af4eb66SBilly Tsai .name = #n, \ 14604af4eb66SBilly Tsai .groups = (const char *const[]){ __VA_ARGS__ }, \ 14614af4eb66SBilly Tsai .ngroups = sizeof((const char *const[]){ __VA_ARGS__ }) / sizeof(char *), \ 14624af4eb66SBilly Tsai }, \ 14634af4eb66SBilly Tsai .muxvals = (const u8[]){ VM m } \ 14644af4eb66SBilly Tsai } 14654af4eb66SBilly Tsai 14664af4eb66SBilly Tsai static const struct aspeed_g7_soc1_function aspeed_g7_soc1_functions[] = { 14674af4eb66SBilly Tsai FUNC(ADC0, (0), "ADC0"), 14684af4eb66SBilly Tsai FUNC(ADC1, (0), "ADC1"), 14694af4eb66SBilly Tsai FUNC(ADC10, (0), "ADC10"), 14704af4eb66SBilly Tsai FUNC(ADC11, (0), "ADC11"), 14714af4eb66SBilly Tsai FUNC(ADC12, (0), "ADC12"), 14724af4eb66SBilly Tsai FUNC(ADC13, (0), "ADC13"), 14734af4eb66SBilly Tsai FUNC(ADC14, (0), "ADC14"), 14744af4eb66SBilly Tsai FUNC(ADC15, (0), "ADC15"), 14754af4eb66SBilly Tsai FUNC(ADC2, (0), "ADC2"), 14764af4eb66SBilly Tsai FUNC(ADC3, (0), "ADC3"), 14774af4eb66SBilly Tsai FUNC(ADC4, (0), "ADC4"), 14784af4eb66SBilly Tsai FUNC(ADC5, (0), "ADC5"), 14794af4eb66SBilly Tsai FUNC(ADC6, (0), "ADC6"), 14804af4eb66SBilly Tsai FUNC(ADC7, (0), "ADC7"), 14814af4eb66SBilly Tsai FUNC(ADC8, (0), "ADC8"), 14824af4eb66SBilly Tsai FUNC(ADC9, (0), "ADC9"), 14834af4eb66SBilly Tsai FUNC(AUXPWRGOOD0, (2), "AUXPWRGOOD0"), 14844af4eb66SBilly Tsai FUNC(AUXPWRGOOD1, (2), "AUXPWRGOOD1"), 14854af4eb66SBilly Tsai FUNC(CANBUS, (2), "CANBUS"), 14864af4eb66SBilly Tsai FUNC(ESPI0, (1), "ESPI0"), 14874af4eb66SBilly Tsai FUNC(ESPI1, (1), "ESPI1"), 14884af4eb66SBilly Tsai FUNC(FSI0, (2), "FSI0"), 14894af4eb66SBilly Tsai FUNC(FSI1, (2), "FSI1"), 14904af4eb66SBilly Tsai FUNC(FSI2, (2), "FSI2"), 14914af4eb66SBilly Tsai FUNC(FSI3, (2), "FSI3"), 14924af4eb66SBilly Tsai FUNC(FWQSPI, (1), "FWQSPI"), 14934af4eb66SBilly Tsai FUNC(FWSPIABR, (1), "FWSPIABR"), 14944af4eb66SBilly Tsai FUNC(FWWPN, (1), "FWWPN"), 14954af4eb66SBilly Tsai FUNC(HBLED, (2), "HBLED"), 14964af4eb66SBilly Tsai FUNC(I2C0, (1, 2, 4), "I2C0", "LTPI_PS_I2C0", "DI2C0"), 14974af4eb66SBilly Tsai FUNC(I2C1, (1, 2, 4), "I2C1", "LTPI_PS_I2C1", "DI2C1"), 14984af4eb66SBilly Tsai FUNC(I2C10, (1, 2), "I2C10", "DI2C10"), 14994af4eb66SBilly Tsai FUNC(I2C11, (1, 2), "I2C11", "DI2C11"), 15004af4eb66SBilly Tsai FUNC(I2C12, (4, 2), "I2C12", "DI2C12"), 15014af4eb66SBilly Tsai FUNC(I2C13, (4, 2), "I2C13", "DI2C13"), 15024af4eb66SBilly Tsai FUNC(I2C14, (4, 2), "I2C14", "DI2C14"), 15034af4eb66SBilly Tsai FUNC(I2C15, (2, 2), "I2C15", "DI2C15"), 15044af4eb66SBilly Tsai FUNC(I2C2, (1, 2, 4), "I2C2", "LTPI_PS_I2C2", "DI2C2"), 15054af4eb66SBilly Tsai FUNC(I2C3, (1, 2, 4), "I2C3", "LTPI_PS_I2C3", "DI2C3"), 15064af4eb66SBilly Tsai FUNC(I2C4, (1), "I2C4"), 15074af4eb66SBilly Tsai FUNC(I2C5, (1), "I2C5"), 15084af4eb66SBilly Tsai FUNC(I2C6, (1), "I2C6"), 15094af4eb66SBilly Tsai FUNC(I2C7, (1), "I2C7"), 15104af4eb66SBilly Tsai FUNC(I2C8, (1, 2), "I2C8", "DI2C8"), 15114af4eb66SBilly Tsai FUNC(I2C9, (1, 2), "I2C9", "DI2C9"), 15124af4eb66SBilly Tsai FUNC(I2CF0, (5), "I2CF0"), 15134af4eb66SBilly Tsai FUNC(I2CF1, (5), "I2CF1"), 15144af4eb66SBilly Tsai FUNC(I2CF2, (5), "I2CF2"), 15154af4eb66SBilly Tsai FUNC(I3C0, (1), "HVI3C0"), 15164af4eb66SBilly Tsai FUNC(I3C1, (1), "HVI3C1"), 15174af4eb66SBilly Tsai FUNC(I3C10, (1), "I3C10"), 15184af4eb66SBilly Tsai FUNC(I3C11, (1), "I3C11"), 15194af4eb66SBilly Tsai FUNC(I3C12, (1), "HVI3C12"), 15204af4eb66SBilly Tsai FUNC(I3C13, (1), "HVI3C13"), 15214af4eb66SBilly Tsai FUNC(I3C14, (1), "HVI3C14"), 15224af4eb66SBilly Tsai FUNC(I3C15, (1), "HVI3C15"), 15234af4eb66SBilly Tsai FUNC(I3C2, (1), "HVI3C2"), 15244af4eb66SBilly Tsai FUNC(I3C3, (1), "HVI3C3"), 15254af4eb66SBilly Tsai FUNC(I3C4, (1), "I3C4"), 15264af4eb66SBilly Tsai FUNC(I3C5, (1), "I3C5"), 15274af4eb66SBilly Tsai FUNC(I3C6, (1), "I3C6"), 15284af4eb66SBilly Tsai FUNC(I3C7, (1), "I3C7"), 15294af4eb66SBilly Tsai FUNC(I3C8, (1), "I3C8"), 15304af4eb66SBilly Tsai FUNC(I3C9, (1), "I3C9"), 15314af4eb66SBilly Tsai FUNC(JTAGM1, (1), "JTAGM1"), 15324af4eb66SBilly Tsai FUNC(LPC0, (2), "LPC0"), 15334af4eb66SBilly Tsai FUNC(LPC1, (2), "LPC1"), 15344af4eb66SBilly Tsai FUNC(LTPI, (2), "LTPI"), 15354af4eb66SBilly Tsai FUNC(MACLINK0, (4), "MACLINK0"), 15364af4eb66SBilly Tsai FUNC(MACLINK1, (3), "MACLINK1"), 15374af4eb66SBilly Tsai FUNC(MACLINK2, (4), "MACLINK2"), 15384af4eb66SBilly Tsai FUNC(MDIO0, (1), "MDIO0"), 15394af4eb66SBilly Tsai FUNC(MDIO1, (1), "MDIO1"), 15404af4eb66SBilly Tsai FUNC(MDIO2, (1), "MDIO2"), 15414af4eb66SBilly Tsai FUNC(NCTS0, (1), "NCTS0"), 15424af4eb66SBilly Tsai FUNC(NCTS1, (1), "NCTS1"), 15434af4eb66SBilly Tsai FUNC(NCTS5, (4), "NCTS5"), 15444af4eb66SBilly Tsai FUNC(NCTS6, (4), "NCTS6"), 15454af4eb66SBilly Tsai FUNC(NDCD0, (1), "NDCD0"), 15464af4eb66SBilly Tsai FUNC(NDCD1, (1), "NDCD1"), 15474af4eb66SBilly Tsai FUNC(NDCD5, (4), "NDCD5"), 15484af4eb66SBilly Tsai FUNC(NDCD6, (4), "NDCD6"), 15494af4eb66SBilly Tsai FUNC(NDSR0, (1), "NDSR0"), 15504af4eb66SBilly Tsai FUNC(NDSR1, (1), "NDSR1"), 15514af4eb66SBilly Tsai FUNC(NDSR5, (4), "NDSR5"), 15524af4eb66SBilly Tsai FUNC(NDSR6, (4), "NDSR6"), 15534af4eb66SBilly Tsai FUNC(NDTR0, (1), "NDTR0"), 15544af4eb66SBilly Tsai FUNC(NDTR1, (1), "NDTR1"), 15554af4eb66SBilly Tsai FUNC(NDTR5, (4), "NDTR5"), 15564af4eb66SBilly Tsai FUNC(NDTR6, (4), "NDTR6"), 15574af4eb66SBilly Tsai FUNC(NRI0, (1), "NRI0"), 15584af4eb66SBilly Tsai FUNC(NRI1, (1), "NRI1"), 15594af4eb66SBilly Tsai FUNC(NRI5, (4), "NRI5"), 15604af4eb66SBilly Tsai FUNC(NRI6, (4), "NRI6"), 15614af4eb66SBilly Tsai FUNC(NRTS0, (1), "NRTS0"), 15624af4eb66SBilly Tsai FUNC(NRTS1, (1), "NRTS1"), 15634af4eb66SBilly Tsai FUNC(NRTS5, (4), "NRTS5"), 15644af4eb66SBilly Tsai FUNC(NRTS6, (4), "NRTS6"), 15654af4eb66SBilly Tsai FUNC(OSCCLK, (3), "OSCCLK"), 15664af4eb66SBilly Tsai FUNC(PCIERC, (2), "PE2SGRSTN"), 15674af4eb66SBilly Tsai FUNC(PWM0, (1), "PWM0"), 15684af4eb66SBilly Tsai FUNC(PWM1, (1), "PWM1"), 15694af4eb66SBilly Tsai FUNC(PWM10, (3), "PWM10"), 15704af4eb66SBilly Tsai FUNC(PWM11, (3), "PWM11"), 15714af4eb66SBilly Tsai FUNC(PWM12, (3), "PWM12"), 15724af4eb66SBilly Tsai FUNC(PWM13, (3), "PWM13"), 15734af4eb66SBilly Tsai FUNC(PWM14, (3), "PWM14"), 15744af4eb66SBilly Tsai FUNC(PWM15, (3), "PWM15"), 15754af4eb66SBilly Tsai FUNC(PWM2, (1), "PWM2"), 15764af4eb66SBilly Tsai FUNC(PWM3, (1), "PWM3"), 15774af4eb66SBilly Tsai FUNC(PWM4, (1), "PWM4"), 15784af4eb66SBilly Tsai FUNC(PWM5, (1), "PWM5"), 15794af4eb66SBilly Tsai FUNC(PWM6, (1), "PWM6"), 15804af4eb66SBilly Tsai FUNC(PWM7, (1), "PWM7"), 15814af4eb66SBilly Tsai FUNC(PWM8, (3), "PWM8"), 15824af4eb66SBilly Tsai FUNC(PWM9, (3), "PWM9"), 15834af4eb66SBilly Tsai FUNC(QSPI0, (1), "QSPI0"), 15844af4eb66SBilly Tsai FUNC(QSPI1, (1), "QSPI1"), 15854af4eb66SBilly Tsai FUNC(QSPI2, (1), "QSPI2"), 15864af4eb66SBilly Tsai FUNC(RGMII0, (1), "RGMII0"), 15874af4eb66SBilly Tsai FUNC(RGMII1, (1), "RGMII1"), 15884af4eb66SBilly Tsai FUNC(RMII0, (2), "RMII0"), 15894af4eb66SBilly Tsai FUNC(RMII0RCLKO, (2), "RMII0RCLKO"), 15904af4eb66SBilly Tsai FUNC(RMII1, (2), "RMII1"), 15914af4eb66SBilly Tsai FUNC(RMII1RCLKO, (2), "RMII1RCLKO"), 15924af4eb66SBilly Tsai FUNC(SALT0, (2), "SALT0"), 15934af4eb66SBilly Tsai FUNC(SALT1, (2), "SALT1"), 15944af4eb66SBilly Tsai FUNC(SALT10, (2), "SALT10"), 15954af4eb66SBilly Tsai FUNC(SALT11, (2), "SALT11"), 15964af4eb66SBilly Tsai FUNC(SALT12, (2), "SALT12"), 15974af4eb66SBilly Tsai FUNC(SALT13, (2), "SALT13"), 15984af4eb66SBilly Tsai FUNC(SALT14, (2), "SALT14"), 15994af4eb66SBilly Tsai FUNC(SALT15, (2), "SALT15"), 16004af4eb66SBilly Tsai FUNC(SALT2, (2), "SALT2"), 16014af4eb66SBilly Tsai FUNC(SALT3, (2), "SALT3"), 16024af4eb66SBilly Tsai FUNC(SALT4, (2), "SALT4"), 16034af4eb66SBilly Tsai FUNC(SALT5, (2), "SALT5"), 16044af4eb66SBilly Tsai FUNC(SALT6, (2), "SALT6"), 16054af4eb66SBilly Tsai FUNC(SALT7, (2), "SALT7"), 16064af4eb66SBilly Tsai FUNC(SALT8, (2), "SALT8"), 16074af4eb66SBilly Tsai FUNC(SALT9, (2), "SALT9"), 16084af4eb66SBilly Tsai FUNC(SD, (3), "SD"), 16094af4eb66SBilly Tsai FUNC(SGMII, (1), "SGMII"), 16104af4eb66SBilly Tsai FUNC(SGPM0, (1, 4), "SGPM0", "DSGPM0"), 16114af4eb66SBilly Tsai FUNC(SGPM1, (1), "SGPM1"), 16124af4eb66SBilly Tsai FUNC(SGPS, (5), "SGPS"), 16134af4eb66SBilly Tsai FUNC(SIOONCTRLN0, (2), "SIOONCTRLN0"), 16144af4eb66SBilly Tsai FUNC(SIOONCTRLN1, (2), "SIOONCTRLN1"), 16154af4eb66SBilly Tsai FUNC(SIOPBIN0, (2), "SIOPBIN0"), 16164af4eb66SBilly Tsai FUNC(SIOPBIN1, (2), "SIOPBIN1"), 16174af4eb66SBilly Tsai FUNC(SIOPBON0, (2), "SIOPBON0"), 16184af4eb66SBilly Tsai FUNC(SIOPBON1, (2), "SIOPBON1"), 16194af4eb66SBilly Tsai FUNC(SIOPWREQN0, (2), "SIOPWREQN0"), 16204af4eb66SBilly Tsai FUNC(SIOPWREQN1, (2), "SIOPWREQN1"), 16214af4eb66SBilly Tsai FUNC(SIOPWRGD1, (2), "SIOPWRGD1"), 16224af4eb66SBilly Tsai FUNC(SIOS3N0, (2), "SIOS3N0"), 16234af4eb66SBilly Tsai FUNC(SIOS3N1, (2), "SIOS3N1"), 16244af4eb66SBilly Tsai FUNC(SIOS5N0, (2), "SIOS5N0"), 16254af4eb66SBilly Tsai FUNC(SIOS5N1, (2), "SIOS5N1"), 16264af4eb66SBilly Tsai FUNC(SIOSCIN0, (2), "SIOSCIN0"), 16274af4eb66SBilly Tsai FUNC(SIOSCIN1, (2), "SIOSCIN1"), 16284af4eb66SBilly Tsai FUNC(SMON0, (2), "SMON0"), 16294af4eb66SBilly Tsai FUNC(SMON1, (4), "SMON1"), 16304af4eb66SBilly Tsai FUNC(SPI0, (1), "SPI0"), 16314af4eb66SBilly Tsai FUNC(SPI0ABR, (1), "SPI0ABR"), 16324af4eb66SBilly Tsai FUNC(SPI0CS1, (1), "SPI0CS1"), 16334af4eb66SBilly Tsai FUNC(SPI0WPN, (1), "SPI0WPN"), 16344af4eb66SBilly Tsai FUNC(SPI1, (1), "SPI1"), 16354af4eb66SBilly Tsai FUNC(SPI1ABR, (1), "SPI1ABR"), 16364af4eb66SBilly Tsai FUNC(SPI1CS1, (1), "SPI1CS1"), 16374af4eb66SBilly Tsai FUNC(SPI1WPN, (1), "SPI1WPN"), 16384af4eb66SBilly Tsai FUNC(SPI2, (1), "SPI2"), 16394af4eb66SBilly Tsai FUNC(SPI2CS1, (1), "SPI2CS1"), 16404af4eb66SBilly Tsai FUNC(TACH0, (1), "TACH0"), 16414af4eb66SBilly Tsai FUNC(TACH1, (1), "TACH1"), 16424af4eb66SBilly Tsai FUNC(TACH10, (1), "TACH10"), 16434af4eb66SBilly Tsai FUNC(TACH11, (1), "TACH11"), 16444af4eb66SBilly Tsai FUNC(TACH12, (1), "TACH12"), 16454af4eb66SBilly Tsai FUNC(TACH13, (1), "TACH13"), 16464af4eb66SBilly Tsai FUNC(TACH14, (1), "TACH14"), 16474af4eb66SBilly Tsai FUNC(TACH15, (1), "TACH15"), 16484af4eb66SBilly Tsai FUNC(TACH2, (1), "TACH2"), 16494af4eb66SBilly Tsai FUNC(TACH3, (1), "TACH3"), 16504af4eb66SBilly Tsai FUNC(TACH4, (1), "TACH4"), 16514af4eb66SBilly Tsai FUNC(TACH5, (1), "TACH5"), 16524af4eb66SBilly Tsai FUNC(TACH6, (1), "TACH6"), 16534af4eb66SBilly Tsai FUNC(TACH7, (1), "TACH7"), 16544af4eb66SBilly Tsai FUNC(TACH8, (1), "TACH8"), 16554af4eb66SBilly Tsai FUNC(TACH9, (1), "TACH9"), 16564af4eb66SBilly Tsai FUNC(THRU0, (2), "THRU0"), 16574af4eb66SBilly Tsai FUNC(THRU1, (2), "THRU1"), 16584af4eb66SBilly Tsai FUNC(THRU2, (4), "THRU2"), 16594af4eb66SBilly Tsai FUNC(THRU3, (4), "THRU3"), 16604af4eb66SBilly Tsai FUNC(UART0, (1), "UART0"), 16614af4eb66SBilly Tsai FUNC(UART1, (1), "UART1"), 16624af4eb66SBilly Tsai FUNC(UART10, (3), "UART10"), 16634af4eb66SBilly Tsai FUNC(UART11, (3), "UART11"), 16644af4eb66SBilly Tsai FUNC(UART2, (1), "UART2"), 16654af4eb66SBilly Tsai FUNC(UART3, (1), "UART3"), 16664af4eb66SBilly Tsai FUNC(UART5, (4), "UART5"), 16674af4eb66SBilly Tsai FUNC(UART6, (4), "UART6"), 16684af4eb66SBilly Tsai FUNC(UART7, (1), "UART7"), 16694af4eb66SBilly Tsai FUNC(UART8, (3), "UART8"), 16704af4eb66SBilly Tsai FUNC(UART9, (3), "UART9"), 16714af4eb66SBilly Tsai FUNC(USB2C, (0, 1, 2, 3), "USB2CUD", "USB2CD", "USB2CH", "USB2CU"), 16724af4eb66SBilly Tsai FUNC(USB2D, (1, 2), "USB2DD", "USB2DH"), 16734af4eb66SBilly Tsai FUNC(USBUART, (2), "USBUART"), 16744af4eb66SBilly Tsai FUNC(VGA, (1), "VGA"), 16754af4eb66SBilly Tsai FUNC(VPI, (5), "VPI"), 16764af4eb66SBilly Tsai FUNC(WDTRST0N, (2), "WDTRST0N"), 16774af4eb66SBilly Tsai FUNC(WDTRST1N, (2), "WDTRST1N"), 16784af4eb66SBilly Tsai FUNC(WDTRST2N, (2), "WDTRST2N"), 16794af4eb66SBilly Tsai FUNC(WDTRST3N, (2), "WDTRST3N"), 16804af4eb66SBilly Tsai FUNC(WDTRST4N, (2), "WDTRST4N"), 16814af4eb66SBilly Tsai FUNC(WDTRST5N, (2), "WDTRST5N"), 16824af4eb66SBilly Tsai FUNC(WDTRST6N, (2), "WDTRST6N"), 16834af4eb66SBilly Tsai FUNC(WDTRST7N, (2), "WDTRST7N"), 16844af4eb66SBilly Tsai }; 16854af4eb66SBilly Tsai 16864af4eb66SBilly Tsai static int aspeed_g7_soc1_pinctrl_probe(struct platform_device *pdev) 16874af4eb66SBilly Tsai { 16884af4eb66SBilly Tsai struct aspeed_g7_soc1_pinctrl *pctl; 16894af4eb66SBilly Tsai struct device *dev = &pdev->dev; 16904af4eb66SBilly Tsai int i, ret; 16914af4eb66SBilly Tsai 16924af4eb66SBilly Tsai pctl = devm_kzalloc(dev, sizeof(*pctl), GFP_KERNEL); 16934af4eb66SBilly Tsai if (!pctl) 16944af4eb66SBilly Tsai return -ENOMEM; 16954af4eb66SBilly Tsai 16964af4eb66SBilly Tsai pctl->dev = dev; 16974af4eb66SBilly Tsai pctl->regmap = syscon_node_to_regmap(dev->parent->of_node); 16984af4eb66SBilly Tsai if (IS_ERR(pctl->regmap)) { 16994af4eb66SBilly Tsai dev_err(dev, "Failed to get regmap from parent\n"); 17004af4eb66SBilly Tsai return PTR_ERR(pctl->regmap); 17014af4eb66SBilly Tsai } 17024af4eb66SBilly Tsai 17034af4eb66SBilly Tsai ret = devm_pinctrl_register_and_init(dev, &aspeed_g7_soc1_desc, pctl, 17044af4eb66SBilly Tsai &pctl->pctl); 17054af4eb66SBilly Tsai if (ret) { 17064af4eb66SBilly Tsai dev_err(dev, "Failed to register pinctrl\n"); 17074af4eb66SBilly Tsai return ret; 17084af4eb66SBilly Tsai } 17094af4eb66SBilly Tsai 17104af4eb66SBilly Tsai for (i = 0; i < ARRAY_SIZE(aspeed_g7_soc1_groups); i++) { 17114af4eb66SBilly Tsai const struct pingroup *grp = &aspeed_g7_soc1_groups[i]; 17124af4eb66SBilly Tsai 17134af4eb66SBilly Tsai ret = pinctrl_generic_add_group(pctl->pctl, grp->name, 17144af4eb66SBilly Tsai (const unsigned int *)grp->pins, 17154af4eb66SBilly Tsai grp->npins, pctl); 17164af4eb66SBilly Tsai if (ret < 0) { 17174af4eb66SBilly Tsai dev_err(dev, "Failed to add group %s\n", grp->name); 17184af4eb66SBilly Tsai return ret; 17194af4eb66SBilly Tsai } 17204af4eb66SBilly Tsai } 17214af4eb66SBilly Tsai 17224af4eb66SBilly Tsai for (i = 0; i < ARRAY_SIZE(aspeed_g7_soc1_functions); i++) { 17234af4eb66SBilly Tsai const struct aspeed_g7_soc1_function *func = &aspeed_g7_soc1_functions[i]; 17244af4eb66SBilly Tsai 17254af4eb66SBilly Tsai ret = pinmux_generic_add_function(pctl->pctl, func->pinfunction.name, 17264af4eb66SBilly Tsai func->pinfunction.groups, 17274af4eb66SBilly Tsai func->pinfunction.ngroups, (void *)func); 17284af4eb66SBilly Tsai if (ret < 0) { 17294af4eb66SBilly Tsai dev_err(dev, "Failed to add function %s\n", func->pinfunction.name); 17304af4eb66SBilly Tsai return ret; 17314af4eb66SBilly Tsai } 17324af4eb66SBilly Tsai } 17334af4eb66SBilly Tsai 17344af4eb66SBilly Tsai return pinctrl_enable(pctl->pctl); 17354af4eb66SBilly Tsai } 17364af4eb66SBilly Tsai 17374af4eb66SBilly Tsai static const struct of_device_id aspeed_g7_soc1_pinctrl_match[] = { 17384af4eb66SBilly Tsai { .compatible = "aspeed,ast2700-soc1-pinctrl" }, 17394af4eb66SBilly Tsai {} 17404af4eb66SBilly Tsai }; 17414af4eb66SBilly Tsai MODULE_DEVICE_TABLE(of, aspeed_g7_soc1_pinctrl_match); 17424af4eb66SBilly Tsai 17434af4eb66SBilly Tsai static struct platform_driver aspeed_g7_soc1_pinctrl_driver = { 17444af4eb66SBilly Tsai .probe = aspeed_g7_soc1_pinctrl_probe, 17454af4eb66SBilly Tsai .driver = { 17464af4eb66SBilly Tsai .name = "aspeed-g7-soc1-pinctrl", 17474af4eb66SBilly Tsai .of_match_table = aspeed_g7_soc1_pinctrl_match, 17484af4eb66SBilly Tsai .suppress_bind_attrs = true, 17494af4eb66SBilly Tsai }, 17504af4eb66SBilly Tsai }; 17514af4eb66SBilly Tsai 17524af4eb66SBilly Tsai static int __init aspeed_g7_soc1_pinctrl_init(void) 17534af4eb66SBilly Tsai { 17544af4eb66SBilly Tsai return platform_driver_register(&aspeed_g7_soc1_pinctrl_driver); 17554af4eb66SBilly Tsai } 17564af4eb66SBilly Tsai arch_initcall(aspeed_g7_soc1_pinctrl_init); 1757