xref: /rk3399_rockchip-uboot/drivers/pinctrl/rockchip/pinctrl-rk3568.c (revision fdb0ec9f44410a466294964a4a932716fb450127)
13f4af211SJianqun Xu // SPDX-License-Identifier: GPL-2.0+
23f4af211SJianqun Xu /*
33f4af211SJianqun Xu  * (C) Copyright 2020 Rockchip Electronics Co., Ltd
43f4af211SJianqun Xu  */
53f4af211SJianqun Xu 
6*fdb0ec9fSYe Zhang #include <asm/arch/cpu.h>
73f4af211SJianqun Xu #include <common.h>
83f4af211SJianqun Xu #include <dm.h>
93f4af211SJianqun Xu #include <dm/pinctrl.h>
103f4af211SJianqun Xu #include <regmap.h>
113f4af211SJianqun Xu #include <syscon.h>
123f4af211SJianqun Xu 
133f4af211SJianqun Xu #include "pinctrl-rockchip.h"
143f4af211SJianqun Xu 
153f4af211SJianqun Xu static struct rockchip_mux_route_data rk3568_mux_route_data[] = {
163f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PB3, RK_FUNC_2, 0x0300, RK_GENMASK_VAL(0, 0, 0)), /* CAN0 IO mux selection M0 */
173f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA1, RK_FUNC_4, 0x0300, RK_GENMASK_VAL(0, 0, 1)), /* CAN0 IO mux selection M1 */
183f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA1, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(2, 2, 0)), /* CAN1 IO mux selection M0 */
193f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PC3, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(2, 2, 1)), /* CAN1 IO mux selection M1 */
203f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PB5, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(4, 4, 0)), /* CAN2 IO mux selection M0 */
213f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB2, RK_FUNC_4, 0x0300, RK_GENMASK_VAL(4, 4, 1)), /* CAN2 IO mux selection M1 */
223f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PC4, RK_FUNC_1, 0x0300, RK_GENMASK_VAL(6, 6, 0)), /* EDPDP_HPDIN IO mux selection M0 */
233f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PC2, RK_FUNC_2, 0x0300, RK_GENMASK_VAL(6, 6, 1)), /* EDPDP_HPDIN IO mux selection M1 */
24ee1ce3c5SDavid Wu 	MR_TOPGRF(RK_GPIO3, RK_PB1, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(8, 8, 0)), /* GMAC1 IO mux selection M0 */
25ee1ce3c5SDavid Wu 	MR_TOPGRF(RK_GPIO4, RK_PA7, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(8, 8, 1)), /* GMAC1 IO mux selection M1 */
263f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PD1, RK_FUNC_1, 0x0300, RK_GENMASK_VAL(10, 10, 0)), /* HDMITX IO mux selection M0 */
273f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PC7, RK_FUNC_1, 0x0300, RK_GENMASK_VAL(10, 10, 1)), /* HDMITX IO mux selection M1 */
283f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PB6, RK_FUNC_1, 0x0300, RK_GENMASK_VAL(14, 14, 0)), /* I2C2 IO mux selection M0 */
293f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PB4, RK_FUNC_1, 0x0300, RK_GENMASK_VAL(14, 14, 1)), /* I2C2 IO mux selection M1 */
303f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA0, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(0, 0, 0)), /* I2C3 IO mux selection M0 */
313f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PB6, RK_FUNC_4, 0x0304, RK_GENMASK_VAL(0, 0, 1)), /* I2C3 IO mux selection M1 */
323f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PB2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(2, 2, 0)), /* I2C4 IO mux selection M0 */
333f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB1, RK_FUNC_2, 0x0304, RK_GENMASK_VAL(2, 2, 1)), /* I2C4 IO mux selection M1 */
343f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PB4, RK_FUNC_4, 0x0304, RK_GENMASK_VAL(4, 4, 0)), /* I2C5 IO mux selection M0 */
353f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PD0, RK_FUNC_2, 0x0304, RK_GENMASK_VAL(4, 4, 1)), /* I2C5 IO mux selection M1 */
363f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(6, 6, 0)), /* PWM4 IO mux selection M0 */
373f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(6, 6, 1)), /* PWM4 IO mux selection M1 */
383f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(8, 8, 0)), /* PWM5 IO mux selection M0 */
393f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(8, 8, 1)), /* PWM5 IO mux selection M1 */
403f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(10, 10, 0)), /* PWM6 IO mux selection M0 */
413f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(10, 10, 1)), /* PWM6 IO mux selection M1 */
423f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(12, 12, 0)), /* PWM7 IO mux selection M0 */
433f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(12, 12, 1)), /* PWM7 IO mux selection M1 */
443f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(14, 14, 0)), /* PWM8 IO mux selection M0 */
453f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(14, 14, 1)), /* PWM8 IO mux selection M1 */
463f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(0, 0, 0)), /* PWM9 IO mux selection M0 */
473f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(0, 0, 1)), /* PWM9 IO mux selection M1 */
483f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(2, 2, 0)), /* PWM10 IO mux selection M0 */
493f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(2, 2, 1)), /* PWM10 IO mux selection M1 */
503f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(4, 4, 0)), /* PWM11 IO mux selection M0 */
513f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(4, 4, 1)), /* PWM11 IO mux selection M1 */
523f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(6, 6, 0)), /* PWM12 IO mux selection M0 */
533f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(6, 6, 1)), /* PWM12 IO mux selection M1 */
543f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(8, 8, 0)), /* PWM13 IO mux selection M0 */
553f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(8, 8, 1)), /* PWM13 IO mux selection M1 */
563f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(10, 10, 0)), /* PWM14 IO mux selection M0 */
573f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(10, 10, 1)), /* PWM14 IO mux selection M1 */
583f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(12, 12, 0)), /* PWM15 IO mux selection M0 */
593f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(12, 12, 1)), /* PWM15 IO mux selection M1 */
603f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_3, 0x0308, RK_GENMASK_VAL(14, 14, 0)), /* SDMMC2 IO mux selection M0 */
613f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA5, RK_FUNC_5, 0x0308, RK_GENMASK_VAL(14, 14, 1)), /* SDMMC2 IO mux selection M1 */
623f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PB5, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(0, 0, 0)), /* SPI0 IO mux selection M0 */
633f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD3, RK_FUNC_3, 0x030c, RK_GENMASK_VAL(0, 0, 1)), /* SPI0 IO mux selection M1 */
643f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB5, RK_FUNC_3, 0x030c, RK_GENMASK_VAL(2, 2, 0)), /* SPI1 IO mux selection M0 */
653f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC3, RK_FUNC_3, 0x030c, RK_GENMASK_VAL(2, 2, 1)), /* SPI1 IO mux selection M1 */
663f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PC1, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(4, 4, 0)), /* SPI2 IO mux selection M0 */
673f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_3, 0x030c, RK_GENMASK_VAL(4, 4, 1)), /* SPI2 IO mux selection M1 */
683f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PB3, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(6, 6, 0)), /* SPI3 IO mux selection M0 */
693f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PC2, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(6, 6, 1)), /* SPI3 IO mux selection M1 */
703f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB4, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(8, 8, 0)), /* UART1 IO mux selection M0 */
713f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PD1, RK_FUNC_1, 0x030c, RK_GENMASK_VAL(8, 8, 1)), /* UART1 IO mux selection M1 */
723f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PD1, RK_FUNC_1, 0x030c, RK_GENMASK_VAL(10, 10, 0)), /* UART2 IO mux selection M0 */
733f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(10, 10, 1)), /* UART2 IO mux selection M1 */
743f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA1, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(12, 12, 0)), /* UART3 IO mux selection M0 */
753f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PB7, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(12, 12, 1)), /* UART3 IO mux selection M1 */
763f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA6, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(14, 14, 0)), /* UART4 IO mux selection M0 */
773f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PB2, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(14, 14, 1)), /* UART4 IO mux selection M1 */
783f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA2, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(0, 0, 0)), /* UART5 IO mux selection M0 */
793f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC2, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(0, 0, 1)), /* UART5 IO mux selection M1 */
803f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA4, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(2, 2, 0)), /* UART6 IO mux selection M0 */
813f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(2, 2, 1)), /* UART6 IO mux selection M1 */
823f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PA6, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(5, 4, 0)), /* UART7 IO mux selection M0 */
833f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC4, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(5, 4, 1)), /* UART7 IO mux selection M1 */
843f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x0310, RK_GENMASK_VAL(5, 4, 2)), /* UART7 IO mux selection M2 */
853f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PC5, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(6, 6, 0)), /* UART8 IO mux selection M0 */
863f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD7, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(6, 6, 1)), /* UART8 IO mux selection M1 */
873f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PB0, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(9, 8, 0)), /* UART9 IO mux selection M0 */
883f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PC5, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(9, 8, 1)), /* UART9 IO mux selection M1 */
893f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PA4, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(9, 8, 2)), /* UART9 IO mux selection M2 */
903f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA2, RK_FUNC_1, 0x0310, RK_GENMASK_VAL(11, 10, 0)), /* I2S1 IO mux selection M0 */
913f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(11, 10, 1)), /* I2S1 IO mux selection M1 */
923f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD0, RK_FUNC_5, 0x0310, RK_GENMASK_VAL(11, 10, 2)), /* I2S1 IO mux selection M2 */
933f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PC1, RK_FUNC_1, 0x0310, RK_GENMASK_VAL(12, 12, 0)), /* I2S2 IO mux selection M0 */
943f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PB6, RK_FUNC_5, 0x0310, RK_GENMASK_VAL(12, 12, 1)), /* I2S2 IO mux selection M1 */
953f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PA2, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(14, 14, 0)), /* I2S3 IO mux selection M0 */
963f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PC2, RK_FUNC_5, 0x0310, RK_GENMASK_VAL(14, 14, 1)), /* I2S3 IO mux selection M1 */
973f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA6, RK_FUNC_3, 0x0314, RK_GENMASK_VAL(0, 0, 0)), /* PDM IO mux selection M0 */
983f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO3, RK_PD6, RK_FUNC_5, 0x0314, RK_GENMASK_VAL(0, 0, 1)), /* PDM IO mux selection M1 */
993f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PA5, RK_FUNC_3, 0x0314, RK_GENMASK_VAL(3, 2, 0)), /* PCIE20 IO mux selection M0 */
1003f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD0, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(3, 2, 1)), /* PCIE20 IO mux selection M1 */
1013f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PB0, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(3, 2, 2)), /* PCIE20 IO mux selection M2 */
1023f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PA4, RK_FUNC_3, 0x0314, RK_GENMASK_VAL(5, 4, 0)), /* PCIE30X1 IO mux selection M0 */
1033f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD2, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(5, 4, 1)), /* PCIE30X1 IO mux selection M1 */
1043f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO1, RK_PA5, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(5, 4, 2)), /* PCIE30X1 IO mux selection M2 */
1053f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO0, RK_PA6, RK_FUNC_2, 0x0314, RK_GENMASK_VAL(7, 6, 0)), /* PCIE30X2 IO mux selection M0 */
1063f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO2, RK_PD4, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(7, 6, 1)), /* PCIE30X2 IO mux selection M1 */
1073f4af211SJianqun Xu 	MR_TOPGRF(RK_GPIO4, RK_PC2, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(7, 6, 2)), /* PCIE30X2 IO mux selection M2 */
1083f4af211SJianqun Xu };
1093f4af211SJianqun Xu 
rk3568_set_mux(struct rockchip_pin_bank * bank,int pin,int mux)1103f4af211SJianqun Xu static int rk3568_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
1113f4af211SJianqun Xu {
1123f4af211SJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
1133f4af211SJianqun Xu 	int iomux_num = (pin / 8);
1143f4af211SJianqun Xu 	struct regmap *regmap;
11582c37e39SSteven Liu 	int reg, mask;
1163f4af211SJianqun Xu 	u8 bit;
11782c37e39SSteven Liu 	u32 data, rmask;
1183f4af211SJianqun Xu 
1193f4af211SJianqun Xu 	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
1203f4af211SJianqun Xu 
1213f4af211SJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1223f4af211SJianqun Xu 		regmap = priv->regmap_pmu;
1233f4af211SJianqun Xu 	else
1243f4af211SJianqun Xu 		regmap = priv->regmap_base;
1253f4af211SJianqun Xu 
1263f4af211SJianqun Xu 	reg = bank->iomux[iomux_num].offset;
1273f4af211SJianqun Xu 	if ((pin % 8) >= 4)
1283f4af211SJianqun Xu 		reg += 0x4;
1293f4af211SJianqun Xu 	bit = (pin % 4) * 4;
1303f4af211SJianqun Xu 	mask = 0xf;
1313f4af211SJianqun Xu 
1323f4af211SJianqun Xu 	data = (mask << (bit + 16));
13382c37e39SSteven Liu 	rmask = data | (data >> 16);
1343f4af211SJianqun Xu 	data |= (mux & mask) << bit;
1353f4af211SJianqun Xu 
13682c37e39SSteven Liu 	return regmap_update_bits(regmap, reg, rmask, data);
1373f4af211SJianqun Xu }
1383f4af211SJianqun Xu 
139836c6892SJianqun Xu #define RK3568_PULL_PMU_OFFSET		0x20
140836c6892SJianqun Xu #define RK3568_PULL_GRF_OFFSET		0x80
1413f4af211SJianqun Xu #define RK3568_PULL_BITS_PER_PIN	2
1423f4af211SJianqun Xu #define RK3568_PULL_PINS_PER_REG	8
1433f4af211SJianqun Xu #define RK3568_PULL_BANK_STRIDE		0x10
1443f4af211SJianqun Xu 
rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1453f4af211SJianqun Xu static void rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1463f4af211SJianqun Xu 					 int pin_num, struct regmap **regmap,
1473f4af211SJianqun Xu 					 int *reg, u8 *bit)
1483f4af211SJianqun Xu {
1493f4af211SJianqun Xu 	struct rockchip_pinctrl_priv *info = bank->priv;
1503f4af211SJianqun Xu 
1513f4af211SJianqun Xu 	if (bank->bank_num == 0) {
1523f4af211SJianqun Xu 		*regmap = info->regmap_pmu;
1533f4af211SJianqun Xu 		*reg = RK3568_PULL_PMU_OFFSET;
1543f4af211SJianqun Xu 		*reg += bank->bank_num * RK3568_PULL_BANK_STRIDE;
1553f4af211SJianqun Xu 	} else {
1563f4af211SJianqun Xu 		*regmap = info->regmap_base;
1573f4af211SJianqun Xu 		*reg = RK3568_PULL_GRF_OFFSET;
1583f4af211SJianqun Xu 		*reg += (bank->bank_num - 1) * RK3568_PULL_BANK_STRIDE;
159836c6892SJianqun Xu 	}
1603f4af211SJianqun Xu 
161836c6892SJianqun Xu 	*reg += ((pin_num / RK3568_PULL_PINS_PER_REG) * 4);
1623f4af211SJianqun Xu 	*bit = (pin_num % RK3568_PULL_PINS_PER_REG);
1633f4af211SJianqun Xu 	*bit *= RK3568_PULL_BITS_PER_PIN;
1643f4af211SJianqun Xu }
1653f4af211SJianqun Xu 
1663f4af211SJianqun Xu #define RK3568_DRV_PMU_OFFSET		0x70
1673f4af211SJianqun Xu #define RK3568_DRV_GRF_OFFSET		0x200
1683f4af211SJianqun Xu #define RK3568_DRV_BITS_PER_PIN		8
1693f4af211SJianqun Xu #define RK3568_DRV_PINS_PER_REG		2
1703f4af211SJianqun Xu #define RK3568_DRV_BANK_STRIDE		0x40
1713f4af211SJianqun Xu 
rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1723f4af211SJianqun Xu static void rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1733f4af211SJianqun Xu 					int pin_num, struct regmap **regmap,
1743f4af211SJianqun Xu 					int *reg, u8 *bit)
1753f4af211SJianqun Xu {
1763f4af211SJianqun Xu 	struct rockchip_pinctrl_priv *info = bank->priv;
1773f4af211SJianqun Xu 
1783f4af211SJianqun Xu 	/* The first 32 pins of the first bank are located in PMU */
1793f4af211SJianqun Xu 	if (bank->bank_num == 0) {
1803f4af211SJianqun Xu 		*regmap = info->regmap_pmu;
1813f4af211SJianqun Xu 		*reg = RK3568_DRV_PMU_OFFSET;
1823f4af211SJianqun Xu 	} else {
1833f4af211SJianqun Xu 		*regmap = info->regmap_base;
1843f4af211SJianqun Xu 		*reg = RK3568_DRV_GRF_OFFSET;
1853f4af211SJianqun Xu 		*reg += (bank->bank_num - 1) * RK3568_DRV_BANK_STRIDE;
186836c6892SJianqun Xu 	}
1873f4af211SJianqun Xu 
188836c6892SJianqun Xu 	*reg += ((pin_num / RK3568_DRV_PINS_PER_REG) * 4);
1893f4af211SJianqun Xu 	*bit = (pin_num % RK3568_DRV_PINS_PER_REG);
1903f4af211SJianqun Xu 	*bit *= RK3568_DRV_BITS_PER_PIN;
1913f4af211SJianqun Xu }
192836c6892SJianqun Xu 
193836c6892SJianqun Xu #define RK3568_SCHMITT_BITS_PER_PIN		2
194836c6892SJianqun Xu #define RK3568_SCHMITT_PINS_PER_REG		8
195836c6892SJianqun Xu #define RK3568_SCHMITT_BANK_STRIDE		0x10
196836c6892SJianqun Xu #define RK3568_SCHMITT_GRF_OFFSET		0xc0
197836c6892SJianqun Xu #define RK3568_SCHMITT_PMUGRF_OFFSET		0x30
198836c6892SJianqun Xu 
rk3568_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)199836c6892SJianqun Xu static int rk3568_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
200836c6892SJianqun Xu 					   int pin_num, struct regmap **regmap,
201836c6892SJianqun Xu 					   int *reg, u8 *bit)
202836c6892SJianqun Xu {
203836c6892SJianqun Xu 	struct rockchip_pinctrl_priv *info = bank->priv;
204836c6892SJianqun Xu 
205836c6892SJianqun Xu 	if (bank->bank_num == 0) {
206836c6892SJianqun Xu 		*regmap = info->regmap_pmu;
207836c6892SJianqun Xu 		*reg = RK3568_SCHMITT_PMUGRF_OFFSET;
208836c6892SJianqun Xu 	} else {
209836c6892SJianqun Xu 		*regmap = info->regmap_base;
210836c6892SJianqun Xu 		*reg = RK3568_SCHMITT_GRF_OFFSET;
211836c6892SJianqun Xu 		*reg += (bank->bank_num - 1) * RK3568_SCHMITT_BANK_STRIDE;
212836c6892SJianqun Xu 	}
213836c6892SJianqun Xu 
214836c6892SJianqun Xu 	*reg += ((pin_num / RK3568_SCHMITT_PINS_PER_REG) * 4);
215836c6892SJianqun Xu 	*bit = pin_num % RK3568_SCHMITT_PINS_PER_REG;
216836c6892SJianqun Xu 	*bit *= RK3568_SCHMITT_BITS_PER_PIN;
217836c6892SJianqun Xu 
218836c6892SJianqun Xu 	return 0;
2193f4af211SJianqun Xu }
2203f4af211SJianqun Xu 
rk3568_set_pull(struct rockchip_pin_bank * bank,int pin_num,int pull)2213f4af211SJianqun Xu static int rk3568_set_pull(struct rockchip_pin_bank *bank,
2223f4af211SJianqun Xu 			   int pin_num, int pull)
2233f4af211SJianqun Xu {
2243f4af211SJianqun Xu 	struct regmap *regmap;
2253f4af211SJianqun Xu 	int reg, ret;
2263f4af211SJianqun Xu 	u8 bit, type;
22782c37e39SSteven Liu 	u32 data, rmask;
2283f4af211SJianqun Xu 
2293f4af211SJianqun Xu 	if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT)
2303f4af211SJianqun Xu 		return -ENOTSUPP;
2313f4af211SJianqun Xu 
2323f4af211SJianqun Xu 	rk3568_calc_pull_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
2333f4af211SJianqun Xu 	type = bank->pull_type[pin_num / 8];
2343f4af211SJianqun Xu 	ret = rockchip_translate_pull_value(type, pull);
2353f4af211SJianqun Xu 	if (ret < 0) {
2363f4af211SJianqun Xu 		debug("unsupported pull setting %d\n", pull);
2373f4af211SJianqun Xu 		return ret;
2383f4af211SJianqun Xu 	}
2393f4af211SJianqun Xu 
2403f4af211SJianqun Xu 	/* enable the write to the equivalent lower bits */
2413f4af211SJianqun Xu 	data = ((1 << ROCKCHIP_PULL_BITS_PER_PIN) - 1) << (bit + 16);
24282c37e39SSteven Liu 	rmask = data | (data >> 16);
2433f4af211SJianqun Xu 	data |= (ret << bit);
2443f4af211SJianqun Xu 
24582c37e39SSteven Liu 	return regmap_update_bits(regmap, reg, rmask, data);
2463f4af211SJianqun Xu }
2473f4af211SJianqun Xu 
24882c37e39SSteven Liu #define GRF_GPIO1C5_DS		0x0840
24982c37e39SSteven Liu #define GRF_GPIO2A2_DS		0x0844
25082c37e39SSteven Liu #define GRF_GPIO2B0_DS		0x0848
25182c37e39SSteven Liu #define GRF_GPIO3A0_DS		0x084c
25282c37e39SSteven Liu #define GRF_GPIO3A6_DS		0x0850
25382c37e39SSteven Liu #define GRF_GPIO4A0_DS		0x0854
25482c37e39SSteven Liu 
rk3568_set_drive(struct rockchip_pin_bank * bank,int pin_num,int strength)2553f4af211SJianqun Xu static int rk3568_set_drive(struct rockchip_pin_bank *bank,
2563f4af211SJianqun Xu 			    int pin_num, int strength)
2573f4af211SJianqun Xu {
2583f4af211SJianqun Xu 	struct regmap *regmap;
25982c37e39SSteven Liu 	int reg, ret;
26082c37e39SSteven Liu 	u32 data, rmask;
2613f4af211SJianqun Xu 	u8 bit;
262836c6892SJianqun Xu 	int drv = (1 << (strength + 1)) - 1;
2633f4af211SJianqun Xu 
2643f4af211SJianqun Xu 	rk3568_calc_drv_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
2653f4af211SJianqun Xu 
2663f4af211SJianqun Xu 	/* enable the write to the equivalent lower bits */
2673f4af211SJianqun Xu 	data = ((1 << RK3568_DRV_BITS_PER_PIN) - 1) << (bit + 16);
26882c37e39SSteven Liu 	rmask = data | (data >> 16);
269836c6892SJianqun Xu 	data |= (drv << bit);
270836c6892SJianqun Xu 
27182c37e39SSteven Liu 	ret = regmap_update_bits(regmap, reg, rmask, data);
272836c6892SJianqun Xu 	if (ret)
273836c6892SJianqun Xu 		return ret;
274836c6892SJianqun Xu 
275*fdb0ec9fSYe Zhang 	if (rockchip_get_cpu_version() > 0)
276*fdb0ec9fSYe Zhang 		return 0;
277*fdb0ec9fSYe Zhang 
278836c6892SJianqun Xu 	if (bank->bank_num == 1 && pin_num == 21)
27982c37e39SSteven Liu 		reg = GRF_GPIO1C5_DS;
280836c6892SJianqun Xu 	else if (bank->bank_num == 2 && pin_num == 2)
28182c37e39SSteven Liu 		reg = GRF_GPIO2A2_DS;
282836c6892SJianqun Xu 	else if (bank->bank_num == 2 && pin_num == 8)
28382c37e39SSteven Liu 		reg = GRF_GPIO2B0_DS;
284836c6892SJianqun Xu 	else if (bank->bank_num == 3 && pin_num == 0)
28582c37e39SSteven Liu 		reg = GRF_GPIO3A0_DS;
286836c6892SJianqun Xu 	else if (bank->bank_num == 3 && pin_num == 6)
28782c37e39SSteven Liu 		reg = GRF_GPIO3A6_DS;
288836c6892SJianqun Xu 	else if (bank->bank_num == 4 && pin_num == 0)
28982c37e39SSteven Liu 		reg = GRF_GPIO4A0_DS;
290836c6892SJianqun Xu 	else
291836c6892SJianqun Xu 		return 0;
292836c6892SJianqun Xu 
293836c6892SJianqun Xu 	data = ((1 << RK3568_DRV_BITS_PER_PIN) - 1) << 16;
29482c37e39SSteven Liu 	rmask = data | (data >> 16);
295*fdb0ec9fSYe Zhang 	data |= drv;
2963f4af211SJianqun Xu 
29782c37e39SSteven Liu 	return regmap_update_bits(regmap, reg, rmask, data);
2983f4af211SJianqun Xu }
2993f4af211SJianqun Xu 
rk3568_set_schmitt(struct rockchip_pin_bank * bank,int pin_num,int enable)300836c6892SJianqun Xu static int rk3568_set_schmitt(struct rockchip_pin_bank *bank,
301836c6892SJianqun Xu 			      int pin_num, int enable)
302836c6892SJianqun Xu {
303836c6892SJianqun Xu 	struct regmap *regmap;
304836c6892SJianqun Xu 	int reg;
30582c37e39SSteven Liu 	u32 data, rmask;
306836c6892SJianqun Xu 	u8 bit;
307836c6892SJianqun Xu 
308836c6892SJianqun Xu 	rk3568_calc_schmitt_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
309836c6892SJianqun Xu 
310836c6892SJianqun Xu 	/* enable the write to the equivalent lower bits */
311836c6892SJianqun Xu 	data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16);
31282c37e39SSteven Liu 	rmask = data | (data >> 16);
31382c37e39SSteven Liu 	data |= ((enable ? 0x2 : 0x1) << bit);
314836c6892SJianqun Xu 
31582c37e39SSteven Liu 	return regmap_update_bits(regmap, reg, rmask, data);
316836c6892SJianqun Xu }
3173f4af211SJianqun Xu static struct rockchip_pin_bank rk3568_pin_banks[] = {
3183f4af211SJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
3193f4af211SJianqun Xu 			     IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
3203f4af211SJianqun Xu 			     IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
3213f4af211SJianqun Xu 			     IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT),
3223f4af211SJianqun Xu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
3233f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3243f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3253f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT),
3263f4af211SJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
3273f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3283f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3293f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT),
3303f4af211SJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
3313f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3323f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3333f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT),
3343f4af211SJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
3353f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3363f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT,
3373f4af211SJianqun Xu 			     IOMUX_WIDTH_4BIT),
3383f4af211SJianqun Xu };
3393f4af211SJianqun Xu 
3403f4af211SJianqun Xu static const struct rockchip_pin_ctrl rk3568_pin_ctrl = {
3413f4af211SJianqun Xu 	.pin_banks		= rk3568_pin_banks,
3423f4af211SJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk3568_pin_banks),
3433f4af211SJianqun Xu 	.nr_pins		= 160,
3443f4af211SJianqun Xu 	.grf_mux_offset		= 0x0,
3453f4af211SJianqun Xu 	.pmu_mux_offset		= 0x0,
3463f4af211SJianqun Xu 	.iomux_routes		= rk3568_mux_route_data,
3473f4af211SJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk3568_mux_route_data),
3483f4af211SJianqun Xu 	.set_mux		= rk3568_set_mux,
3493f4af211SJianqun Xu 	.set_pull		= rk3568_set_pull,
3503f4af211SJianqun Xu 	.set_drive		= rk3568_set_drive,
351836c6892SJianqun Xu 	.set_schmitt		= rk3568_set_schmitt,
3523f4af211SJianqun Xu };
3533f4af211SJianqun Xu 
3543f4af211SJianqun Xu static const struct udevice_id rk3568_pinctrl_ids[] = {
3553f4af211SJianqun Xu 	{
3563f4af211SJianqun Xu 		.compatible = "rockchip,rk3568-pinctrl",
3573f4af211SJianqun Xu 		.data = (ulong)&rk3568_pin_ctrl
3583f4af211SJianqun Xu 	},
3593f4af211SJianqun Xu 	{ }
3603f4af211SJianqun Xu };
3613f4af211SJianqun Xu 
3623f4af211SJianqun Xu U_BOOT_DRIVER(pinctrl_rk3568) = {
3633f4af211SJianqun Xu 	.name		= "rockchip_rk3568_pinctrl",
3643f4af211SJianqun Xu 	.id		= UCLASS_PINCTRL,
3653f4af211SJianqun Xu 	.of_match	= rk3568_pinctrl_ids,
3663f4af211SJianqun Xu 	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
3673f4af211SJianqun Xu 	.ops		= &rockchip_pinctrl_ops,
3683f4af211SJianqun Xu #if !CONFIG_IS_ENABLED(OF_PLATDATA)
3693f4af211SJianqun Xu 	.bind		= dm_scan_fdt_dev,
3703f4af211SJianqun Xu #endif
3713f4af211SJianqun Xu 	.probe		= rockchip_pinctrl_probe,
3723f4af211SJianqun Xu };
373