1*447976abSJianlong Huang // SPDX-License-Identifier: GPL-2.0 2*447976abSJianlong Huang /* 3*447976abSJianlong Huang * Pinctrl / GPIO driver for StarFive JH7110 SoC sys controller 4*447976abSJianlong Huang * 5*447976abSJianlong Huang * Copyright (C) 2022 Emil Renner Berthing <kernel@esmil.dk> 6*447976abSJianlong Huang * Copyright (C) 2022 StarFive Technology Co., Ltd. 7*447976abSJianlong Huang */ 8*447976abSJianlong Huang 9*447976abSJianlong Huang #include <linux/bits.h> 10*447976abSJianlong Huang #include <linux/clk.h> 11*447976abSJianlong Huang #include <linux/gpio/driver.h> 12*447976abSJianlong Huang #include <linux/io.h> 13*447976abSJianlong Huang #include <linux/mod_devicetable.h> 14*447976abSJianlong Huang #include <linux/module.h> 15*447976abSJianlong Huang #include <linux/mutex.h> 16*447976abSJianlong Huang #include <linux/of.h> 17*447976abSJianlong Huang #include <linux/of_device.h> 18*447976abSJianlong Huang #include <linux/platform_device.h> 19*447976abSJianlong Huang #include <linux/reset.h> 20*447976abSJianlong Huang #include <linux/spinlock.h> 21*447976abSJianlong Huang 22*447976abSJianlong Huang #include <linux/pinctrl/pinctrl.h> 23*447976abSJianlong Huang #include <linux/pinctrl/pinmux.h> 24*447976abSJianlong Huang 25*447976abSJianlong Huang #include <dt-bindings/pinctrl/starfive,jh7110-pinctrl.h> 26*447976abSJianlong Huang 27*447976abSJianlong Huang #include "../core.h" 28*447976abSJianlong Huang #include "../pinctrl-utils.h" 29*447976abSJianlong Huang #include "../pinmux.h" 30*447976abSJianlong Huang #include "../pinconf.h" 31*447976abSJianlong Huang #include "pinctrl-starfive-jh7110.h" 32*447976abSJianlong Huang 33*447976abSJianlong Huang #define JH7110_SYS_NGPIO 64 34*447976abSJianlong Huang #define JH7110_SYS_GC_BASE 0 35*447976abSJianlong Huang 36*447976abSJianlong Huang /* registers */ 37*447976abSJianlong Huang #define JH7110_SYS_DOEN 0x000 38*447976abSJianlong Huang #define JH7110_SYS_DOUT 0x040 39*447976abSJianlong Huang #define JH7110_SYS_GPI 0x080 40*447976abSJianlong Huang #define JH7110_SYS_GPIOIN 0x118 41*447976abSJianlong Huang 42*447976abSJianlong Huang #define JH7110_SYS_GPIOEN 0x0dc 43*447976abSJianlong Huang #define JH7110_SYS_GPIOIS0 0x0e0 44*447976abSJianlong Huang #define JH7110_SYS_GPIOIS1 0x0e4 45*447976abSJianlong Huang #define JH7110_SYS_GPIOIC0 0x0e8 46*447976abSJianlong Huang #define JH7110_SYS_GPIOIC1 0x0ec 47*447976abSJianlong Huang #define JH7110_SYS_GPIOIBE0 0x0f0 48*447976abSJianlong Huang #define JH7110_SYS_GPIOIBE1 0x0f4 49*447976abSJianlong Huang #define JH7110_SYS_GPIOIEV0 0x0f8 50*447976abSJianlong Huang #define JH7110_SYS_GPIOIEV1 0x0fc 51*447976abSJianlong Huang #define JH7110_SYS_GPIOIE0 0x100 52*447976abSJianlong Huang #define JH7110_SYS_GPIOIE1 0x104 53*447976abSJianlong Huang #define JH7110_SYS_GPIORIS0 0x108 54*447976abSJianlong Huang #define JH7110_SYS_GPIORIS1 0x10c 55*447976abSJianlong Huang #define JH7110_SYS_GPIOMIS0 0x110 56*447976abSJianlong Huang #define JH7110_SYS_GPIOMIS1 0x114 57*447976abSJianlong Huang 58*447976abSJianlong Huang #define JH7110_SYS_GPO_PDA_0_74_CFG 0x120 59*447976abSJianlong Huang #define JH7110_SYS_GPO_PDA_89_94_CFG 0x284 60*447976abSJianlong Huang 61*447976abSJianlong Huang static const struct pinctrl_pin_desc jh7110_sys_pins[] = { 62*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO0, "GPIO0"), 63*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO1, "GPIO1"), 64*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO2, "GPIO2"), 65*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO3, "GPIO3"), 66*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO4, "GPIO4"), 67*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO5, "GPIO5"), 68*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO6, "GPIO6"), 69*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO7, "GPIO7"), 70*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO8, "GPIO8"), 71*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO9, "GPIO9"), 72*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO10, "GPIO10"), 73*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO11, "GPIO11"), 74*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO12, "GPIO12"), 75*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO13, "GPIO13"), 76*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO14, "GPIO14"), 77*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO15, "GPIO15"), 78*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO16, "GPIO16"), 79*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO17, "GPIO17"), 80*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO18, "GPIO18"), 81*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO19, "GPIO19"), 82*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO20, "GPIO20"), 83*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO21, "GPIO21"), 84*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO22, "GPIO22"), 85*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO23, "GPIO23"), 86*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO24, "GPIO24"), 87*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO25, "GPIO25"), 88*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO26, "GPIO26"), 89*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO27, "GPIO27"), 90*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO28, "GPIO28"), 91*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO29, "GPIO29"), 92*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO30, "GPIO30"), 93*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO31, "GPIO31"), 94*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO32, "GPIO32"), 95*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO33, "GPIO33"), 96*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO34, "GPIO34"), 97*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO35, "GPIO35"), 98*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO36, "GPIO36"), 99*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO37, "GPIO37"), 100*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO38, "GPIO38"), 101*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO39, "GPIO39"), 102*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO40, "GPIO40"), 103*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO41, "GPIO41"), 104*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO42, "GPIO42"), 105*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO43, "GPIO43"), 106*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO44, "GPIO44"), 107*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO45, "GPIO45"), 108*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO46, "GPIO46"), 109*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO47, "GPIO47"), 110*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO48, "GPIO48"), 111*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO49, "GPIO49"), 112*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO50, "GPIO50"), 113*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO51, "GPIO51"), 114*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO52, "GPIO52"), 115*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO53, "GPIO53"), 116*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO54, "GPIO54"), 117*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO55, "GPIO55"), 118*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO56, "GPIO56"), 119*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO57, "GPIO57"), 120*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO58, "GPIO58"), 121*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO59, "GPIO59"), 122*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO60, "GPIO60"), 123*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO61, "GPIO61"), 124*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO62, "GPIO62"), 125*447976abSJianlong Huang PINCTRL_PIN(PAD_GPIO63, "GPIO63"), 126*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_CLK, "SD0_CLK"), 127*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_CMD, "SD0_CMD"), 128*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_DATA0, "SD0_DATA0"), 129*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_DATA1, "SD0_DATA1"), 130*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_DATA2, "SD0_DATA2"), 131*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_DATA3, "SD0_DATA3"), 132*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_DATA4, "SD0_DATA4"), 133*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_DATA5, "SD0_DATA5"), 134*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_DATA6, "SD0_DATA6"), 135*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_DATA7, "SD0_DATA7"), 136*447976abSJianlong Huang PINCTRL_PIN(PAD_SD0_STRB, "SD0_STRB"), 137*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_MDC, "GMAC1_MDC"), 138*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_MDIO, "GMAC1_MDIO"), 139*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_RXD0, "GMAC1_RXD0"), 140*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_RXD1, "GMAC1_RXD1"), 141*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_RXD2, "GMAC1_RXD2"), 142*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_RXD3, "GMAC1_RXD3"), 143*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_RXDV, "GMAC1_RXDV"), 144*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_RXC, "GMAC1_RXC"), 145*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_TXD0, "GMAC1_TXD0"), 146*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_TXD1, "GMAC1_TXD1"), 147*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_TXD2, "GMAC1_TXD2"), 148*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_TXD3, "GMAC1_TXD3"), 149*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_TXEN, "GMAC1_TXEN"), 150*447976abSJianlong Huang PINCTRL_PIN(PAD_GMAC1_TXC, "GMAC1_TXC"), 151*447976abSJianlong Huang PINCTRL_PIN(PAD_QSPI_SCLK, "QSPI_SCLK"), 152*447976abSJianlong Huang PINCTRL_PIN(PAD_QSPI_CS0, "QSPI_CS0"), 153*447976abSJianlong Huang PINCTRL_PIN(PAD_QSPI_DATA0, "QSPI_DATA0"), 154*447976abSJianlong Huang PINCTRL_PIN(PAD_QSPI_DATA1, "QSPI_DATA1"), 155*447976abSJianlong Huang PINCTRL_PIN(PAD_QSPI_DATA2, "QSPI_DATA2"), 156*447976abSJianlong Huang PINCTRL_PIN(PAD_QSPI_DATA3, "QSPI_DATA3"), 157*447976abSJianlong Huang }; 158*447976abSJianlong Huang 159*447976abSJianlong Huang struct jh7110_func_sel { 160*447976abSJianlong Huang u16 offset; 161*447976abSJianlong Huang u8 shift; 162*447976abSJianlong Huang u8 max; 163*447976abSJianlong Huang }; 164*447976abSJianlong Huang 165*447976abSJianlong Huang static const struct jh7110_func_sel 166*447976abSJianlong Huang jh7110_sys_func_sel[ARRAY_SIZE(jh7110_sys_pins)] = { 167*447976abSJianlong Huang [PAD_GMAC1_RXC] = { 0x29c, 0, 1 }, 168*447976abSJianlong Huang [PAD_GPIO10] = { 0x29c, 2, 3 }, 169*447976abSJianlong Huang [PAD_GPIO11] = { 0x29c, 5, 3 }, 170*447976abSJianlong Huang [PAD_GPIO12] = { 0x29c, 8, 3 }, 171*447976abSJianlong Huang [PAD_GPIO13] = { 0x29c, 11, 3 }, 172*447976abSJianlong Huang [PAD_GPIO14] = { 0x29c, 14, 3 }, 173*447976abSJianlong Huang [PAD_GPIO15] = { 0x29c, 17, 3 }, 174*447976abSJianlong Huang [PAD_GPIO16] = { 0x29c, 20, 3 }, 175*447976abSJianlong Huang [PAD_GPIO17] = { 0x29c, 23, 3 }, 176*447976abSJianlong Huang [PAD_GPIO18] = { 0x29c, 26, 3 }, 177*447976abSJianlong Huang [PAD_GPIO19] = { 0x29c, 29, 3 }, 178*447976abSJianlong Huang 179*447976abSJianlong Huang [PAD_GPIO20] = { 0x2a0, 0, 3 }, 180*447976abSJianlong Huang [PAD_GPIO21] = { 0x2a0, 3, 3 }, 181*447976abSJianlong Huang [PAD_GPIO22] = { 0x2a0, 6, 3 }, 182*447976abSJianlong Huang [PAD_GPIO23] = { 0x2a0, 9, 3 }, 183*447976abSJianlong Huang [PAD_GPIO24] = { 0x2a0, 12, 3 }, 184*447976abSJianlong Huang [PAD_GPIO25] = { 0x2a0, 15, 3 }, 185*447976abSJianlong Huang [PAD_GPIO26] = { 0x2a0, 18, 3 }, 186*447976abSJianlong Huang [PAD_GPIO27] = { 0x2a0, 21, 3 }, 187*447976abSJianlong Huang [PAD_GPIO28] = { 0x2a0, 24, 3 }, 188*447976abSJianlong Huang [PAD_GPIO29] = { 0x2a0, 27, 3 }, 189*447976abSJianlong Huang 190*447976abSJianlong Huang [PAD_GPIO30] = { 0x2a4, 0, 3 }, 191*447976abSJianlong Huang [PAD_GPIO31] = { 0x2a4, 3, 3 }, 192*447976abSJianlong Huang [PAD_GPIO32] = { 0x2a4, 6, 3 }, 193*447976abSJianlong Huang [PAD_GPIO33] = { 0x2a4, 9, 3 }, 194*447976abSJianlong Huang [PAD_GPIO34] = { 0x2a4, 12, 3 }, 195*447976abSJianlong Huang [PAD_GPIO35] = { 0x2a4, 15, 3 }, 196*447976abSJianlong Huang [PAD_GPIO36] = { 0x2a4, 17, 3 }, 197*447976abSJianlong Huang [PAD_GPIO37] = { 0x2a4, 20, 3 }, 198*447976abSJianlong Huang [PAD_GPIO38] = { 0x2a4, 23, 3 }, 199*447976abSJianlong Huang [PAD_GPIO39] = { 0x2a4, 26, 3 }, 200*447976abSJianlong Huang [PAD_GPIO40] = { 0x2a4, 29, 3 }, 201*447976abSJianlong Huang 202*447976abSJianlong Huang [PAD_GPIO41] = { 0x2a8, 0, 3 }, 203*447976abSJianlong Huang [PAD_GPIO42] = { 0x2a8, 3, 3 }, 204*447976abSJianlong Huang [PAD_GPIO43] = { 0x2a8, 6, 3 }, 205*447976abSJianlong Huang [PAD_GPIO44] = { 0x2a8, 9, 3 }, 206*447976abSJianlong Huang [PAD_GPIO45] = { 0x2a8, 12, 3 }, 207*447976abSJianlong Huang [PAD_GPIO46] = { 0x2a8, 15, 3 }, 208*447976abSJianlong Huang [PAD_GPIO47] = { 0x2a8, 18, 3 }, 209*447976abSJianlong Huang [PAD_GPIO48] = { 0x2a8, 21, 3 }, 210*447976abSJianlong Huang [PAD_GPIO49] = { 0x2a8, 24, 3 }, 211*447976abSJianlong Huang [PAD_GPIO50] = { 0x2a8, 27, 3 }, 212*447976abSJianlong Huang [PAD_GPIO51] = { 0x2a8, 30, 3 }, 213*447976abSJianlong Huang 214*447976abSJianlong Huang [PAD_GPIO52] = { 0x2ac, 0, 3 }, 215*447976abSJianlong Huang [PAD_GPIO53] = { 0x2ac, 2, 3 }, 216*447976abSJianlong Huang [PAD_GPIO54] = { 0x2ac, 4, 3 }, 217*447976abSJianlong Huang [PAD_GPIO55] = { 0x2ac, 6, 3 }, 218*447976abSJianlong Huang [PAD_GPIO56] = { 0x2ac, 9, 3 }, 219*447976abSJianlong Huang [PAD_GPIO57] = { 0x2ac, 12, 3 }, 220*447976abSJianlong Huang [PAD_GPIO58] = { 0x2ac, 15, 3 }, 221*447976abSJianlong Huang [PAD_GPIO59] = { 0x2ac, 18, 3 }, 222*447976abSJianlong Huang [PAD_GPIO60] = { 0x2ac, 21, 3 }, 223*447976abSJianlong Huang [PAD_GPIO61] = { 0x2ac, 24, 3 }, 224*447976abSJianlong Huang [PAD_GPIO62] = { 0x2ac, 27, 3 }, 225*447976abSJianlong Huang [PAD_GPIO63] = { 0x2ac, 30, 3 }, 226*447976abSJianlong Huang 227*447976abSJianlong Huang [PAD_GPIO6] = { 0x2b0, 0, 3 }, 228*447976abSJianlong Huang [PAD_GPIO7] = { 0x2b0, 2, 3 }, 229*447976abSJianlong Huang [PAD_GPIO8] = { 0x2b0, 5, 3 }, 230*447976abSJianlong Huang [PAD_GPIO9] = { 0x2b0, 8, 3 }, 231*447976abSJianlong Huang }; 232*447976abSJianlong Huang 233*447976abSJianlong Huang struct jh7110_vin_group_sel { 234*447976abSJianlong Huang u16 offset; 235*447976abSJianlong Huang u8 shift; 236*447976abSJianlong Huang u8 group; 237*447976abSJianlong Huang }; 238*447976abSJianlong Huang 239*447976abSJianlong Huang static const struct jh7110_vin_group_sel 240*447976abSJianlong Huang jh7110_sys_vin_group_sel[ARRAY_SIZE(jh7110_sys_pins)] = { 241*447976abSJianlong Huang [PAD_GPIO6] = { 0x2b4, 21, 0 }, 242*447976abSJianlong Huang [PAD_GPIO7] = { 0x2b4, 18, 0 }, 243*447976abSJianlong Huang [PAD_GPIO8] = { 0x2b4, 15, 0 }, 244*447976abSJianlong Huang [PAD_GPIO9] = { 0x2b0, 11, 0 }, 245*447976abSJianlong Huang [PAD_GPIO10] = { 0x2b0, 20, 0 }, 246*447976abSJianlong Huang [PAD_GPIO11] = { 0x2b0, 23, 0 }, 247*447976abSJianlong Huang [PAD_GPIO12] = { 0x2b0, 26, 0 }, 248*447976abSJianlong Huang [PAD_GPIO13] = { 0x2b0, 29, 0 }, 249*447976abSJianlong Huang [PAD_GPIO14] = { 0x2b4, 0, 0 }, 250*447976abSJianlong Huang [PAD_GPIO15] = { 0x2b4, 3, 0 }, 251*447976abSJianlong Huang [PAD_GPIO16] = { 0x2b4, 6, 0 }, 252*447976abSJianlong Huang [PAD_GPIO17] = { 0x2b4, 9, 0 }, 253*447976abSJianlong Huang [PAD_GPIO18] = { 0x2b4, 12, 0 }, 254*447976abSJianlong Huang [PAD_GPIO19] = { 0x2b0, 14, 0 }, 255*447976abSJianlong Huang [PAD_GPIO20] = { 0x2b0, 17, 0 }, 256*447976abSJianlong Huang 257*447976abSJianlong Huang [PAD_GPIO21] = { 0x2b4, 21, 1 }, 258*447976abSJianlong Huang [PAD_GPIO22] = { 0x2b4, 18, 1 }, 259*447976abSJianlong Huang [PAD_GPIO23] = { 0x2b4, 15, 1 }, 260*447976abSJianlong Huang [PAD_GPIO24] = { 0x2b0, 11, 1 }, 261*447976abSJianlong Huang [PAD_GPIO25] = { 0x2b0, 20, 1 }, 262*447976abSJianlong Huang [PAD_GPIO26] = { 0x2b0, 23, 1 }, 263*447976abSJianlong Huang [PAD_GPIO27] = { 0x2b0, 26, 1 }, 264*447976abSJianlong Huang [PAD_GPIO28] = { 0x2b0, 29, 1 }, 265*447976abSJianlong Huang [PAD_GPIO29] = { 0x2b4, 0, 1 }, 266*447976abSJianlong Huang [PAD_GPIO30] = { 0x2b4, 3, 1 }, 267*447976abSJianlong Huang [PAD_GPIO31] = { 0x2b4, 6, 1 }, 268*447976abSJianlong Huang [PAD_GPIO32] = { 0x2b4, 9, 1 }, 269*447976abSJianlong Huang [PAD_GPIO33] = { 0x2b4, 12, 1 }, 270*447976abSJianlong Huang [PAD_GPIO34] = { 0x2b0, 14, 1 }, 271*447976abSJianlong Huang [PAD_GPIO35] = { 0x2b0, 17, 1 }, 272*447976abSJianlong Huang 273*447976abSJianlong Huang [PAD_GPIO36] = { 0x2b4, 21, 2 }, 274*447976abSJianlong Huang [PAD_GPIO37] = { 0x2b4, 18, 2 }, 275*447976abSJianlong Huang [PAD_GPIO38] = { 0x2b4, 15, 2 }, 276*447976abSJianlong Huang [PAD_GPIO39] = { 0x2b0, 11, 2 }, 277*447976abSJianlong Huang [PAD_GPIO40] = { 0x2b0, 20, 2 }, 278*447976abSJianlong Huang [PAD_GPIO41] = { 0x2b0, 23, 2 }, 279*447976abSJianlong Huang [PAD_GPIO42] = { 0x2b0, 26, 2 }, 280*447976abSJianlong Huang [PAD_GPIO43] = { 0x2b0, 29, 2 }, 281*447976abSJianlong Huang [PAD_GPIO44] = { 0x2b4, 0, 2 }, 282*447976abSJianlong Huang [PAD_GPIO45] = { 0x2b4, 3, 2 }, 283*447976abSJianlong Huang [PAD_GPIO46] = { 0x2b4, 6, 2 }, 284*447976abSJianlong Huang [PAD_GPIO47] = { 0x2b4, 9, 2 }, 285*447976abSJianlong Huang [PAD_GPIO48] = { 0x2b4, 12, 2 }, 286*447976abSJianlong Huang [PAD_GPIO49] = { 0x2b0, 14, 2 }, 287*447976abSJianlong Huang [PAD_GPIO50] = { 0x2b0, 17, 2 }, 288*447976abSJianlong Huang }; 289*447976abSJianlong Huang 290*447976abSJianlong Huang static void jh7110_set_function(struct jh7110_pinctrl *sfp, 291*447976abSJianlong Huang unsigned int pin, u32 func) 292*447976abSJianlong Huang { 293*447976abSJianlong Huang const struct jh7110_func_sel *fs = &jh7110_sys_func_sel[pin]; 294*447976abSJianlong Huang unsigned long flags; 295*447976abSJianlong Huang void __iomem *reg; 296*447976abSJianlong Huang u32 mask; 297*447976abSJianlong Huang 298*447976abSJianlong Huang if (!fs->offset) 299*447976abSJianlong Huang return; 300*447976abSJianlong Huang 301*447976abSJianlong Huang if (func > fs->max) 302*447976abSJianlong Huang return; 303*447976abSJianlong Huang 304*447976abSJianlong Huang reg = sfp->base + fs->offset; 305*447976abSJianlong Huang func = func << fs->shift; 306*447976abSJianlong Huang mask = 0x3U << fs->shift; 307*447976abSJianlong Huang 308*447976abSJianlong Huang raw_spin_lock_irqsave(&sfp->lock, flags); 309*447976abSJianlong Huang func |= readl_relaxed(reg) & ~mask; 310*447976abSJianlong Huang writel_relaxed(func, reg); 311*447976abSJianlong Huang raw_spin_unlock_irqrestore(&sfp->lock, flags); 312*447976abSJianlong Huang } 313*447976abSJianlong Huang 314*447976abSJianlong Huang static void jh7110_set_vin_group(struct jh7110_pinctrl *sfp, 315*447976abSJianlong Huang unsigned int pin) 316*447976abSJianlong Huang { 317*447976abSJianlong Huang const struct jh7110_vin_group_sel *gs = &jh7110_sys_vin_group_sel[pin]; 318*447976abSJianlong Huang unsigned long flags; 319*447976abSJianlong Huang void __iomem *reg; 320*447976abSJianlong Huang u32 mask; 321*447976abSJianlong Huang u32 grp; 322*447976abSJianlong Huang 323*447976abSJianlong Huang if (!gs->offset) 324*447976abSJianlong Huang return; 325*447976abSJianlong Huang 326*447976abSJianlong Huang reg = sfp->base + gs->offset; 327*447976abSJianlong Huang grp = gs->group << gs->shift; 328*447976abSJianlong Huang mask = 0x3U << gs->shift; 329*447976abSJianlong Huang 330*447976abSJianlong Huang raw_spin_lock_irqsave(&sfp->lock, flags); 331*447976abSJianlong Huang grp |= readl_relaxed(reg) & ~mask; 332*447976abSJianlong Huang writel_relaxed(grp, reg); 333*447976abSJianlong Huang raw_spin_unlock_irqrestore(&sfp->lock, flags); 334*447976abSJianlong Huang } 335*447976abSJianlong Huang 336*447976abSJianlong Huang static int jh7110_sys_set_one_pin_mux(struct jh7110_pinctrl *sfp, 337*447976abSJianlong Huang unsigned int pin, 338*447976abSJianlong Huang unsigned int din, u32 dout, 339*447976abSJianlong Huang u32 doen, u32 func) 340*447976abSJianlong Huang { 341*447976abSJianlong Huang if (pin < sfp->gc.ngpio && func == 0) 342*447976abSJianlong Huang jh7110_set_gpiomux(sfp, pin, din, dout, doen); 343*447976abSJianlong Huang 344*447976abSJianlong Huang jh7110_set_function(sfp, pin, func); 345*447976abSJianlong Huang 346*447976abSJianlong Huang if (pin < sfp->gc.ngpio && func == 2) 347*447976abSJianlong Huang jh7110_set_vin_group(sfp, pin); 348*447976abSJianlong Huang 349*447976abSJianlong Huang return 0; 350*447976abSJianlong Huang } 351*447976abSJianlong Huang 352*447976abSJianlong Huang static int jh7110_sys_get_padcfg_base(struct jh7110_pinctrl *sfp, 353*447976abSJianlong Huang unsigned int pin) 354*447976abSJianlong Huang { 355*447976abSJianlong Huang if (pin < PAD_GMAC1_MDC) 356*447976abSJianlong Huang return JH7110_SYS_GPO_PDA_0_74_CFG; 357*447976abSJianlong Huang else if (pin > PAD_GMAC1_TXC && pin <= PAD_QSPI_DATA3) 358*447976abSJianlong Huang return JH7110_SYS_GPO_PDA_89_94_CFG; 359*447976abSJianlong Huang else 360*447976abSJianlong Huang return -1; 361*447976abSJianlong Huang } 362*447976abSJianlong Huang 363*447976abSJianlong Huang static void jh7110_sys_irq_handler(struct irq_desc *desc) 364*447976abSJianlong Huang { 365*447976abSJianlong Huang struct jh7110_pinctrl *sfp = jh7110_from_irq_desc(desc); 366*447976abSJianlong Huang struct irq_chip *chip = irq_desc_get_chip(desc); 367*447976abSJianlong Huang unsigned long mis; 368*447976abSJianlong Huang unsigned int pin; 369*447976abSJianlong Huang 370*447976abSJianlong Huang chained_irq_enter(chip, desc); 371*447976abSJianlong Huang 372*447976abSJianlong Huang mis = readl_relaxed(sfp->base + JH7110_SYS_GPIOMIS0); 373*447976abSJianlong Huang for_each_set_bit(pin, &mis, 32) 374*447976abSJianlong Huang generic_handle_domain_irq(sfp->gc.irq.domain, pin); 375*447976abSJianlong Huang 376*447976abSJianlong Huang mis = readl_relaxed(sfp->base + JH7110_SYS_GPIOMIS1); 377*447976abSJianlong Huang for_each_set_bit(pin, &mis, 32) 378*447976abSJianlong Huang generic_handle_domain_irq(sfp->gc.irq.domain, pin + 32); 379*447976abSJianlong Huang 380*447976abSJianlong Huang chained_irq_exit(chip, desc); 381*447976abSJianlong Huang } 382*447976abSJianlong Huang 383*447976abSJianlong Huang static int jh7110_sys_init_hw(struct gpio_chip *gc) 384*447976abSJianlong Huang { 385*447976abSJianlong Huang struct jh7110_pinctrl *sfp = container_of(gc, 386*447976abSJianlong Huang struct jh7110_pinctrl, gc); 387*447976abSJianlong Huang 388*447976abSJianlong Huang /* mask all GPIO interrupts */ 389*447976abSJianlong Huang writel(0U, sfp->base + JH7110_SYS_GPIOIE0); 390*447976abSJianlong Huang writel(0U, sfp->base + JH7110_SYS_GPIOIE1); 391*447976abSJianlong Huang /* clear edge interrupt flags */ 392*447976abSJianlong Huang writel(~0U, sfp->base + JH7110_SYS_GPIOIC0); 393*447976abSJianlong Huang writel(~0U, sfp->base + JH7110_SYS_GPIOIC1); 394*447976abSJianlong Huang /* enable GPIO interrupts */ 395*447976abSJianlong Huang writel(1U, sfp->base + JH7110_SYS_GPIOEN); 396*447976abSJianlong Huang return 0; 397*447976abSJianlong Huang } 398*447976abSJianlong Huang 399*447976abSJianlong Huang static const struct jh7110_gpio_irq_reg jh7110_sys_irq_reg = { 400*447976abSJianlong Huang .is_reg_base = JH7110_SYS_GPIOIS0, 401*447976abSJianlong Huang .ic_reg_base = JH7110_SYS_GPIOIC0, 402*447976abSJianlong Huang .ibe_reg_base = JH7110_SYS_GPIOIBE0, 403*447976abSJianlong Huang .iev_reg_base = JH7110_SYS_GPIOIEV0, 404*447976abSJianlong Huang .ie_reg_base = JH7110_SYS_GPIOIE0, 405*447976abSJianlong Huang .ris_reg_base = JH7110_SYS_GPIORIS0, 406*447976abSJianlong Huang .mis_reg_base = JH7110_SYS_GPIOMIS0, 407*447976abSJianlong Huang }; 408*447976abSJianlong Huang 409*447976abSJianlong Huang static const struct jh7110_pinctrl_soc_info jh7110_sys_pinctrl_info = { 410*447976abSJianlong Huang .pins = jh7110_sys_pins, 411*447976abSJianlong Huang .npins = ARRAY_SIZE(jh7110_sys_pins), 412*447976abSJianlong Huang .ngpios = JH7110_SYS_NGPIO, 413*447976abSJianlong Huang .gc_base = JH7110_SYS_GC_BASE, 414*447976abSJianlong Huang .dout_reg_base = JH7110_SYS_DOUT, 415*447976abSJianlong Huang .dout_mask = GENMASK(6, 0), 416*447976abSJianlong Huang .doen_reg_base = JH7110_SYS_DOEN, 417*447976abSJianlong Huang .doen_mask = GENMASK(5, 0), 418*447976abSJianlong Huang .gpi_reg_base = JH7110_SYS_GPI, 419*447976abSJianlong Huang .gpi_mask = GENMASK(6, 0), 420*447976abSJianlong Huang .gpioin_reg_base = JH7110_SYS_GPIOIN, 421*447976abSJianlong Huang .irq_reg = &jh7110_sys_irq_reg, 422*447976abSJianlong Huang .jh7110_set_one_pin_mux = jh7110_sys_set_one_pin_mux, 423*447976abSJianlong Huang .jh7110_get_padcfg_base = jh7110_sys_get_padcfg_base, 424*447976abSJianlong Huang .jh7110_gpio_irq_handler = jh7110_sys_irq_handler, 425*447976abSJianlong Huang .jh7110_gpio_init_hw = jh7110_sys_init_hw, 426*447976abSJianlong Huang }; 427*447976abSJianlong Huang 428*447976abSJianlong Huang static const struct of_device_id jh7110_sys_pinctrl_of_match[] = { 429*447976abSJianlong Huang { 430*447976abSJianlong Huang .compatible = "starfive,jh7110-sys-pinctrl", 431*447976abSJianlong Huang .data = &jh7110_sys_pinctrl_info, 432*447976abSJianlong Huang }, 433*447976abSJianlong Huang { /* sentinel */ } 434*447976abSJianlong Huang }; 435*447976abSJianlong Huang MODULE_DEVICE_TABLE(of, jh7110_sys_pinctrl_of_match); 436*447976abSJianlong Huang 437*447976abSJianlong Huang static struct platform_driver jh7110_sys_pinctrl_driver = { 438*447976abSJianlong Huang .probe = jh7110_pinctrl_probe, 439*447976abSJianlong Huang .driver = { 440*447976abSJianlong Huang .name = "starfive-jh7110-sys-pinctrl", 441*447976abSJianlong Huang .of_match_table = jh7110_sys_pinctrl_of_match, 442*447976abSJianlong Huang }, 443*447976abSJianlong Huang }; 444*447976abSJianlong Huang module_platform_driver(jh7110_sys_pinctrl_driver); 445*447976abSJianlong Huang 446*447976abSJianlong Huang MODULE_DESCRIPTION("Pinctrl driver for the StarFive JH7110 SoC sys controller"); 447*447976abSJianlong Huang MODULE_AUTHOR("Emil Renner Berthing <kernel@esmil.dk>"); 448*447976abSJianlong Huang MODULE_AUTHOR("Jianlong Huang <jianlong.huang@starfivetech.com>"); 449*447976abSJianlong Huang MODULE_LICENSE("GPL"); 450