162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Pinctrl / GPIO driver for StarFive JH7110 SoC sys controller 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2022 Emil Renner Berthing <kernel@esmil.dk> 662306a36Sopenharmony_ci * Copyright (C) 2022 StarFive Technology Co., Ltd. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/bits.h> 1062306a36Sopenharmony_ci#include <linux/clk.h> 1162306a36Sopenharmony_ci#include <linux/gpio/driver.h> 1262306a36Sopenharmony_ci#include <linux/io.h> 1362306a36Sopenharmony_ci#include <linux/mod_devicetable.h> 1462306a36Sopenharmony_ci#include <linux/module.h> 1562306a36Sopenharmony_ci#include <linux/mutex.h> 1662306a36Sopenharmony_ci#include <linux/platform_device.h> 1762306a36Sopenharmony_ci#include <linux/reset.h> 1862306a36Sopenharmony_ci#include <linux/spinlock.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <linux/pinctrl/pinctrl.h> 2162306a36Sopenharmony_ci#include <linux/pinctrl/pinmux.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <dt-bindings/pinctrl/starfive,jh7110-pinctrl.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#include "../core.h" 2662306a36Sopenharmony_ci#include "../pinctrl-utils.h" 2762306a36Sopenharmony_ci#include "../pinmux.h" 2862306a36Sopenharmony_ci#include "../pinconf.h" 2962306a36Sopenharmony_ci#include "pinctrl-starfive-jh7110.h" 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define JH7110_SYS_NGPIO 64 3262306a36Sopenharmony_ci#define JH7110_SYS_GC_BASE 0 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define JH7110_SYS_REGS_NUM 174 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* registers */ 3762306a36Sopenharmony_ci#define JH7110_SYS_DOEN 0x000 3862306a36Sopenharmony_ci#define JH7110_SYS_DOUT 0x040 3962306a36Sopenharmony_ci#define JH7110_SYS_GPI 0x080 4062306a36Sopenharmony_ci#define JH7110_SYS_GPIOIN 0x118 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define JH7110_SYS_GPIOEN 0x0dc 4362306a36Sopenharmony_ci#define JH7110_SYS_GPIOIS0 0x0e0 4462306a36Sopenharmony_ci#define JH7110_SYS_GPIOIS1 0x0e4 4562306a36Sopenharmony_ci#define JH7110_SYS_GPIOIC0 0x0e8 4662306a36Sopenharmony_ci#define JH7110_SYS_GPIOIC1 0x0ec 4762306a36Sopenharmony_ci#define JH7110_SYS_GPIOIBE0 0x0f0 4862306a36Sopenharmony_ci#define JH7110_SYS_GPIOIBE1 0x0f4 4962306a36Sopenharmony_ci#define JH7110_SYS_GPIOIEV0 0x0f8 5062306a36Sopenharmony_ci#define JH7110_SYS_GPIOIEV1 0x0fc 5162306a36Sopenharmony_ci#define JH7110_SYS_GPIOIE0 0x100 5262306a36Sopenharmony_ci#define JH7110_SYS_GPIOIE1 0x104 5362306a36Sopenharmony_ci#define JH7110_SYS_GPIORIS0 0x108 5462306a36Sopenharmony_ci#define JH7110_SYS_GPIORIS1 0x10c 5562306a36Sopenharmony_ci#define JH7110_SYS_GPIOMIS0 0x110 5662306a36Sopenharmony_ci#define JH7110_SYS_GPIOMIS1 0x114 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define JH7110_SYS_GPO_PDA_0_74_CFG 0x120 5962306a36Sopenharmony_ci#define JH7110_SYS_GPO_PDA_89_94_CFG 0x284 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistatic const struct pinctrl_pin_desc jh7110_sys_pins[] = { 6262306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO0, "GPIO0"), 6362306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO1, "GPIO1"), 6462306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO2, "GPIO2"), 6562306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO3, "GPIO3"), 6662306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO4, "GPIO4"), 6762306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO5, "GPIO5"), 6862306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO6, "GPIO6"), 6962306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO7, "GPIO7"), 7062306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO8, "GPIO8"), 7162306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO9, "GPIO9"), 7262306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO10, "GPIO10"), 7362306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO11, "GPIO11"), 7462306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO12, "GPIO12"), 7562306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO13, "GPIO13"), 7662306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO14, "GPIO14"), 7762306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO15, "GPIO15"), 7862306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO16, "GPIO16"), 7962306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO17, "GPIO17"), 8062306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO18, "GPIO18"), 8162306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO19, "GPIO19"), 8262306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO20, "GPIO20"), 8362306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO21, "GPIO21"), 8462306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO22, "GPIO22"), 8562306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO23, "GPIO23"), 8662306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO24, "GPIO24"), 8762306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO25, "GPIO25"), 8862306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO26, "GPIO26"), 8962306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO27, "GPIO27"), 9062306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO28, "GPIO28"), 9162306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO29, "GPIO29"), 9262306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO30, "GPIO30"), 9362306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO31, "GPIO31"), 9462306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO32, "GPIO32"), 9562306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO33, "GPIO33"), 9662306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO34, "GPIO34"), 9762306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO35, "GPIO35"), 9862306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO36, "GPIO36"), 9962306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO37, "GPIO37"), 10062306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO38, "GPIO38"), 10162306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO39, "GPIO39"), 10262306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO40, "GPIO40"), 10362306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO41, "GPIO41"), 10462306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO42, "GPIO42"), 10562306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO43, "GPIO43"), 10662306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO44, "GPIO44"), 10762306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO45, "GPIO45"), 10862306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO46, "GPIO46"), 10962306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO47, "GPIO47"), 11062306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO48, "GPIO48"), 11162306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO49, "GPIO49"), 11262306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO50, "GPIO50"), 11362306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO51, "GPIO51"), 11462306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO52, "GPIO52"), 11562306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO53, "GPIO53"), 11662306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO54, "GPIO54"), 11762306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO55, "GPIO55"), 11862306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO56, "GPIO56"), 11962306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO57, "GPIO57"), 12062306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO58, "GPIO58"), 12162306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO59, "GPIO59"), 12262306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO60, "GPIO60"), 12362306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO61, "GPIO61"), 12462306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO62, "GPIO62"), 12562306a36Sopenharmony_ci PINCTRL_PIN(PAD_GPIO63, "GPIO63"), 12662306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_CLK, "SD0_CLK"), 12762306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_CMD, "SD0_CMD"), 12862306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_DATA0, "SD0_DATA0"), 12962306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_DATA1, "SD0_DATA1"), 13062306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_DATA2, "SD0_DATA2"), 13162306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_DATA3, "SD0_DATA3"), 13262306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_DATA4, "SD0_DATA4"), 13362306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_DATA5, "SD0_DATA5"), 13462306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_DATA6, "SD0_DATA6"), 13562306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_DATA7, "SD0_DATA7"), 13662306a36Sopenharmony_ci PINCTRL_PIN(PAD_SD0_STRB, "SD0_STRB"), 13762306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_MDC, "GMAC1_MDC"), 13862306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_MDIO, "GMAC1_MDIO"), 13962306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_RXD0, "GMAC1_RXD0"), 14062306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_RXD1, "GMAC1_RXD1"), 14162306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_RXD2, "GMAC1_RXD2"), 14262306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_RXD3, "GMAC1_RXD3"), 14362306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_RXDV, "GMAC1_RXDV"), 14462306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_RXC, "GMAC1_RXC"), 14562306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_TXD0, "GMAC1_TXD0"), 14662306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_TXD1, "GMAC1_TXD1"), 14762306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_TXD2, "GMAC1_TXD2"), 14862306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_TXD3, "GMAC1_TXD3"), 14962306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_TXEN, "GMAC1_TXEN"), 15062306a36Sopenharmony_ci PINCTRL_PIN(PAD_GMAC1_TXC, "GMAC1_TXC"), 15162306a36Sopenharmony_ci PINCTRL_PIN(PAD_QSPI_SCLK, "QSPI_SCLK"), 15262306a36Sopenharmony_ci PINCTRL_PIN(PAD_QSPI_CS0, "QSPI_CS0"), 15362306a36Sopenharmony_ci PINCTRL_PIN(PAD_QSPI_DATA0, "QSPI_DATA0"), 15462306a36Sopenharmony_ci PINCTRL_PIN(PAD_QSPI_DATA1, "QSPI_DATA1"), 15562306a36Sopenharmony_ci PINCTRL_PIN(PAD_QSPI_DATA2, "QSPI_DATA2"), 15662306a36Sopenharmony_ci PINCTRL_PIN(PAD_QSPI_DATA3, "QSPI_DATA3"), 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistruct jh7110_func_sel { 16062306a36Sopenharmony_ci u16 offset; 16162306a36Sopenharmony_ci u8 shift; 16262306a36Sopenharmony_ci u8 max; 16362306a36Sopenharmony_ci}; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic const struct jh7110_func_sel 16662306a36Sopenharmony_ci jh7110_sys_func_sel[ARRAY_SIZE(jh7110_sys_pins)] = { 16762306a36Sopenharmony_ci [PAD_GMAC1_RXC] = { 0x29c, 0, 1 }, 16862306a36Sopenharmony_ci [PAD_GPIO10] = { 0x29c, 2, 3 }, 16962306a36Sopenharmony_ci [PAD_GPIO11] = { 0x29c, 5, 3 }, 17062306a36Sopenharmony_ci [PAD_GPIO12] = { 0x29c, 8, 3 }, 17162306a36Sopenharmony_ci [PAD_GPIO13] = { 0x29c, 11, 3 }, 17262306a36Sopenharmony_ci [PAD_GPIO14] = { 0x29c, 14, 3 }, 17362306a36Sopenharmony_ci [PAD_GPIO15] = { 0x29c, 17, 3 }, 17462306a36Sopenharmony_ci [PAD_GPIO16] = { 0x29c, 20, 3 }, 17562306a36Sopenharmony_ci [PAD_GPIO17] = { 0x29c, 23, 3 }, 17662306a36Sopenharmony_ci [PAD_GPIO18] = { 0x29c, 26, 3 }, 17762306a36Sopenharmony_ci [PAD_GPIO19] = { 0x29c, 29, 3 }, 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci [PAD_GPIO20] = { 0x2a0, 0, 3 }, 18062306a36Sopenharmony_ci [PAD_GPIO21] = { 0x2a0, 3, 3 }, 18162306a36Sopenharmony_ci [PAD_GPIO22] = { 0x2a0, 6, 3 }, 18262306a36Sopenharmony_ci [PAD_GPIO23] = { 0x2a0, 9, 3 }, 18362306a36Sopenharmony_ci [PAD_GPIO24] = { 0x2a0, 12, 3 }, 18462306a36Sopenharmony_ci [PAD_GPIO25] = { 0x2a0, 15, 3 }, 18562306a36Sopenharmony_ci [PAD_GPIO26] = { 0x2a0, 18, 3 }, 18662306a36Sopenharmony_ci [PAD_GPIO27] = { 0x2a0, 21, 3 }, 18762306a36Sopenharmony_ci [PAD_GPIO28] = { 0x2a0, 24, 3 }, 18862306a36Sopenharmony_ci [PAD_GPIO29] = { 0x2a0, 27, 3 }, 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci [PAD_GPIO30] = { 0x2a4, 0, 3 }, 19162306a36Sopenharmony_ci [PAD_GPIO31] = { 0x2a4, 3, 3 }, 19262306a36Sopenharmony_ci [PAD_GPIO32] = { 0x2a4, 6, 3 }, 19362306a36Sopenharmony_ci [PAD_GPIO33] = { 0x2a4, 9, 3 }, 19462306a36Sopenharmony_ci [PAD_GPIO34] = { 0x2a4, 12, 3 }, 19562306a36Sopenharmony_ci [PAD_GPIO35] = { 0x2a4, 15, 3 }, 19662306a36Sopenharmony_ci [PAD_GPIO36] = { 0x2a4, 17, 3 }, 19762306a36Sopenharmony_ci [PAD_GPIO37] = { 0x2a4, 20, 3 }, 19862306a36Sopenharmony_ci [PAD_GPIO38] = { 0x2a4, 23, 3 }, 19962306a36Sopenharmony_ci [PAD_GPIO39] = { 0x2a4, 26, 3 }, 20062306a36Sopenharmony_ci [PAD_GPIO40] = { 0x2a4, 29, 3 }, 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci [PAD_GPIO41] = { 0x2a8, 0, 3 }, 20362306a36Sopenharmony_ci [PAD_GPIO42] = { 0x2a8, 3, 3 }, 20462306a36Sopenharmony_ci [PAD_GPIO43] = { 0x2a8, 6, 3 }, 20562306a36Sopenharmony_ci [PAD_GPIO44] = { 0x2a8, 9, 3 }, 20662306a36Sopenharmony_ci [PAD_GPIO45] = { 0x2a8, 12, 3 }, 20762306a36Sopenharmony_ci [PAD_GPIO46] = { 0x2a8, 15, 3 }, 20862306a36Sopenharmony_ci [PAD_GPIO47] = { 0x2a8, 18, 3 }, 20962306a36Sopenharmony_ci [PAD_GPIO48] = { 0x2a8, 21, 3 }, 21062306a36Sopenharmony_ci [PAD_GPIO49] = { 0x2a8, 24, 3 }, 21162306a36Sopenharmony_ci [PAD_GPIO50] = { 0x2a8, 27, 3 }, 21262306a36Sopenharmony_ci [PAD_GPIO51] = { 0x2a8, 30, 3 }, 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci [PAD_GPIO52] = { 0x2ac, 0, 3 }, 21562306a36Sopenharmony_ci [PAD_GPIO53] = { 0x2ac, 2, 3 }, 21662306a36Sopenharmony_ci [PAD_GPIO54] = { 0x2ac, 4, 3 }, 21762306a36Sopenharmony_ci [PAD_GPIO55] = { 0x2ac, 6, 3 }, 21862306a36Sopenharmony_ci [PAD_GPIO56] = { 0x2ac, 9, 3 }, 21962306a36Sopenharmony_ci [PAD_GPIO57] = { 0x2ac, 12, 3 }, 22062306a36Sopenharmony_ci [PAD_GPIO58] = { 0x2ac, 15, 3 }, 22162306a36Sopenharmony_ci [PAD_GPIO59] = { 0x2ac, 18, 3 }, 22262306a36Sopenharmony_ci [PAD_GPIO60] = { 0x2ac, 21, 3 }, 22362306a36Sopenharmony_ci [PAD_GPIO61] = { 0x2ac, 24, 3 }, 22462306a36Sopenharmony_ci [PAD_GPIO62] = { 0x2ac, 27, 3 }, 22562306a36Sopenharmony_ci [PAD_GPIO63] = { 0x2ac, 30, 3 }, 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci [PAD_GPIO6] = { 0x2b0, 0, 3 }, 22862306a36Sopenharmony_ci [PAD_GPIO7] = { 0x2b0, 2, 3 }, 22962306a36Sopenharmony_ci [PAD_GPIO8] = { 0x2b0, 5, 3 }, 23062306a36Sopenharmony_ci [PAD_GPIO9] = { 0x2b0, 8, 3 }, 23162306a36Sopenharmony_ci}; 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistruct jh7110_vin_group_sel { 23462306a36Sopenharmony_ci u16 offset; 23562306a36Sopenharmony_ci u8 shift; 23662306a36Sopenharmony_ci u8 group; 23762306a36Sopenharmony_ci}; 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cistatic const struct jh7110_vin_group_sel 24062306a36Sopenharmony_ci jh7110_sys_vin_group_sel[ARRAY_SIZE(jh7110_sys_pins)] = { 24162306a36Sopenharmony_ci [PAD_GPIO6] = { 0x2b4, 21, 0 }, 24262306a36Sopenharmony_ci [PAD_GPIO7] = { 0x2b4, 18, 0 }, 24362306a36Sopenharmony_ci [PAD_GPIO8] = { 0x2b4, 15, 0 }, 24462306a36Sopenharmony_ci [PAD_GPIO9] = { 0x2b0, 11, 0 }, 24562306a36Sopenharmony_ci [PAD_GPIO10] = { 0x2b0, 20, 0 }, 24662306a36Sopenharmony_ci [PAD_GPIO11] = { 0x2b0, 23, 0 }, 24762306a36Sopenharmony_ci [PAD_GPIO12] = { 0x2b0, 26, 0 }, 24862306a36Sopenharmony_ci [PAD_GPIO13] = { 0x2b0, 29, 0 }, 24962306a36Sopenharmony_ci [PAD_GPIO14] = { 0x2b4, 0, 0 }, 25062306a36Sopenharmony_ci [PAD_GPIO15] = { 0x2b4, 3, 0 }, 25162306a36Sopenharmony_ci [PAD_GPIO16] = { 0x2b4, 6, 0 }, 25262306a36Sopenharmony_ci [PAD_GPIO17] = { 0x2b4, 9, 0 }, 25362306a36Sopenharmony_ci [PAD_GPIO18] = { 0x2b4, 12, 0 }, 25462306a36Sopenharmony_ci [PAD_GPIO19] = { 0x2b0, 14, 0 }, 25562306a36Sopenharmony_ci [PAD_GPIO20] = { 0x2b0, 17, 0 }, 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci [PAD_GPIO21] = { 0x2b4, 21, 1 }, 25862306a36Sopenharmony_ci [PAD_GPIO22] = { 0x2b4, 18, 1 }, 25962306a36Sopenharmony_ci [PAD_GPIO23] = { 0x2b4, 15, 1 }, 26062306a36Sopenharmony_ci [PAD_GPIO24] = { 0x2b0, 11, 1 }, 26162306a36Sopenharmony_ci [PAD_GPIO25] = { 0x2b0, 20, 1 }, 26262306a36Sopenharmony_ci [PAD_GPIO26] = { 0x2b0, 23, 1 }, 26362306a36Sopenharmony_ci [PAD_GPIO27] = { 0x2b0, 26, 1 }, 26462306a36Sopenharmony_ci [PAD_GPIO28] = { 0x2b0, 29, 1 }, 26562306a36Sopenharmony_ci [PAD_GPIO29] = { 0x2b4, 0, 1 }, 26662306a36Sopenharmony_ci [PAD_GPIO30] = { 0x2b4, 3, 1 }, 26762306a36Sopenharmony_ci [PAD_GPIO31] = { 0x2b4, 6, 1 }, 26862306a36Sopenharmony_ci [PAD_GPIO32] = { 0x2b4, 9, 1 }, 26962306a36Sopenharmony_ci [PAD_GPIO33] = { 0x2b4, 12, 1 }, 27062306a36Sopenharmony_ci [PAD_GPIO34] = { 0x2b0, 14, 1 }, 27162306a36Sopenharmony_ci [PAD_GPIO35] = { 0x2b0, 17, 1 }, 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci [PAD_GPIO36] = { 0x2b4, 21, 2 }, 27462306a36Sopenharmony_ci [PAD_GPIO37] = { 0x2b4, 18, 2 }, 27562306a36Sopenharmony_ci [PAD_GPIO38] = { 0x2b4, 15, 2 }, 27662306a36Sopenharmony_ci [PAD_GPIO39] = { 0x2b0, 11, 2 }, 27762306a36Sopenharmony_ci [PAD_GPIO40] = { 0x2b0, 20, 2 }, 27862306a36Sopenharmony_ci [PAD_GPIO41] = { 0x2b0, 23, 2 }, 27962306a36Sopenharmony_ci [PAD_GPIO42] = { 0x2b0, 26, 2 }, 28062306a36Sopenharmony_ci [PAD_GPIO43] = { 0x2b0, 29, 2 }, 28162306a36Sopenharmony_ci [PAD_GPIO44] = { 0x2b4, 0, 2 }, 28262306a36Sopenharmony_ci [PAD_GPIO45] = { 0x2b4, 3, 2 }, 28362306a36Sopenharmony_ci [PAD_GPIO46] = { 0x2b4, 6, 2 }, 28462306a36Sopenharmony_ci [PAD_GPIO47] = { 0x2b4, 9, 2 }, 28562306a36Sopenharmony_ci [PAD_GPIO48] = { 0x2b4, 12, 2 }, 28662306a36Sopenharmony_ci [PAD_GPIO49] = { 0x2b0, 14, 2 }, 28762306a36Sopenharmony_ci [PAD_GPIO50] = { 0x2b0, 17, 2 }, 28862306a36Sopenharmony_ci}; 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_cistatic void jh7110_set_function(struct jh7110_pinctrl *sfp, 29162306a36Sopenharmony_ci unsigned int pin, u32 func) 29262306a36Sopenharmony_ci{ 29362306a36Sopenharmony_ci const struct jh7110_func_sel *fs = &jh7110_sys_func_sel[pin]; 29462306a36Sopenharmony_ci unsigned long flags; 29562306a36Sopenharmony_ci void __iomem *reg; 29662306a36Sopenharmony_ci u32 mask; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci if (!fs->offset) 29962306a36Sopenharmony_ci return; 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci if (func > fs->max) 30262306a36Sopenharmony_ci return; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci reg = sfp->base + fs->offset; 30562306a36Sopenharmony_ci func = func << fs->shift; 30662306a36Sopenharmony_ci mask = 0x3U << fs->shift; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci raw_spin_lock_irqsave(&sfp->lock, flags); 30962306a36Sopenharmony_ci func |= readl_relaxed(reg) & ~mask; 31062306a36Sopenharmony_ci writel_relaxed(func, reg); 31162306a36Sopenharmony_ci raw_spin_unlock_irqrestore(&sfp->lock, flags); 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic void jh7110_set_vin_group(struct jh7110_pinctrl *sfp, 31562306a36Sopenharmony_ci unsigned int pin) 31662306a36Sopenharmony_ci{ 31762306a36Sopenharmony_ci const struct jh7110_vin_group_sel *gs = &jh7110_sys_vin_group_sel[pin]; 31862306a36Sopenharmony_ci unsigned long flags; 31962306a36Sopenharmony_ci void __iomem *reg; 32062306a36Sopenharmony_ci u32 mask; 32162306a36Sopenharmony_ci u32 grp; 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci if (!gs->offset) 32462306a36Sopenharmony_ci return; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci reg = sfp->base + gs->offset; 32762306a36Sopenharmony_ci grp = gs->group << gs->shift; 32862306a36Sopenharmony_ci mask = 0x3U << gs->shift; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci raw_spin_lock_irqsave(&sfp->lock, flags); 33162306a36Sopenharmony_ci grp |= readl_relaxed(reg) & ~mask; 33262306a36Sopenharmony_ci writel_relaxed(grp, reg); 33362306a36Sopenharmony_ci raw_spin_unlock_irqrestore(&sfp->lock, flags); 33462306a36Sopenharmony_ci} 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_cistatic int jh7110_sys_set_one_pin_mux(struct jh7110_pinctrl *sfp, 33762306a36Sopenharmony_ci unsigned int pin, 33862306a36Sopenharmony_ci unsigned int din, u32 dout, 33962306a36Sopenharmony_ci u32 doen, u32 func) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci if (pin < sfp->gc.ngpio && func == 0) 34262306a36Sopenharmony_ci jh7110_set_gpiomux(sfp, pin, din, dout, doen); 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci jh7110_set_function(sfp, pin, func); 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci if (pin < sfp->gc.ngpio && func == 2) 34762306a36Sopenharmony_ci jh7110_set_vin_group(sfp, pin); 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci return 0; 35062306a36Sopenharmony_ci} 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_cistatic int jh7110_sys_get_padcfg_base(struct jh7110_pinctrl *sfp, 35362306a36Sopenharmony_ci unsigned int pin) 35462306a36Sopenharmony_ci{ 35562306a36Sopenharmony_ci if (pin < PAD_GMAC1_MDC) 35662306a36Sopenharmony_ci return JH7110_SYS_GPO_PDA_0_74_CFG; 35762306a36Sopenharmony_ci else if (pin > PAD_GMAC1_TXC && pin <= PAD_QSPI_DATA3) 35862306a36Sopenharmony_ci return JH7110_SYS_GPO_PDA_89_94_CFG; 35962306a36Sopenharmony_ci else 36062306a36Sopenharmony_ci return -1; 36162306a36Sopenharmony_ci} 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_cistatic void jh7110_sys_irq_handler(struct irq_desc *desc) 36462306a36Sopenharmony_ci{ 36562306a36Sopenharmony_ci struct jh7110_pinctrl *sfp = jh7110_from_irq_desc(desc); 36662306a36Sopenharmony_ci struct irq_chip *chip = irq_desc_get_chip(desc); 36762306a36Sopenharmony_ci unsigned long mis; 36862306a36Sopenharmony_ci unsigned int pin; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci chained_irq_enter(chip, desc); 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci mis = readl_relaxed(sfp->base + JH7110_SYS_GPIOMIS0); 37362306a36Sopenharmony_ci for_each_set_bit(pin, &mis, 32) 37462306a36Sopenharmony_ci generic_handle_domain_irq(sfp->gc.irq.domain, pin); 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci mis = readl_relaxed(sfp->base + JH7110_SYS_GPIOMIS1); 37762306a36Sopenharmony_ci for_each_set_bit(pin, &mis, 32) 37862306a36Sopenharmony_ci generic_handle_domain_irq(sfp->gc.irq.domain, pin + 32); 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci chained_irq_exit(chip, desc); 38162306a36Sopenharmony_ci} 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_cistatic int jh7110_sys_init_hw(struct gpio_chip *gc) 38462306a36Sopenharmony_ci{ 38562306a36Sopenharmony_ci struct jh7110_pinctrl *sfp = container_of(gc, 38662306a36Sopenharmony_ci struct jh7110_pinctrl, gc); 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci /* mask all GPIO interrupts */ 38962306a36Sopenharmony_ci writel(0U, sfp->base + JH7110_SYS_GPIOIE0); 39062306a36Sopenharmony_ci writel(0U, sfp->base + JH7110_SYS_GPIOIE1); 39162306a36Sopenharmony_ci /* clear edge interrupt flags */ 39262306a36Sopenharmony_ci writel(~0U, sfp->base + JH7110_SYS_GPIOIC0); 39362306a36Sopenharmony_ci writel(~0U, sfp->base + JH7110_SYS_GPIOIC1); 39462306a36Sopenharmony_ci /* enable GPIO interrupts */ 39562306a36Sopenharmony_ci writel(1U, sfp->base + JH7110_SYS_GPIOEN); 39662306a36Sopenharmony_ci return 0; 39762306a36Sopenharmony_ci} 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_cistatic const struct jh7110_gpio_irq_reg jh7110_sys_irq_reg = { 40062306a36Sopenharmony_ci .is_reg_base = JH7110_SYS_GPIOIS0, 40162306a36Sopenharmony_ci .ic_reg_base = JH7110_SYS_GPIOIC0, 40262306a36Sopenharmony_ci .ibe_reg_base = JH7110_SYS_GPIOIBE0, 40362306a36Sopenharmony_ci .iev_reg_base = JH7110_SYS_GPIOIEV0, 40462306a36Sopenharmony_ci .ie_reg_base = JH7110_SYS_GPIOIE0, 40562306a36Sopenharmony_ci .ris_reg_base = JH7110_SYS_GPIORIS0, 40662306a36Sopenharmony_ci .mis_reg_base = JH7110_SYS_GPIOMIS0, 40762306a36Sopenharmony_ci}; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_cistatic const struct jh7110_pinctrl_soc_info jh7110_sys_pinctrl_info = { 41062306a36Sopenharmony_ci .pins = jh7110_sys_pins, 41162306a36Sopenharmony_ci .npins = ARRAY_SIZE(jh7110_sys_pins), 41262306a36Sopenharmony_ci .ngpios = JH7110_SYS_NGPIO, 41362306a36Sopenharmony_ci .gc_base = JH7110_SYS_GC_BASE, 41462306a36Sopenharmony_ci .dout_reg_base = JH7110_SYS_DOUT, 41562306a36Sopenharmony_ci .dout_mask = GENMASK(6, 0), 41662306a36Sopenharmony_ci .doen_reg_base = JH7110_SYS_DOEN, 41762306a36Sopenharmony_ci .doen_mask = GENMASK(5, 0), 41862306a36Sopenharmony_ci .gpi_reg_base = JH7110_SYS_GPI, 41962306a36Sopenharmony_ci .gpi_mask = GENMASK(6, 0), 42062306a36Sopenharmony_ci .gpioin_reg_base = JH7110_SYS_GPIOIN, 42162306a36Sopenharmony_ci .irq_reg = &jh7110_sys_irq_reg, 42262306a36Sopenharmony_ci .nsaved_regs = JH7110_SYS_REGS_NUM, 42362306a36Sopenharmony_ci .jh7110_set_one_pin_mux = jh7110_sys_set_one_pin_mux, 42462306a36Sopenharmony_ci .jh7110_get_padcfg_base = jh7110_sys_get_padcfg_base, 42562306a36Sopenharmony_ci .jh7110_gpio_irq_handler = jh7110_sys_irq_handler, 42662306a36Sopenharmony_ci .jh7110_gpio_init_hw = jh7110_sys_init_hw, 42762306a36Sopenharmony_ci}; 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_cistatic const struct of_device_id jh7110_sys_pinctrl_of_match[] = { 43062306a36Sopenharmony_ci { 43162306a36Sopenharmony_ci .compatible = "starfive,jh7110-sys-pinctrl", 43262306a36Sopenharmony_ci .data = &jh7110_sys_pinctrl_info, 43362306a36Sopenharmony_ci }, 43462306a36Sopenharmony_ci { /* sentinel */ } 43562306a36Sopenharmony_ci}; 43662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, jh7110_sys_pinctrl_of_match); 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_cistatic struct platform_driver jh7110_sys_pinctrl_driver = { 43962306a36Sopenharmony_ci .probe = jh7110_pinctrl_probe, 44062306a36Sopenharmony_ci .driver = { 44162306a36Sopenharmony_ci .name = "starfive-jh7110-sys-pinctrl", 44262306a36Sopenharmony_ci .of_match_table = jh7110_sys_pinctrl_of_match, 44362306a36Sopenharmony_ci .pm = pm_sleep_ptr(&jh7110_pinctrl_pm_ops), 44462306a36Sopenharmony_ci }, 44562306a36Sopenharmony_ci}; 44662306a36Sopenharmony_cimodule_platform_driver(jh7110_sys_pinctrl_driver); 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ciMODULE_DESCRIPTION("Pinctrl driver for the StarFive JH7110 SoC sys controller"); 44962306a36Sopenharmony_ciMODULE_AUTHOR("Emil Renner Berthing <kernel@esmil.dk>"); 45062306a36Sopenharmony_ciMODULE_AUTHOR("Jianlong Huang <jianlong.huang@starfivetech.com>"); 45162306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 452