xref: /openbmc/u-boot/arch/arm/mach-socfpga/freeze_controller.c (revision 05a217212b41c6342fc1c6be0fe49ce28c9afe40)
1*05a21721SMasahiro Yamada /*
2*05a21721SMasahiro Yamada  *  Copyright (C) 2013 Altera Corporation <www.altera.com>
3*05a21721SMasahiro Yamada  *
4*05a21721SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
5*05a21721SMasahiro Yamada  */
6*05a21721SMasahiro Yamada 
7*05a21721SMasahiro Yamada 
8*05a21721SMasahiro Yamada #include <common.h>
9*05a21721SMasahiro Yamada #include <asm/io.h>
10*05a21721SMasahiro Yamada #include <asm/arch/freeze_controller.h>
11*05a21721SMasahiro Yamada #include <asm/arch/timer.h>
12*05a21721SMasahiro Yamada #include <asm/errno.h>
13*05a21721SMasahiro Yamada 
14*05a21721SMasahiro Yamada DECLARE_GLOBAL_DATA_PTR;
15*05a21721SMasahiro Yamada 
16*05a21721SMasahiro Yamada static const struct socfpga_freeze_controller *freeze_controller_base =
17*05a21721SMasahiro Yamada 		(void *)(SOCFPGA_SYSMGR_ADDRESS + SYSMGR_FRZCTRL_ADDRESS);
18*05a21721SMasahiro Yamada 
19*05a21721SMasahiro Yamada /*
20*05a21721SMasahiro Yamada  * Default state from cold reset is FREEZE_ALL; the global
21*05a21721SMasahiro Yamada  * flag is set to TRUE to indicate the IO banks are frozen
22*05a21721SMasahiro Yamada  */
23*05a21721SMasahiro Yamada static uint32_t frzctrl_channel_freeze[FREEZE_CHANNEL_NUM]
24*05a21721SMasahiro Yamada 	= { FREEZE_CTRL_FROZEN, FREEZE_CTRL_FROZEN,
25*05a21721SMasahiro Yamada 	FREEZE_CTRL_FROZEN, FREEZE_CTRL_FROZEN};
26*05a21721SMasahiro Yamada 
27*05a21721SMasahiro Yamada /* Freeze HPS IOs */
28*05a21721SMasahiro Yamada void sys_mgr_frzctrl_freeze_req(void)
29*05a21721SMasahiro Yamada {
30*05a21721SMasahiro Yamada 	u32 ioctrl_reg_offset;
31*05a21721SMasahiro Yamada 	u32 reg_value;
32*05a21721SMasahiro Yamada 	u32 reg_cfg_mask;
33*05a21721SMasahiro Yamada 	u32 channel_id;
34*05a21721SMasahiro Yamada 
35*05a21721SMasahiro Yamada 	/* select software FSM */
36*05a21721SMasahiro Yamada 	writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW,	&freeze_controller_base->src);
37*05a21721SMasahiro Yamada 
38*05a21721SMasahiro Yamada 	/* Freeze channel 0 to 2 */
39*05a21721SMasahiro Yamada 	for (channel_id = 0; channel_id <= 2; channel_id++) {
40*05a21721SMasahiro Yamada 		ioctrl_reg_offset = (u32)(
41*05a21721SMasahiro Yamada 			&freeze_controller_base->vioctrl + channel_id);
42*05a21721SMasahiro Yamada 
43*05a21721SMasahiro Yamada 		/*
44*05a21721SMasahiro Yamada 		 * Assert active low enrnsl, plniotri
45*05a21721SMasahiro Yamada 		 * and niotri signals
46*05a21721SMasahiro Yamada 		 */
47*05a21721SMasahiro Yamada 		reg_cfg_mask =
48*05a21721SMasahiro Yamada 			SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK
49*05a21721SMasahiro Yamada 			| SYSMGR_FRZCTRL_VIOCTRL_WKPULLUP_MASK
50*05a21721SMasahiro Yamada 			| SYSMGR_FRZCTRL_VIOCTRL_TRISTATE_MASK;
51*05a21721SMasahiro Yamada 		clrbits_le32(ioctrl_reg_offset,	reg_cfg_mask);
52*05a21721SMasahiro Yamada 
53*05a21721SMasahiro Yamada 		/*
54*05a21721SMasahiro Yamada 		 * Note: Delay for 20ns at min
55*05a21721SMasahiro Yamada 		 * Assert active low bhniotri signal and de-assert
56*05a21721SMasahiro Yamada 		 * active high csrdone
57*05a21721SMasahiro Yamada 		 */
58*05a21721SMasahiro Yamada 		reg_cfg_mask
59*05a21721SMasahiro Yamada 			= SYSMGR_FRZCTRL_VIOCTRL_BUSHOLD_MASK
60*05a21721SMasahiro Yamada 			| SYSMGR_FRZCTRL_VIOCTRL_CFG_MASK;
61*05a21721SMasahiro Yamada 		clrbits_le32(ioctrl_reg_offset,	reg_cfg_mask);
62*05a21721SMasahiro Yamada 
63*05a21721SMasahiro Yamada 		/* Set global flag to indicate channel is frozen */
64*05a21721SMasahiro Yamada 		frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_FROZEN;
65*05a21721SMasahiro Yamada 	}
66*05a21721SMasahiro Yamada 
67*05a21721SMasahiro Yamada 	/* Freeze channel 3 */
68*05a21721SMasahiro Yamada 	/*
69*05a21721SMasahiro Yamada 	 * Assert active low enrnsl, plniotri and
70*05a21721SMasahiro Yamada 	 * niotri signals
71*05a21721SMasahiro Yamada 	 */
72*05a21721SMasahiro Yamada 	reg_cfg_mask
73*05a21721SMasahiro Yamada 		= SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK
74*05a21721SMasahiro Yamada 		| SYSMGR_FRZCTRL_HIOCTRL_WKPULLUP_MASK
75*05a21721SMasahiro Yamada 		| SYSMGR_FRZCTRL_HIOCTRL_TRISTATE_MASK;
76*05a21721SMasahiro Yamada 	clrbits_le32(&freeze_controller_base->hioctrl, reg_cfg_mask);
77*05a21721SMasahiro Yamada 
78*05a21721SMasahiro Yamada 	/*
79*05a21721SMasahiro Yamada 	 * assert active low bhniotri & nfrzdrv signals,
80*05a21721SMasahiro Yamada 	 * de-assert active high csrdone and assert
81*05a21721SMasahiro Yamada 	 * active high frzreg and nfrzdrv signals
82*05a21721SMasahiro Yamada 	 */
83*05a21721SMasahiro Yamada 	reg_value = readl(&freeze_controller_base->hioctrl);
84*05a21721SMasahiro Yamada 	reg_cfg_mask
85*05a21721SMasahiro Yamada 		= SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK
86*05a21721SMasahiro Yamada 		| SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK;
87*05a21721SMasahiro Yamada 	reg_value
88*05a21721SMasahiro Yamada 		= (reg_value & ~reg_cfg_mask)
89*05a21721SMasahiro Yamada 		| SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK
90*05a21721SMasahiro Yamada 		| SYSMGR_FRZCTRL_HIOCTRL_OCTRST_MASK;
91*05a21721SMasahiro Yamada 	writel(reg_value, &freeze_controller_base->hioctrl);
92*05a21721SMasahiro Yamada 
93*05a21721SMasahiro Yamada 	/*
94*05a21721SMasahiro Yamada 	 * assert active high reinit signal and de-assert
95*05a21721SMasahiro Yamada 	 * active high pllbiasen signals
96*05a21721SMasahiro Yamada 	 */
97*05a21721SMasahiro Yamada 	reg_value = readl(&freeze_controller_base->hioctrl);
98*05a21721SMasahiro Yamada 	reg_value
99*05a21721SMasahiro Yamada 		= (reg_value &
100*05a21721SMasahiro Yamada 		~SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK)
101*05a21721SMasahiro Yamada 		| SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK;
102*05a21721SMasahiro Yamada 	writel(reg_value, &freeze_controller_base->hioctrl);
103*05a21721SMasahiro Yamada 
104*05a21721SMasahiro Yamada 	/* Set global flag to indicate channel is frozen */
105*05a21721SMasahiro Yamada 	frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_FROZEN;
106*05a21721SMasahiro Yamada }
107*05a21721SMasahiro Yamada 
108*05a21721SMasahiro Yamada /* Unfreeze/Thaw HPS IOs */
109*05a21721SMasahiro Yamada void sys_mgr_frzctrl_thaw_req(void)
110*05a21721SMasahiro Yamada {
111*05a21721SMasahiro Yamada 	u32 ioctrl_reg_offset;
112*05a21721SMasahiro Yamada 	u32 reg_cfg_mask;
113*05a21721SMasahiro Yamada 	u32 reg_value;
114*05a21721SMasahiro Yamada 	u32 channel_id;
115*05a21721SMasahiro Yamada 
116*05a21721SMasahiro Yamada 	/* select software FSM */
117*05a21721SMasahiro Yamada 	writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW,	&freeze_controller_base->src);
118*05a21721SMasahiro Yamada 
119*05a21721SMasahiro Yamada 	/* Thaw channel 0 to 2 */
120*05a21721SMasahiro Yamada 	for (channel_id = 0; channel_id <= 2; channel_id++) {
121*05a21721SMasahiro Yamada 		ioctrl_reg_offset
122*05a21721SMasahiro Yamada 			= (u32)(&freeze_controller_base->vioctrl + channel_id);
123*05a21721SMasahiro Yamada 
124*05a21721SMasahiro Yamada 		/*
125*05a21721SMasahiro Yamada 		 * Assert active low bhniotri signal and
126*05a21721SMasahiro Yamada 		 * de-assert active high csrdone
127*05a21721SMasahiro Yamada 		 */
128*05a21721SMasahiro Yamada 		reg_cfg_mask
129*05a21721SMasahiro Yamada 			= SYSMGR_FRZCTRL_VIOCTRL_BUSHOLD_MASK
130*05a21721SMasahiro Yamada 			| SYSMGR_FRZCTRL_VIOCTRL_CFG_MASK;
131*05a21721SMasahiro Yamada 		setbits_le32(ioctrl_reg_offset,	reg_cfg_mask);
132*05a21721SMasahiro Yamada 
133*05a21721SMasahiro Yamada 		/*
134*05a21721SMasahiro Yamada 		 * Note: Delay for 20ns at min
135*05a21721SMasahiro Yamada 		 * de-assert active low plniotri and niotri signals
136*05a21721SMasahiro Yamada 		 */
137*05a21721SMasahiro Yamada 		reg_cfg_mask
138*05a21721SMasahiro Yamada 			= SYSMGR_FRZCTRL_VIOCTRL_WKPULLUP_MASK
139*05a21721SMasahiro Yamada 			| SYSMGR_FRZCTRL_VIOCTRL_TRISTATE_MASK;
140*05a21721SMasahiro Yamada 		setbits_le32(ioctrl_reg_offset,	reg_cfg_mask);
141*05a21721SMasahiro Yamada 
142*05a21721SMasahiro Yamada 		/*
143*05a21721SMasahiro Yamada 		 * Note: Delay for 20ns at min
144*05a21721SMasahiro Yamada 		 * de-assert active low enrnsl signal
145*05a21721SMasahiro Yamada 		 */
146*05a21721SMasahiro Yamada 		setbits_le32(ioctrl_reg_offset,
147*05a21721SMasahiro Yamada 			SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK);
148*05a21721SMasahiro Yamada 
149*05a21721SMasahiro Yamada 		/* Set global flag to indicate channel is thawed */
150*05a21721SMasahiro Yamada 		frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED;
151*05a21721SMasahiro Yamada 	}
152*05a21721SMasahiro Yamada 
153*05a21721SMasahiro Yamada 	/* Thaw channel 3 */
154*05a21721SMasahiro Yamada 	/* de-assert active high reinit signal */
155*05a21721SMasahiro Yamada 	clrbits_le32(&freeze_controller_base->hioctrl,
156*05a21721SMasahiro Yamada 		SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK);
157*05a21721SMasahiro Yamada 
158*05a21721SMasahiro Yamada 	/*
159*05a21721SMasahiro Yamada 	 * Note: Delay for 40ns at min
160*05a21721SMasahiro Yamada 	 * assert active high pllbiasen signals
161*05a21721SMasahiro Yamada 	 */
162*05a21721SMasahiro Yamada 	setbits_le32(&freeze_controller_base->hioctrl,
163*05a21721SMasahiro Yamada 		SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK);
164*05a21721SMasahiro Yamada 
165*05a21721SMasahiro Yamada 	/*
166*05a21721SMasahiro Yamada 	 * Delay 1000 intosc. intosc is based on eosc1
167*05a21721SMasahiro Yamada 	 * Use worst case which is fatest eosc1=50MHz, delay required
168*05a21721SMasahiro Yamada 	 * is 1/50MHz * 1000 = 20us
169*05a21721SMasahiro Yamada 	 */
170*05a21721SMasahiro Yamada 	udelay(20);
171*05a21721SMasahiro Yamada 
172*05a21721SMasahiro Yamada 	/*
173*05a21721SMasahiro Yamada 	 * de-assert active low bhniotri signals,
174*05a21721SMasahiro Yamada 	 * assert active high csrdone and nfrzdrv signal
175*05a21721SMasahiro Yamada 	 */
176*05a21721SMasahiro Yamada 	reg_value = readl(&freeze_controller_base->hioctrl);
177*05a21721SMasahiro Yamada 	reg_value = (reg_value
178*05a21721SMasahiro Yamada 		| SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK
179*05a21721SMasahiro Yamada 		| SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK)
180*05a21721SMasahiro Yamada 		& ~SYSMGR_FRZCTRL_HIOCTRL_OCTRST_MASK;
181*05a21721SMasahiro Yamada 	writel(reg_value, &freeze_controller_base->hioctrl);
182*05a21721SMasahiro Yamada 
183*05a21721SMasahiro Yamada 	/*
184*05a21721SMasahiro Yamada 	 * Delay 33 intosc
185*05a21721SMasahiro Yamada 	 * Use worst case which is fatest eosc1=50MHz, delay required
186*05a21721SMasahiro Yamada 	 * is 1/50MHz * 33 = 660ns ~= 1us
187*05a21721SMasahiro Yamada 	 */
188*05a21721SMasahiro Yamada 	udelay(1);
189*05a21721SMasahiro Yamada 
190*05a21721SMasahiro Yamada 	/* de-assert active low plniotri and niotri signals */
191*05a21721SMasahiro Yamada 	reg_cfg_mask
192*05a21721SMasahiro Yamada 		= SYSMGR_FRZCTRL_HIOCTRL_WKPULLUP_MASK
193*05a21721SMasahiro Yamada 		| SYSMGR_FRZCTRL_HIOCTRL_TRISTATE_MASK;
194*05a21721SMasahiro Yamada 
195*05a21721SMasahiro Yamada 	setbits_le32(&freeze_controller_base->hioctrl, reg_cfg_mask);
196*05a21721SMasahiro Yamada 
197*05a21721SMasahiro Yamada 	/*
198*05a21721SMasahiro Yamada 	 * Note: Delay for 40ns at min
199*05a21721SMasahiro Yamada 	 * de-assert active high frzreg signal
200*05a21721SMasahiro Yamada 	 */
201*05a21721SMasahiro Yamada 	clrbits_le32(&freeze_controller_base->hioctrl,
202*05a21721SMasahiro Yamada 		SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK);
203*05a21721SMasahiro Yamada 
204*05a21721SMasahiro Yamada 	/*
205*05a21721SMasahiro Yamada 	 * Note: Delay for 40ns at min
206*05a21721SMasahiro Yamada 	 * de-assert active low enrnsl signal
207*05a21721SMasahiro Yamada 	 */
208*05a21721SMasahiro Yamada 	setbits_le32(&freeze_controller_base->hioctrl,
209*05a21721SMasahiro Yamada 		SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK);
210*05a21721SMasahiro Yamada 
211*05a21721SMasahiro Yamada 	/* Set global flag to indicate channel is thawed */
212*05a21721SMasahiro Yamada 	frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED;
213*05a21721SMasahiro Yamada }
214