xref: /linux/drivers/reset/reset-sky1.c (revision 31b43c079f9aa55754c20404a42bca9a49e01f60)
1*7cd3ca90SGary Yang // SPDX-License-Identifier: GPL-2.0-only
2*7cd3ca90SGary Yang /*
3*7cd3ca90SGary Yang  *
4*7cd3ca90SGary Yang  * CIX System Reset Controller (SRC) driver
5*7cd3ca90SGary Yang  *
6*7cd3ca90SGary Yang  * Author: Jerry Zhu <jerry.zhu@cixtech.com>
7*7cd3ca90SGary Yang  */
8*7cd3ca90SGary Yang 
9*7cd3ca90SGary Yang #include <linux/delay.h>
10*7cd3ca90SGary Yang #include <linux/mfd/syscon.h>
11*7cd3ca90SGary Yang #include <linux/module.h>
12*7cd3ca90SGary Yang #include <linux/of.h>
13*7cd3ca90SGary Yang #include <linux/platform_device.h>
14*7cd3ca90SGary Yang #include <linux/regmap.h>
15*7cd3ca90SGary Yang #include <linux/reset-controller.h>
16*7cd3ca90SGary Yang 
17*7cd3ca90SGary Yang #include <dt-bindings/reset/cix,sky1-system-control.h>
18*7cd3ca90SGary Yang #include <dt-bindings/reset/cix,sky1-s5-system-control.h>
19*7cd3ca90SGary Yang 
20*7cd3ca90SGary Yang #define SKY1_RESET_SLEEP_MIN_US		50
21*7cd3ca90SGary Yang #define SKY1_RESET_SLEEP_MAX_US		100
22*7cd3ca90SGary Yang 
23*7cd3ca90SGary Yang struct sky1_src_signal {
24*7cd3ca90SGary Yang 	unsigned int offset;
25*7cd3ca90SGary Yang 	unsigned int bit;
26*7cd3ca90SGary Yang };
27*7cd3ca90SGary Yang 
28*7cd3ca90SGary Yang struct sky1_src_variant {
29*7cd3ca90SGary Yang 	const struct sky1_src_signal *signals;
30*7cd3ca90SGary Yang 	unsigned int signals_num;
31*7cd3ca90SGary Yang };
32*7cd3ca90SGary Yang 
33*7cd3ca90SGary Yang struct sky1_src {
34*7cd3ca90SGary Yang 	struct reset_controller_dev rcdev;
35*7cd3ca90SGary Yang 	const struct sky1_src_signal *signals;
36*7cd3ca90SGary Yang 	struct regmap *regmap;
37*7cd3ca90SGary Yang };
38*7cd3ca90SGary Yang 
39*7cd3ca90SGary Yang enum {
40*7cd3ca90SGary Yang 	CSU_PM_RESET				= 0x304,
41*7cd3ca90SGary Yang 	SENSORFUSION_RESET			= 0x308,
42*7cd3ca90SGary Yang 	SENSORFUSION_NOC_RESET			= 0x30c,
43*7cd3ca90SGary Yang 	RESET_GROUP0_S0_DOMAIN_0		= 0x400,
44*7cd3ca90SGary Yang 	RESET_GROUP0_S0_DOMAIN_1		= 0x404,
45*7cd3ca90SGary Yang 	RESET_GROUP1_USB_PHYS			= 0x408,
46*7cd3ca90SGary Yang 	RESET_GROUP1_USB_CONTROLLERS		= 0x40c,
47*7cd3ca90SGary Yang 	RESET_GROUP0_RCSU			= 0x800,
48*7cd3ca90SGary Yang 	RESET_GROUP1_RCSU			= 0x804,
49*7cd3ca90SGary Yang };
50*7cd3ca90SGary Yang 
51*7cd3ca90SGary Yang static const struct sky1_src_signal sky1_src_signals[] = {
52*7cd3ca90SGary Yang 	/* reset group1 for s0 domain modules */
53*7cd3ca90SGary Yang 	[SKY1_CSU_PM_RESET_N]		= { CSU_PM_RESET, BIT(0) },
54*7cd3ca90SGary Yang 	[SKY1_SENSORFUSION_RESET_N]	= { SENSORFUSION_RESET, BIT(0) },
55*7cd3ca90SGary Yang 	[SKY1_SENSORFUSION_NOC_RESET_N]	= { SENSORFUSION_NOC_RESET, BIT(0) },
56*7cd3ca90SGary Yang 	[SKY1_DDRC_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(0) },
57*7cd3ca90SGary Yang 	[SKY1_GIC_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(1) },
58*7cd3ca90SGary Yang 	[SKY1_CI700_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(2) },
59*7cd3ca90SGary Yang 	[SKY1_SYS_NI700_RESET_N]	= { RESET_GROUP0_S0_DOMAIN_0, BIT(3) },
60*7cd3ca90SGary Yang 	[SKY1_MM_NI700_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(4) },
61*7cd3ca90SGary Yang 	[SKY1_PCIE_NI700_RESET_N]	= { RESET_GROUP0_S0_DOMAIN_0, BIT(5) },
62*7cd3ca90SGary Yang 	[SKY1_GPU_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(6) },
63*7cd3ca90SGary Yang 	[SKY1_NPUTOP_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(7) },
64*7cd3ca90SGary Yang 	[SKY1_NPUCORE0_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(8) },
65*7cd3ca90SGary Yang 	[SKY1_NPUCORE1_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(9) },
66*7cd3ca90SGary Yang 	[SKY1_NPUCORE2_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(10) },
67*7cd3ca90SGary Yang 	[SKY1_VPU_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(11) },
68*7cd3ca90SGary Yang 	[SKY1_ISP_SRESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(12) },
69*7cd3ca90SGary Yang 	[SKY1_ISP_ARESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(13) },
70*7cd3ca90SGary Yang 	[SKY1_ISP_HRESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(14) },
71*7cd3ca90SGary Yang 	[SKY1_ISP_GDCRESET_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(15) },
72*7cd3ca90SGary Yang 	[SKY1_DPU_RESET0_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(16) },
73*7cd3ca90SGary Yang 	[SKY1_DPU_RESET1_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(17) },
74*7cd3ca90SGary Yang 	[SKY1_DPU_RESET2_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(18) },
75*7cd3ca90SGary Yang 	[SKY1_DPU_RESET3_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(19) },
76*7cd3ca90SGary Yang 	[SKY1_DPU_RESET4_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(20) },
77*7cd3ca90SGary Yang 	[SKY1_DP_RESET0_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(21) },
78*7cd3ca90SGary Yang 	[SKY1_DP_RESET1_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(22) },
79*7cd3ca90SGary Yang 	[SKY1_DP_RESET2_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(23) },
80*7cd3ca90SGary Yang 	[SKY1_DP_RESET3_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(24) },
81*7cd3ca90SGary Yang 	[SKY1_DP_RESET4_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(25) },
82*7cd3ca90SGary Yang 	[SKY1_DP_PHY_RST_N]		= { RESET_GROUP0_S0_DOMAIN_0, BIT(26) },
83*7cd3ca90SGary Yang 
84*7cd3ca90SGary Yang 	/* reset group1 for s0 domain modules */
85*7cd3ca90SGary Yang 	[SKY1_AUDIO_HIFI5_RESET_N]	= { RESET_GROUP0_S0_DOMAIN_1, BIT(0) },
86*7cd3ca90SGary Yang 	[SKY1_AUDIO_HIFI5_NOC_RESET_N]	= { RESET_GROUP0_S0_DOMAIN_1, BIT(1) },
87*7cd3ca90SGary Yang 	[SKY1_CSIDPHY_PRST0_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(2) },
88*7cd3ca90SGary Yang 	[SKY1_CSIDPHY_CMNRST0_N]	= { RESET_GROUP0_S0_DOMAIN_1, BIT(3) },
89*7cd3ca90SGary Yang 	[SKY1_CSI0_RST_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(4) },
90*7cd3ca90SGary Yang 	[SKY1_CSIDPHY_PRST1_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(5) },
91*7cd3ca90SGary Yang 	[SKY1_CSIDPHY_CMNRST1_N]	= { RESET_GROUP0_S0_DOMAIN_1, BIT(6) },
92*7cd3ca90SGary Yang 	[SKY1_CSI1_RST_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(7) },
93*7cd3ca90SGary Yang 	[SKY1_CSI2_RST_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(8) },
94*7cd3ca90SGary Yang 	[SKY1_CSI3_RST_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(9) },
95*7cd3ca90SGary Yang 	[SKY1_CSIBRDGE0_RST_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(10) },
96*7cd3ca90SGary Yang 	[SKY1_CSIBRDGE1_RST_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(11) },
97*7cd3ca90SGary Yang 	[SKY1_CSIBRDGE2_RST_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(12) },
98*7cd3ca90SGary Yang 	[SKY1_CSIBRDGE3_RST_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(13) },
99*7cd3ca90SGary Yang 	[SKY1_GMAC0_RST_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(14) },
100*7cd3ca90SGary Yang 	[SKY1_GMAC1_RST_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(15) },
101*7cd3ca90SGary Yang 	[SKY1_PCIE0_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(16) },
102*7cd3ca90SGary Yang 	[SKY1_PCIE1_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(17) },
103*7cd3ca90SGary Yang 	[SKY1_PCIE2_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(18) },
104*7cd3ca90SGary Yang 	[SKY1_PCIE3_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(19) },
105*7cd3ca90SGary Yang 	[SKY1_PCIE4_RESET_N]		= { RESET_GROUP0_S0_DOMAIN_1, BIT(20) },
106*7cd3ca90SGary Yang 
107*7cd3ca90SGary Yang 	/* reset group1 for usb phys */
108*7cd3ca90SGary Yang 	[SKY1_USB_DP_PHY0_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(0) },
109*7cd3ca90SGary Yang 	[SKY1_USB_DP_PHY1_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(1) },
110*7cd3ca90SGary Yang 	[SKY1_USB_DP_PHY2_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(2) },
111*7cd3ca90SGary Yang 	[SKY1_USB_DP_PHY3_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(3) },
112*7cd3ca90SGary Yang 	[SKY1_USB_DP_PHY0_RST_N]		= { RESET_GROUP1_USB_PHYS, BIT(4) },
113*7cd3ca90SGary Yang 	[SKY1_USB_DP_PHY1_RST_N]		= { RESET_GROUP1_USB_PHYS, BIT(5) },
114*7cd3ca90SGary Yang 	[SKY1_USB_DP_PHY2_RST_N]		= { RESET_GROUP1_USB_PHYS, BIT(6) },
115*7cd3ca90SGary Yang 	[SKY1_USB_DP_PHY3_RST_N]		= { RESET_GROUP1_USB_PHYS, BIT(7) },
116*7cd3ca90SGary Yang 	[SKY1_USBPHY_SS_PST_N]			= { RESET_GROUP1_USB_PHYS, BIT(8) },
117*7cd3ca90SGary Yang 	[SKY1_USBPHY_SS_RST_N]			= { RESET_GROUP1_USB_PHYS, BIT(9) },
118*7cd3ca90SGary Yang 	[SKY1_USBPHY_HS0_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(10) },
119*7cd3ca90SGary Yang 	[SKY1_USBPHY_HS1_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(11) },
120*7cd3ca90SGary Yang 	[SKY1_USBPHY_HS2_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(12) },
121*7cd3ca90SGary Yang 	[SKY1_USBPHY_HS3_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(13) },
122*7cd3ca90SGary Yang 	[SKY1_USBPHY_HS4_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(14) },
123*7cd3ca90SGary Yang 	[SKY1_USBPHY_HS5_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(15) },
124*7cd3ca90SGary Yang 	[SKY1_USBPHY_HS6_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(16) },
125*7cd3ca90SGary Yang 	[SKY1_USBPHY_HS7_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(17) },
126*7cd3ca90SGary Yang 	[SKY1_USBPHY_HS8_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(18) },
127*7cd3ca90SGary Yang 	[SKY1_USBPHY_HS9_PRST_N]		= { RESET_GROUP1_USB_PHYS, BIT(19) },
128*7cd3ca90SGary Yang 
129*7cd3ca90SGary Yang 	/* reset group1 for usb controllers */
130*7cd3ca90SGary Yang 	[SKY1_USBC_SS0_PRST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(0) },
131*7cd3ca90SGary Yang 	[SKY1_USBC_SS1_PRST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(1) },
132*7cd3ca90SGary Yang 	[SKY1_USBC_SS2_PRST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(2) },
133*7cd3ca90SGary Yang 	[SKY1_USBC_SS3_PRST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(3) },
134*7cd3ca90SGary Yang 	[SKY1_USBC_SS4_PRST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(4) },
135*7cd3ca90SGary Yang 	[SKY1_USBC_SS5_PRST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(5) },
136*7cd3ca90SGary Yang 	[SKY1_USBC_SS0_RST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(6) },
137*7cd3ca90SGary Yang 	[SKY1_USBC_SS1_RST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(7) },
138*7cd3ca90SGary Yang 	[SKY1_USBC_SS2_RST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(8) },
139*7cd3ca90SGary Yang 	[SKY1_USBC_SS3_RST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(9) },
140*7cd3ca90SGary Yang 	[SKY1_USBC_SS4_RST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(10) },
141*7cd3ca90SGary Yang 	[SKY1_USBC_SS5_RST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(11) },
142*7cd3ca90SGary Yang 	[SKY1_USBC_HS0_PRST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(12) },
143*7cd3ca90SGary Yang 	[SKY1_USBC_HS1_PRST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(13) },
144*7cd3ca90SGary Yang 	[SKY1_USBC_HS2_PRST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(14) },
145*7cd3ca90SGary Yang 	[SKY1_USBC_HS3_PRST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(15) },
146*7cd3ca90SGary Yang 	[SKY1_USBC_HS0_RST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(16) },
147*7cd3ca90SGary Yang 	[SKY1_USBC_HS1_RST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(17) },
148*7cd3ca90SGary Yang 	[SKY1_USBC_HS2_RST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(18) },
149*7cd3ca90SGary Yang 	[SKY1_USBC_HS3_RST_N]		= { RESET_GROUP1_USB_CONTROLLERS, BIT(19) },
150*7cd3ca90SGary Yang 
151*7cd3ca90SGary Yang 	/* reset group0 for rcsu */
152*7cd3ca90SGary Yang 	[SKY1_AUDIO_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(0) },
153*7cd3ca90SGary Yang 	[SKY1_CI700_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(1) },
154*7cd3ca90SGary Yang 	[SKY1_CSI_RCSU0_RESET_N]		= { RESET_GROUP0_RCSU, BIT(2) },
155*7cd3ca90SGary Yang 	[SKY1_CSI_RCSU1_RESET_N]		= { RESET_GROUP0_RCSU, BIT(3) },
156*7cd3ca90SGary Yang 	[SKY1_CSU_PM_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(4) },
157*7cd3ca90SGary Yang 	[SKY1_DDR_BROADCAST_RCSU_RESET_N]	= { RESET_GROUP0_RCSU, BIT(5) },
158*7cd3ca90SGary Yang 	[SKY1_DDR_CTRL_RCSU_0_RESET_N]		= { RESET_GROUP0_RCSU, BIT(6) },
159*7cd3ca90SGary Yang 	[SKY1_DDR_CTRL_RCSU_1_RESET_N]		= { RESET_GROUP0_RCSU, BIT(7) },
160*7cd3ca90SGary Yang 	[SKY1_DDR_CTRL_RCSU_2_RESET_N]		= { RESET_GROUP0_RCSU, BIT(8) },
161*7cd3ca90SGary Yang 	[SKY1_DDR_CTRL_RCSU_3_RESET_N]		= { RESET_GROUP0_RCSU, BIT(9) },
162*7cd3ca90SGary Yang 	[SKY1_DDR_TZC400_RCSU_0_RESET_N]	= { RESET_GROUP0_RCSU, BIT(10) },
163*7cd3ca90SGary Yang 	[SKY1_DDR_TZC400_RCSU_1_RESET_N]	= { RESET_GROUP0_RCSU, BIT(11) },
164*7cd3ca90SGary Yang 	[SKY1_DDR_TZC400_RCSU_2_RESET_N]	= { RESET_GROUP0_RCSU, BIT(12) },
165*7cd3ca90SGary Yang 	[SKY1_DDR_TZC400_RCSU_3_RESET_N]	= { RESET_GROUP0_RCSU, BIT(13) },
166*7cd3ca90SGary Yang 	[SKY1_DP0_RCSU_RESET_N]			= { RESET_GROUP0_RCSU, BIT(14) },
167*7cd3ca90SGary Yang 	[SKY1_DP1_RCSU_RESET_N]			= { RESET_GROUP0_RCSU, BIT(15) },
168*7cd3ca90SGary Yang 	[SKY1_DP2_RCSU_RESET_N]			= { RESET_GROUP0_RCSU, BIT(16) },
169*7cd3ca90SGary Yang 	[SKY1_DP3_RCSU_RESET_N]			= { RESET_GROUP0_RCSU, BIT(17) },
170*7cd3ca90SGary Yang 	[SKY1_DP4_RCSU_RESET_N]			= { RESET_GROUP0_RCSU, BIT(18) },
171*7cd3ca90SGary Yang 	[SKY1_DPU0_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(19) },
172*7cd3ca90SGary Yang 	[SKY1_DPU1_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(20) },
173*7cd3ca90SGary Yang 	[SKY1_DPU2_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(21) },
174*7cd3ca90SGary Yang 	[SKY1_DPU3_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(22) },
175*7cd3ca90SGary Yang 	[SKY1_DPU4_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(23) },
176*7cd3ca90SGary Yang 	[SKY1_DSU_RCSU_RESET_N]			= { RESET_GROUP0_RCSU, BIT(24) },
177*7cd3ca90SGary Yang 	[SKY1_FCH_RCSU_RESET_N]			= { RESET_GROUP0_RCSU, BIT(25) },
178*7cd3ca90SGary Yang 	[SKY1_GICD_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(26) },
179*7cd3ca90SGary Yang 	[SKY1_GMAC_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(27) },
180*7cd3ca90SGary Yang 	[SKY1_GPU_RCSU_RESET_N]			= { RESET_GROUP0_RCSU, BIT(28) },
181*7cd3ca90SGary Yang 	[SKY1_ISP_RCSU0_RESET_N]		= { RESET_GROUP0_RCSU, BIT(29) },
182*7cd3ca90SGary Yang 	[SKY1_ISP_RCSU1_RESET_N]		= { RESET_GROUP0_RCSU, BIT(30) },
183*7cd3ca90SGary Yang 	[SKY1_NI700_MMHUB_RCSU_RESET_N]		= { RESET_GROUP0_RCSU, BIT(31) },
184*7cd3ca90SGary Yang 
185*7cd3ca90SGary Yang 	/* reset group1 for rcsu */
186*7cd3ca90SGary Yang 	[SKY1_NPU_RCSU_RESET_N]			= { RESET_GROUP1_RCSU, BIT(0) },
187*7cd3ca90SGary Yang 	[SKY1_NI700_PCIE_RCSU_RESET_N]		= { RESET_GROUP1_RCSU, BIT(1) },
188*7cd3ca90SGary Yang 	[SKY1_PCIE_X421_RCSU_RESET_N]		= { RESET_GROUP1_RCSU, BIT(2) },
189*7cd3ca90SGary Yang 	[SKY1_PCIE_X8_RCSU_RESET_N]		= { RESET_GROUP1_RCSU, BIT(3) },
190*7cd3ca90SGary Yang 	[SKY1_SF_RCSU_RESET_N]			= { RESET_GROUP1_RCSU, BIT(4) },
191*7cd3ca90SGary Yang 	[SKY1_RCSU_SMMU_MMHUB_RESET_N]		= { RESET_GROUP1_RCSU, BIT(5) },
192*7cd3ca90SGary Yang 	[SKY1_RCSU_SMMU_PCIEHUB_RESET_N]	= { RESET_GROUP1_RCSU, BIT(6) },
193*7cd3ca90SGary Yang 	[SKY1_RCSU_SYSHUB_RESET_N]		= { RESET_GROUP1_RCSU, BIT(7) },
194*7cd3ca90SGary Yang 	[SKY1_NI700_SMN_RCSU_RESET_N]		= { RESET_GROUP1_RCSU, BIT(8) },
195*7cd3ca90SGary Yang 	[SKY1_NI700_SYSHUB_RCSU_RESET_N]	= { RESET_GROUP1_RCSU, BIT(9) },
196*7cd3ca90SGary Yang 	[SKY1_RCSU_USB2_HOST0_RESET_N]		= { RESET_GROUP1_RCSU, BIT(10) },
197*7cd3ca90SGary Yang 	[SKY1_RCSU_USB2_HOST1_RESET_N]		= { RESET_GROUP1_RCSU, BIT(11) },
198*7cd3ca90SGary Yang 	[SKY1_RCSU_USB2_HOST2_RESET_N]		= { RESET_GROUP1_RCSU, BIT(12) },
199*7cd3ca90SGary Yang 	[SKY1_RCSU_USB2_HOST3_RESET_N]		= { RESET_GROUP1_RCSU, BIT(13) },
200*7cd3ca90SGary Yang 	[SKY1_RCSU_USB3_TYPEA_DRD_RESET_N]	= { RESET_GROUP1_RCSU, BIT(14) },
201*7cd3ca90SGary Yang 	[SKY1_RCSU_USB3_TYPEC_DRD_RESET_N]	= { RESET_GROUP1_RCSU, BIT(15) },
202*7cd3ca90SGary Yang 	[SKY1_RCSU_USB3_TYPEC_HOST0_RESET_N]	= { RESET_GROUP1_RCSU, BIT(16) },
203*7cd3ca90SGary Yang 	[SKY1_RCSU_USB3_TYPEC_HOST1_RESET_N]	= { RESET_GROUP1_RCSU, BIT(17) },
204*7cd3ca90SGary Yang 	[SKY1_RCSU_USB3_TYPEC_HOST2_RESET_N]	= { RESET_GROUP1_RCSU, BIT(18) },
205*7cd3ca90SGary Yang 	[SKY1_VPU_RCSU_RESET_N]			= { RESET_GROUP1_RCSU, BIT(19) },
206*7cd3ca90SGary Yang };
207*7cd3ca90SGary Yang 
208*7cd3ca90SGary Yang static const struct sky1_src_variant variant_sky1 = {
209*7cd3ca90SGary Yang 	.signals = sky1_src_signals,
210*7cd3ca90SGary Yang 	.signals_num = ARRAY_SIZE(sky1_src_signals),
211*7cd3ca90SGary Yang };
212*7cd3ca90SGary Yang 
213*7cd3ca90SGary Yang enum {
214*7cd3ca90SGary Yang 	FCH_SW_RST_FUNC			= 0x8,
215*7cd3ca90SGary Yang 	FCH_SW_RST_BUS			= 0xc,
216*7cd3ca90SGary Yang 	FCH_SW_XSPI			= 0x10,
217*7cd3ca90SGary Yang };
218*7cd3ca90SGary Yang 
219*7cd3ca90SGary Yang static const struct sky1_src_signal sky1_src_fch_signals[] = {
220*7cd3ca90SGary Yang 	/* resets for fch_sw_rst_func */
221*7cd3ca90SGary Yang 	[SW_I3C0_RST_FUNC_G_N]	= { FCH_SW_RST_FUNC, BIT(0) },
222*7cd3ca90SGary Yang 	[SW_I3C0_RST_FUNC_I_N]	= { FCH_SW_RST_FUNC, BIT(1) },
223*7cd3ca90SGary Yang 	[SW_I3C1_RST_FUNC_G_N]	= { FCH_SW_RST_FUNC, BIT(2) },
224*7cd3ca90SGary Yang 	[SW_I3C1_RST_FUNC_I_N]	= { FCH_SW_RST_FUNC, BIT(3) },
225*7cd3ca90SGary Yang 	[SW_UART0_RST_FUNC_N]	= { FCH_SW_RST_FUNC, BIT(4) },
226*7cd3ca90SGary Yang 	[SW_UART1_RST_FUNC_N]	= { FCH_SW_RST_FUNC, BIT(5) },
227*7cd3ca90SGary Yang 	[SW_UART2_RST_FUNC_N]	= { FCH_SW_RST_FUNC, BIT(6) },
228*7cd3ca90SGary Yang 	[SW_UART3_RST_FUNC_N]	= { FCH_SW_RST_FUNC, BIT(7) },
229*7cd3ca90SGary Yang 	[SW_TIMER_RST_FUNC_N]	= { FCH_SW_RST_FUNC, BIT(20) },
230*7cd3ca90SGary Yang 
231*7cd3ca90SGary Yang 	/* resets for fch_sw_rst_bus */
232*7cd3ca90SGary Yang 	[SW_I3C0_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(0) },
233*7cd3ca90SGary Yang 	[SW_I3C1_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(1) },
234*7cd3ca90SGary Yang 	[SW_DMA_RST_AXI_N]	= { FCH_SW_RST_BUS, BIT(2) },
235*7cd3ca90SGary Yang 	[SW_UART0_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(4) },
236*7cd3ca90SGary Yang 	[SW_UART1_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(5) },
237*7cd3ca90SGary Yang 	[SW_UART2_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(6) },
238*7cd3ca90SGary Yang 	[SW_UART3_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(7) },
239*7cd3ca90SGary Yang 	[SW_SPI0_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(8) },
240*7cd3ca90SGary Yang 	[SW_SPI1_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(9) },
241*7cd3ca90SGary Yang 	[SW_I2C0_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(12) },
242*7cd3ca90SGary Yang 	[SW_I2C1_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(13) },
243*7cd3ca90SGary Yang 	[SW_I2C2_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(14) },
244*7cd3ca90SGary Yang 	[SW_I2C3_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(15) },
245*7cd3ca90SGary Yang 	[SW_I2C4_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(16) },
246*7cd3ca90SGary Yang 	[SW_I2C5_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(17) },
247*7cd3ca90SGary Yang 	[SW_I2C6_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(18) },
248*7cd3ca90SGary Yang 	[SW_I2C7_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(19) },
249*7cd3ca90SGary Yang 	[SW_GPIO_RST_APB_N]	= { FCH_SW_RST_BUS, BIT(21) },
250*7cd3ca90SGary Yang 
251*7cd3ca90SGary Yang 	/* resets for fch_sw_xspi */
252*7cd3ca90SGary Yang 	[SW_XSPI_REG_RST_N]	= { FCH_SW_XSPI, BIT(0) },
253*7cd3ca90SGary Yang 	[SW_XSPI_SYS_RST_N]	= { FCH_SW_XSPI, BIT(1) },
254*7cd3ca90SGary Yang };
255*7cd3ca90SGary Yang 
256*7cd3ca90SGary Yang static const struct sky1_src_variant variant_sky1_fch = {
257*7cd3ca90SGary Yang 	.signals = sky1_src_fch_signals,
258*7cd3ca90SGary Yang 	.signals_num = ARRAY_SIZE(sky1_src_fch_signals),
259*7cd3ca90SGary Yang };
260*7cd3ca90SGary Yang 
261*7cd3ca90SGary Yang static struct sky1_src *to_sky1_src(struct reset_controller_dev *rcdev)
262*7cd3ca90SGary Yang {
263*7cd3ca90SGary Yang 	return container_of(rcdev, struct sky1_src, rcdev);
264*7cd3ca90SGary Yang }
265*7cd3ca90SGary Yang 
266*7cd3ca90SGary Yang static int sky1_reset_set(struct reset_controller_dev *rcdev,
267*7cd3ca90SGary Yang 			  unsigned long id, bool assert)
268*7cd3ca90SGary Yang {
269*7cd3ca90SGary Yang 	struct sky1_src *sky1src = to_sky1_src(rcdev);
270*7cd3ca90SGary Yang 	const struct sky1_src_signal *signal = &sky1src->signals[id];
271*7cd3ca90SGary Yang 	unsigned int value = assert ? 0 : signal->bit;
272*7cd3ca90SGary Yang 
273*7cd3ca90SGary Yang 	return regmap_update_bits(sky1src->regmap,
274*7cd3ca90SGary Yang 				  signal->offset, signal->bit, value);
275*7cd3ca90SGary Yang }
276*7cd3ca90SGary Yang 
277*7cd3ca90SGary Yang static int sky1_reset_assert(struct reset_controller_dev *rcdev,
278*7cd3ca90SGary Yang 			     unsigned long id)
279*7cd3ca90SGary Yang {
280*7cd3ca90SGary Yang 	sky1_reset_set(rcdev, id, true);
281*7cd3ca90SGary Yang 	usleep_range(SKY1_RESET_SLEEP_MIN_US,
282*7cd3ca90SGary Yang 		     SKY1_RESET_SLEEP_MAX_US);
283*7cd3ca90SGary Yang 	return 0;
284*7cd3ca90SGary Yang }
285*7cd3ca90SGary Yang 
286*7cd3ca90SGary Yang static int sky1_reset_deassert(struct reset_controller_dev *rcdev,
287*7cd3ca90SGary Yang 			       unsigned long id)
288*7cd3ca90SGary Yang {
289*7cd3ca90SGary Yang 	sky1_reset_set(rcdev, id, false);
290*7cd3ca90SGary Yang 	usleep_range(SKY1_RESET_SLEEP_MIN_US,
291*7cd3ca90SGary Yang 		     SKY1_RESET_SLEEP_MAX_US);
292*7cd3ca90SGary Yang 	return 0;
293*7cd3ca90SGary Yang }
294*7cd3ca90SGary Yang 
295*7cd3ca90SGary Yang static int sky1_reset(struct reset_controller_dev *rcdev,
296*7cd3ca90SGary Yang 		      unsigned long id)
297*7cd3ca90SGary Yang {
298*7cd3ca90SGary Yang 	sky1_reset_assert(rcdev, id);
299*7cd3ca90SGary Yang 	sky1_reset_deassert(rcdev, id);
300*7cd3ca90SGary Yang 	return 0;
301*7cd3ca90SGary Yang }
302*7cd3ca90SGary Yang 
303*7cd3ca90SGary Yang static int sky1_reset_status(struct reset_controller_dev *rcdev,
304*7cd3ca90SGary Yang 			     unsigned long id)
305*7cd3ca90SGary Yang {
306*7cd3ca90SGary Yang 	unsigned int value = 0;
307*7cd3ca90SGary Yang 	struct sky1_src *sky1src = to_sky1_src(rcdev);
308*7cd3ca90SGary Yang 	const struct sky1_src_signal *signal = &sky1src->signals[id];
309*7cd3ca90SGary Yang 
310*7cd3ca90SGary Yang 	regmap_read(sky1src->regmap, signal->offset, &value);
311*7cd3ca90SGary Yang 	return !(value & signal->bit);
312*7cd3ca90SGary Yang }
313*7cd3ca90SGary Yang 
314*7cd3ca90SGary Yang static const struct reset_control_ops sky1_src_ops = {
315*7cd3ca90SGary Yang 	.reset    = sky1_reset,
316*7cd3ca90SGary Yang 	.assert   = sky1_reset_assert,
317*7cd3ca90SGary Yang 	.deassert = sky1_reset_deassert,
318*7cd3ca90SGary Yang 	.status   = sky1_reset_status
319*7cd3ca90SGary Yang };
320*7cd3ca90SGary Yang 
321*7cd3ca90SGary Yang static int sky1_reset_probe(struct platform_device *pdev)
322*7cd3ca90SGary Yang {
323*7cd3ca90SGary Yang 	struct sky1_src *sky1src;
324*7cd3ca90SGary Yang 	struct device *dev = &pdev->dev;
325*7cd3ca90SGary Yang 	const struct sky1_src_variant *variant;
326*7cd3ca90SGary Yang 
327*7cd3ca90SGary Yang 	sky1src = devm_kzalloc(dev, sizeof(*sky1src), GFP_KERNEL);
328*7cd3ca90SGary Yang 	if (!sky1src)
329*7cd3ca90SGary Yang 		return -ENOMEM;
330*7cd3ca90SGary Yang 
331*7cd3ca90SGary Yang 	variant = of_device_get_match_data(dev);
332*7cd3ca90SGary Yang 
333*7cd3ca90SGary Yang 	sky1src->regmap = device_node_to_regmap(dev->of_node);
334*7cd3ca90SGary Yang 	if (IS_ERR(sky1src->regmap)) {
335*7cd3ca90SGary Yang 		return dev_err_probe(dev, PTR_ERR(sky1src->regmap),
336*7cd3ca90SGary Yang 				     "Unable to get sky1-src regmap");
337*7cd3ca90SGary Yang 	}
338*7cd3ca90SGary Yang 
339*7cd3ca90SGary Yang 	sky1src->signals = variant->signals;
340*7cd3ca90SGary Yang 	sky1src->rcdev.owner     = THIS_MODULE;
341*7cd3ca90SGary Yang 	sky1src->rcdev.nr_resets = variant->signals_num;
342*7cd3ca90SGary Yang 	sky1src->rcdev.ops       = &sky1_src_ops;
343*7cd3ca90SGary Yang 	sky1src->rcdev.of_node   = dev->of_node;
344*7cd3ca90SGary Yang 	sky1src->rcdev.dev       = dev;
345*7cd3ca90SGary Yang 
346*7cd3ca90SGary Yang 	return devm_reset_controller_register(dev, &sky1src->rcdev);
347*7cd3ca90SGary Yang }
348*7cd3ca90SGary Yang 
349*7cd3ca90SGary Yang static const struct of_device_id sky1_sysreg_of_match[] = {
350*7cd3ca90SGary Yang 	{ .compatible = "cix,sky1-system-control", .data = &variant_sky1_fch},
351*7cd3ca90SGary Yang 	{ .compatible = "cix,sky1-s5-system-control", .data = &variant_sky1},
352*7cd3ca90SGary Yang 	{},
353*7cd3ca90SGary Yang };
354*7cd3ca90SGary Yang MODULE_DEVICE_TABLE(of, sky1_sysreg_of_match);
355*7cd3ca90SGary Yang 
356*7cd3ca90SGary Yang static struct platform_driver sky1_reset_driver = {
357*7cd3ca90SGary Yang 	.probe	= sky1_reset_probe,
358*7cd3ca90SGary Yang 	.driver = {
359*7cd3ca90SGary Yang 		.name		= "cix,sky1-rst",
360*7cd3ca90SGary Yang 		.of_match_table = sky1_sysreg_of_match,
361*7cd3ca90SGary Yang 	},
362*7cd3ca90SGary Yang };
363*7cd3ca90SGary Yang module_platform_driver(sky1_reset_driver)
364*7cd3ca90SGary Yang 
365*7cd3ca90SGary Yang MODULE_AUTHOR("Jerry Zhu <jerry.zhu@cixtech.com>");
366*7cd3ca90SGary Yang MODULE_DESCRIPTION("Cix Sky1 reset driver");
367*7cd3ca90SGary Yang MODULE_LICENSE("GPL");
368