xref: /rk3399_ARM-atf/plat/mediatek/mt8195/drivers/spm/mt_spm_suspend.c (revision b4f7320afa2240eab480c5c4c7867bb275da36b0)
1859e346bSEdward-JW Yang /*
2859e346bSEdward-JW Yang  * Copyright (c) 2021, MediaTek Inc. All rights reserved.
3859e346bSEdward-JW Yang  *
4859e346bSEdward-JW Yang  * SPDX-License-Identifier: BSD-3-Clause
5859e346bSEdward-JW Yang  */
6859e346bSEdward-JW Yang 
7859e346bSEdward-JW Yang #include <common/debug.h>
8859e346bSEdward-JW Yang #include <lib/mmio.h>
9859e346bSEdward-JW Yang #include <mt_spm.h>
10859e346bSEdward-JW Yang #include <mt_spm_conservation.h>
11859e346bSEdward-JW Yang #include <mt_spm_internal.h>
12859e346bSEdward-JW Yang #include <mt_spm_rc_internal.h>
13859e346bSEdward-JW Yang #include <mt_spm_reg.h>
14859e346bSEdward-JW Yang #include <mt_spm_resource_req.h>
15859e346bSEdward-JW Yang #include <mt_spm_suspend.h>
16859e346bSEdward-JW Yang #include <plat_pm.h>
17859e346bSEdward-JW Yang #include <uart.h>
18859e346bSEdward-JW Yang 
19859e346bSEdward-JW Yang #define SPM_SUSPEND_SLEEP_PCM_FLAG			\
20859e346bSEdward-JW Yang 	(SPM_FLAG_DISABLE_INFRA_PDN |			\
21859e346bSEdward-JW Yang 	 SPM_FLAG_DISABLE_VCORE_DVS |			\
22859e346bSEdward-JW Yang 	 SPM_FLAG_DISABLE_VCORE_DFS |			\
23859e346bSEdward-JW Yang 	 SPM_FLAG_KEEP_CSYSPWRACK_HIGH |		\
24859e346bSEdward-JW Yang 	 SPM_FLAG_DISABLE_DRAMC_MCU_SRAM_SLEEP |	\
25859e346bSEdward-JW Yang 	 SPM_FLAG_SRAM_SLEEP_CTRL)
26859e346bSEdward-JW Yang 
27859e346bSEdward-JW Yang #define SPM_SUSPEND_SLEEP_PCM_FLAG1	0
28859e346bSEdward-JW Yang 
29859e346bSEdward-JW Yang #define SPM_SUSPEND_PCM_FLAG				\
30859e346bSEdward-JW Yang 	(SPM_FLAG_DISABLE_VCORE_DVS |			\
31859e346bSEdward-JW Yang 	 SPM_FLAG_DISABLE_VCORE_DFS |			\
32859e346bSEdward-JW Yang 	 SPM_FLAG_ENABLE_TIA_WORKAROUND |		\
33859e346bSEdward-JW Yang 	 SPM_FLAG_DISABLE_DRAMC_MCU_SRAM_SLEEP |	\
34859e346bSEdward-JW Yang 	 SPM_FLAG_SRAM_SLEEP_CTRL)
35859e346bSEdward-JW Yang 
36859e346bSEdward-JW Yang #define SPM_SUSPEND_PCM_FLAG1		0
37859e346bSEdward-JW Yang 
38859e346bSEdward-JW Yang /* Suspend spm power control */
39859e346bSEdward-JW Yang #define __WAKE_SRC_FOR_SUSPEND_COMMON__			\
40859e346bSEdward-JW Yang 	(R12_PCM_TIMER |				\
41859e346bSEdward-JW Yang 	 R12_KP_IRQ_B |					\
42859e346bSEdward-JW Yang 	 R12_APWDT_EVENT_B |				\
43859e346bSEdward-JW Yang 	 R12_CONN2AP_SPM_WAKEUP_B |			\
44859e346bSEdward-JW Yang 	 R12_EINT_EVENT_B |				\
45859e346bSEdward-JW Yang 	 R12_CONN_WDT_IRQ_B |				\
46859e346bSEdward-JW Yang 	 R12_CCIF0_EVENT_B |				\
47859e346bSEdward-JW Yang 	 R12_SSPM2SPM_WAKEUP_B |			\
48859e346bSEdward-JW Yang 	 R12_SCP2SPM_WAKEUP_B |				\
49859e346bSEdward-JW Yang 	 R12_USBX_CDSC_B |				\
50859e346bSEdward-JW Yang 	 R12_USBX_POWERDWN_B |				\
51859e346bSEdward-JW Yang 	 R12_SYS_TIMER_EVENT_B |			\
52859e346bSEdward-JW Yang 	 R12_EINT_EVENT_SECURE_B |			\
53859e346bSEdward-JW Yang 	 R12_SYS_CIRQ_IRQ_B |				\
54859e346bSEdward-JW Yang 	 R12_MD2AP_PEER_EVENT_B |			\
55859e346bSEdward-JW Yang 	 R12_MD1_WDT_B |				\
56859e346bSEdward-JW Yang 	 R12_CLDMA_EVENT_B |				\
57859e346bSEdward-JW Yang 	 R12_REG_CPU_WAKEUP |				\
58859e346bSEdward-JW Yang 	 R12_APUSYS_WAKE_HOST_B)
59859e346bSEdward-JW Yang 
60859e346bSEdward-JW Yang #if defined(CFG_MICROTRUST_TEE_SUPPORT)
61859e346bSEdward-JW Yang #define WAKE_SRC_FOR_SUSPEND (__WAKE_SRC_FOR_SUSPEND_COMMON__)
62859e346bSEdward-JW Yang #else
63859e346bSEdward-JW Yang #define WAKE_SRC_FOR_SUSPEND			\
64859e346bSEdward-JW Yang 	(__WAKE_SRC_FOR_SUSPEND_COMMON__ |	\
65859e346bSEdward-JW Yang 	 R12_SEJ_EVENT_B)
66859e346bSEdward-JW Yang #endif
67859e346bSEdward-JW Yang 
68859e346bSEdward-JW Yang static struct pwr_ctrl suspend_ctrl = {
69859e346bSEdward-JW Yang 	.wake_src = WAKE_SRC_FOR_SUSPEND,
70859e346bSEdward-JW Yang 
71859e346bSEdward-JW Yang 	/* SPM_AP_STANDBY_CON */
72859e346bSEdward-JW Yang 	/* [0] */
73859e346bSEdward-JW Yang 	.reg_wfi_op = 0,
74859e346bSEdward-JW Yang 	/* [1] */
75859e346bSEdward-JW Yang 	.reg_wfi_type = 0,
76859e346bSEdward-JW Yang 	/* [2] */
77859e346bSEdward-JW Yang 	.reg_mp0_cputop_idle_mask = 0,
78859e346bSEdward-JW Yang 	/* [3] */
79859e346bSEdward-JW Yang 	.reg_mp1_cputop_idle_mask = 0,
80859e346bSEdward-JW Yang 	/* [4] */
81859e346bSEdward-JW Yang 	.reg_mcusys_idle_mask = 0,
82859e346bSEdward-JW Yang 	/* [25] */
83859e346bSEdward-JW Yang 	.reg_md_apsrc_1_sel = 0,
84859e346bSEdward-JW Yang 	/* [26] */
85859e346bSEdward-JW Yang 	.reg_md_apsrc_0_sel = 0,
86859e346bSEdward-JW Yang 	/* [29] */
87859e346bSEdward-JW Yang 	.reg_conn_apsrc_sel = 0,
88859e346bSEdward-JW Yang 
89859e346bSEdward-JW Yang 	/* SPM_SRC_REQ */
90859e346bSEdward-JW Yang 	/* [0] */
91859e346bSEdward-JW Yang 	.reg_spm_apsrc_req = 0,
92859e346bSEdward-JW Yang 	/* [1] */
93859e346bSEdward-JW Yang 	.reg_spm_f26m_req = 0,
94859e346bSEdward-JW Yang 	/* [3] */
95859e346bSEdward-JW Yang 	.reg_spm_infra_req = 0,
96859e346bSEdward-JW Yang 	/* [4] */
97859e346bSEdward-JW Yang 	.reg_spm_vrf18_req = 0,
98859e346bSEdward-JW Yang 	/* [7] FIXME: default disable HW Auto S1*/
99*1f81ccceSGarmin Chang 	.reg_spm_ddr_en_req = 1,
100859e346bSEdward-JW Yang 	/* [8] */
101859e346bSEdward-JW Yang 	.reg_spm_dvfs_req = 0,
102859e346bSEdward-JW Yang 	/* [9] */
103859e346bSEdward-JW Yang 	.reg_spm_sw_mailbox_req = 0,
104859e346bSEdward-JW Yang 	/* [10] */
105859e346bSEdward-JW Yang 	.reg_spm_sspm_mailbox_req = 0,
106859e346bSEdward-JW Yang 	/* [11] */
107859e346bSEdward-JW Yang 	.reg_spm_adsp_mailbox_req = 0,
108859e346bSEdward-JW Yang 	/* [12] */
109859e346bSEdward-JW Yang 	.reg_spm_scp_mailbox_req = 0,
110859e346bSEdward-JW Yang 
111859e346bSEdward-JW Yang 	/* SPM_SRC_MASK */
112859e346bSEdward-JW Yang 	/* [0] */
113859e346bSEdward-JW Yang 	.reg_sspm_srcclkena_0_mask_b = 1,
114859e346bSEdward-JW Yang 	/* [1] */
115859e346bSEdward-JW Yang 	.reg_sspm_infra_req_0_mask_b = 1,
116859e346bSEdward-JW Yang 	/* [2] */
117859e346bSEdward-JW Yang 	.reg_sspm_apsrc_req_0_mask_b = 1,
118859e346bSEdward-JW Yang 	/* [3] */
119859e346bSEdward-JW Yang 	.reg_sspm_vrf18_req_0_mask_b = 1,
120859e346bSEdward-JW Yang 	/* [4] */
121859e346bSEdward-JW Yang 	.reg_sspm_ddr_en_0_mask_b = 1,
122859e346bSEdward-JW Yang 	/* [5] */
123859e346bSEdward-JW Yang 	.reg_scp_srcclkena_mask_b = 1,
124859e346bSEdward-JW Yang 	/* [6] */
125859e346bSEdward-JW Yang 	.reg_scp_infra_req_mask_b = 1,
126859e346bSEdward-JW Yang 	/* [7] */
127859e346bSEdward-JW Yang 	.reg_scp_apsrc_req_mask_b = 1,
128859e346bSEdward-JW Yang 	/* [8] */
129859e346bSEdward-JW Yang 	.reg_scp_vrf18_req_mask_b = 1,
130859e346bSEdward-JW Yang 	/* [9] */
131859e346bSEdward-JW Yang 	.reg_scp_ddr_en_mask_b = 1,
132859e346bSEdward-JW Yang 	/* [10] */
133859e346bSEdward-JW Yang 	.reg_audio_dsp_srcclkena_mask_b = 1,
134859e346bSEdward-JW Yang 	/* [11] */
135859e346bSEdward-JW Yang 	.reg_audio_dsp_infra_req_mask_b = 1,
136859e346bSEdward-JW Yang 	/* [12] */
137859e346bSEdward-JW Yang 	.reg_audio_dsp_apsrc_req_mask_b = 1,
138859e346bSEdward-JW Yang 	/* [13] */
139859e346bSEdward-JW Yang 	.reg_audio_dsp_vrf18_req_mask_b = 1,
140859e346bSEdward-JW Yang 	/* [14] */
141859e346bSEdward-JW Yang 	.reg_audio_dsp_ddr_en_mask_b = 1,
142859e346bSEdward-JW Yang 	/* [15] */
143859e346bSEdward-JW Yang 	.reg_apu_srcclkena_mask_b = 1,
144859e346bSEdward-JW Yang 	/* [16] */
145859e346bSEdward-JW Yang 	.reg_apu_infra_req_mask_b = 1,
146859e346bSEdward-JW Yang 	/* [17] */
147859e346bSEdward-JW Yang 	.reg_apu_apsrc_req_mask_b = 1,
148859e346bSEdward-JW Yang 	/* [18] */
149859e346bSEdward-JW Yang 	.reg_apu_vrf18_req_mask_b = 1,
150859e346bSEdward-JW Yang 	/* [19] */
151859e346bSEdward-JW Yang 	.reg_apu_ddr_en_mask_b = 1,
152859e346bSEdward-JW Yang 	/* [20] */
153859e346bSEdward-JW Yang 	.reg_cpueb_srcclkena_mask_b = 1,
154859e346bSEdward-JW Yang 	/* [21] */
155859e346bSEdward-JW Yang 	.reg_cpueb_infra_req_mask_b = 1,
156859e346bSEdward-JW Yang 	/* [22] */
157859e346bSEdward-JW Yang 	.reg_cpueb_apsrc_req_mask_b = 1,
158859e346bSEdward-JW Yang 	/* [23] */
159859e346bSEdward-JW Yang 	.reg_cpueb_vrf18_req_mask_b = 1,
160859e346bSEdward-JW Yang 	/* [24] */
161859e346bSEdward-JW Yang 	.reg_cpueb_ddr_en_mask_b = 1,
162859e346bSEdward-JW Yang 	/* [25] */
163859e346bSEdward-JW Yang 	.reg_bak_psri_srcclkena_mask_b = 0,
164859e346bSEdward-JW Yang 	/* [26] */
165859e346bSEdward-JW Yang 	.reg_bak_psri_infra_req_mask_b = 0,
166859e346bSEdward-JW Yang 	/* [27] */
167859e346bSEdward-JW Yang 	.reg_bak_psri_apsrc_req_mask_b = 0,
168859e346bSEdward-JW Yang 	/* [28] */
169859e346bSEdward-JW Yang 	.reg_bak_psri_vrf18_req_mask_b = 0,
170859e346bSEdward-JW Yang 	/* [29] */
171859e346bSEdward-JW Yang 	.reg_bak_psri_ddr_en_mask_b = 0,
172859e346bSEdward-JW Yang 
173859e346bSEdward-JW Yang 	/* SPM_SRC2_MASK */
174859e346bSEdward-JW Yang 	/* [0] */
175859e346bSEdward-JW Yang 	.reg_msdc0_srcclkena_mask_b = 1,
176859e346bSEdward-JW Yang 	/* [1] */
177859e346bSEdward-JW Yang 	.reg_msdc0_infra_req_mask_b = 1,
178859e346bSEdward-JW Yang 	/* [2] */
179859e346bSEdward-JW Yang 	.reg_msdc0_apsrc_req_mask_b = 1,
180859e346bSEdward-JW Yang 	/* [3] */
181859e346bSEdward-JW Yang 	.reg_msdc0_vrf18_req_mask_b = 1,
182859e346bSEdward-JW Yang 	/* [4] */
183859e346bSEdward-JW Yang 	.reg_msdc0_ddr_en_mask_b = 1,
184859e346bSEdward-JW Yang 	/* [5] */
185859e346bSEdward-JW Yang 	.reg_msdc1_srcclkena_mask_b = 1,
186859e346bSEdward-JW Yang 	/* [6] */
187859e346bSEdward-JW Yang 	.reg_msdc1_infra_req_mask_b = 1,
188859e346bSEdward-JW Yang 	/* [7] */
189859e346bSEdward-JW Yang 	.reg_msdc1_apsrc_req_mask_b = 1,
190859e346bSEdward-JW Yang 	/* [8] */
191859e346bSEdward-JW Yang 	.reg_msdc1_vrf18_req_mask_b = 1,
192859e346bSEdward-JW Yang 	/* [9] */
193859e346bSEdward-JW Yang 	.reg_msdc1_ddr_en_mask_b = 1,
194859e346bSEdward-JW Yang 	/* [10] */
195859e346bSEdward-JW Yang 	.reg_msdc2_srcclkena_mask_b = 1,
196859e346bSEdward-JW Yang 	/* [11] */
197859e346bSEdward-JW Yang 	.reg_msdc2_infra_req_mask_b = 1,
198859e346bSEdward-JW Yang 	/* [12] */
199859e346bSEdward-JW Yang 	.reg_msdc2_apsrc_req_mask_b = 1,
200859e346bSEdward-JW Yang 	/* [13] */
201859e346bSEdward-JW Yang 	.reg_msdc2_vrf18_req_mask_b = 1,
202859e346bSEdward-JW Yang 	/* [14] */
203859e346bSEdward-JW Yang 	.reg_msdc2_ddr_en_mask_b = 1,
204859e346bSEdward-JW Yang 	/* [15] */
205859e346bSEdward-JW Yang 	.reg_ufs_srcclkena_mask_b = 0,
206859e346bSEdward-JW Yang 	/* [16] */
207859e346bSEdward-JW Yang 	.reg_ufs_infra_req_mask_b = 0,
208859e346bSEdward-JW Yang 	/* [17] */
209859e346bSEdward-JW Yang 	.reg_ufs_apsrc_req_mask_b = 0,
210859e346bSEdward-JW Yang 	/* [18] */
211859e346bSEdward-JW Yang 	.reg_ufs_vrf18_req_mask_b = 0,
212859e346bSEdward-JW Yang 	/* [19] */
213859e346bSEdward-JW Yang 	.reg_ufs_ddr_en_mask_b = 0,
214859e346bSEdward-JW Yang 	/* [20] */
215859e346bSEdward-JW Yang 	.reg_usb_srcclkena_mask_b = 1,
216859e346bSEdward-JW Yang 	/* [21] */
217859e346bSEdward-JW Yang 	.reg_usb_infra_req_mask_b = 1,
218859e346bSEdward-JW Yang 	/* [22] */
219859e346bSEdward-JW Yang 	.reg_usb_apsrc_req_mask_b = 1,
220859e346bSEdward-JW Yang 	/* [23] */
221859e346bSEdward-JW Yang 	.reg_usb_vrf18_req_mask_b = 1,
222859e346bSEdward-JW Yang 	/* [24] */
223859e346bSEdward-JW Yang 	.reg_usb_ddr_en_mask_b = 1,
224859e346bSEdward-JW Yang 	/* [25] */
225859e346bSEdward-JW Yang 	.reg_pextp_p0_srcclkena_mask_b = 1,
226859e346bSEdward-JW Yang 	/* [26] */
227859e346bSEdward-JW Yang 	.reg_pextp_p0_infra_req_mask_b = 1,
228859e346bSEdward-JW Yang 	/* [27] */
229859e346bSEdward-JW Yang 	.reg_pextp_p0_apsrc_req_mask_b = 1,
230859e346bSEdward-JW Yang 	/* [28] */
231859e346bSEdward-JW Yang 	.reg_pextp_p0_vrf18_req_mask_b = 1,
232859e346bSEdward-JW Yang 	/* [29] */
233859e346bSEdward-JW Yang 	.reg_pextp_p0_ddr_en_mask_b = 1,
234859e346bSEdward-JW Yang 
235859e346bSEdward-JW Yang 	/* SPM_SRC3_MASK */
236859e346bSEdward-JW Yang 	/* [0] */
237859e346bSEdward-JW Yang 	.reg_pextp_p1_srcclkena_mask_b = 1,
238859e346bSEdward-JW Yang 	/* [1] */
239859e346bSEdward-JW Yang 	.reg_pextp_p1_infra_req_mask_b = 1,
240859e346bSEdward-JW Yang 	/* [2] */
241859e346bSEdward-JW Yang 	.reg_pextp_p1_apsrc_req_mask_b = 1,
242859e346bSEdward-JW Yang 	/* [3] */
243859e346bSEdward-JW Yang 	.reg_pextp_p1_vrf18_req_mask_b = 1,
244859e346bSEdward-JW Yang 	/* [4] */
245859e346bSEdward-JW Yang 	.reg_pextp_p1_ddr_en_mask_b = 1,
246859e346bSEdward-JW Yang 	/* [5] */
247859e346bSEdward-JW Yang 	.reg_gce0_infra_req_mask_b = 1,
248859e346bSEdward-JW Yang 	/* [6] */
249859e346bSEdward-JW Yang 	.reg_gce0_apsrc_req_mask_b = 1,
250859e346bSEdward-JW Yang 	/* [7] */
251859e346bSEdward-JW Yang 	.reg_gce0_vrf18_req_mask_b = 1,
252859e346bSEdward-JW Yang 	/* [8] */
253859e346bSEdward-JW Yang 	.reg_gce0_ddr_en_mask_b = 1,
254859e346bSEdward-JW Yang 	/* [9] */
255859e346bSEdward-JW Yang 	.reg_gce1_infra_req_mask_b = 1,
256859e346bSEdward-JW Yang 	/* [10] */
257859e346bSEdward-JW Yang 	.reg_gce1_apsrc_req_mask_b = 1,
258859e346bSEdward-JW Yang 	/* [11] */
259859e346bSEdward-JW Yang 	.reg_gce1_vrf18_req_mask_b = 1,
260859e346bSEdward-JW Yang 	/* [12] */
261859e346bSEdward-JW Yang 	.reg_gce1_ddr_en_mask_b = 1,
262859e346bSEdward-JW Yang 	/* [13] */
263859e346bSEdward-JW Yang 	.reg_spm_srcclkena_reserved_mask_b = 1,
264859e346bSEdward-JW Yang 	/* [14] */
265859e346bSEdward-JW Yang 	.reg_spm_infra_req_reserved_mask_b = 1,
266859e346bSEdward-JW Yang 	/* [15] */
267859e346bSEdward-JW Yang 	.reg_spm_apsrc_req_reserved_mask_b = 1,
268859e346bSEdward-JW Yang 	/* [16] */
269859e346bSEdward-JW Yang 	.reg_spm_vrf18_req_reserved_mask_b = 1,
270859e346bSEdward-JW Yang 	/* [17] */
271859e346bSEdward-JW Yang 	.reg_spm_ddr_en_reserved_mask_b = 1,
272859e346bSEdward-JW Yang 	/* [18] */
273859e346bSEdward-JW Yang 	.reg_disp0_apsrc_req_mask_b = 1,
274859e346bSEdward-JW Yang 	/* [19] */
275859e346bSEdward-JW Yang 	.reg_disp0_ddr_en_mask_b = 1,
276859e346bSEdward-JW Yang 	/* [20] */
277859e346bSEdward-JW Yang 	.reg_disp1_apsrc_req_mask_b = 1,
278859e346bSEdward-JW Yang 	/* [21] */
279859e346bSEdward-JW Yang 	.reg_disp1_ddr_en_mask_b = 1,
280859e346bSEdward-JW Yang 	/* [22] */
281859e346bSEdward-JW Yang 	.reg_disp2_apsrc_req_mask_b = 1,
282859e346bSEdward-JW Yang 	/* [23] */
283859e346bSEdward-JW Yang 	.reg_disp2_ddr_en_mask_b = 1,
284859e346bSEdward-JW Yang 	/* [24] */
285859e346bSEdward-JW Yang 	.reg_disp3_apsrc_req_mask_b = 1,
286859e346bSEdward-JW Yang 	/* [25] */
287859e346bSEdward-JW Yang 	.reg_disp3_ddr_en_mask_b = 1,
288859e346bSEdward-JW Yang 	/* [26] */
289859e346bSEdward-JW Yang 	.reg_infrasys_apsrc_req_mask_b = 0,
290859e346bSEdward-JW Yang 	/* [27] */
291859e346bSEdward-JW Yang 	.reg_infrasys_ddr_en_mask_b = 1,
292859e346bSEdward-JW Yang 
293859e346bSEdward-JW Yang 	/* [28] */
294859e346bSEdward-JW Yang 	.reg_cg_check_srcclkena_mask_b = 1,
295859e346bSEdward-JW Yang 	/* [29] */
296859e346bSEdward-JW Yang 	.reg_cg_check_apsrc_req_mask_b = 1,
297859e346bSEdward-JW Yang 	/* [30] */
298859e346bSEdward-JW Yang 	.reg_cg_check_vrf18_req_mask_b = 1,
299859e346bSEdward-JW Yang 	/* [31] */
300859e346bSEdward-JW Yang 	.reg_cg_check_ddr_en_mask_b = 1,
301859e346bSEdward-JW Yang 
302859e346bSEdward-JW Yang 	/* SPM_SRC4_MASK */
303859e346bSEdward-JW Yang 	/* [8:0] */
304859e346bSEdward-JW Yang 	.reg_mcusys_merge_apsrc_req_mask_b = 0x17,
305859e346bSEdward-JW Yang 	/* [17:9] */
306859e346bSEdward-JW Yang 	.reg_mcusys_merge_ddr_en_mask_b = 0x17,
307859e346bSEdward-JW Yang 	/* [19:18] */
308859e346bSEdward-JW Yang 	.reg_dramc_md32_infra_req_mask_b = 0,
309859e346bSEdward-JW Yang 	/* [21:20] */
310859e346bSEdward-JW Yang 	.reg_dramc_md32_vrf18_req_mask_b = 0,
311859e346bSEdward-JW Yang 	/* [23:22] */
312859e346bSEdward-JW Yang 	.reg_dramc_md32_ddr_en_mask_b = 0,
313859e346bSEdward-JW Yang 	/* [24] */
314859e346bSEdward-JW Yang 	.reg_dvfsrc_event_trigger_mask_b = 1,
315859e346bSEdward-JW Yang 
316859e346bSEdward-JW Yang 	/* SPM_WAKEUP_EVENT_MASK2 */
317859e346bSEdward-JW Yang 	/* [3:0] */
318859e346bSEdward-JW Yang 	.reg_sc_sw2spm_wakeup_mask_b = 0,
319859e346bSEdward-JW Yang 	/* [4] */
320859e346bSEdward-JW Yang 	.reg_sc_adsp2spm_wakeup_mask_b = 0,
321859e346bSEdward-JW Yang 	/* [8:5] */
322859e346bSEdward-JW Yang 	.reg_sc_sspm2spm_wakeup_mask_b = 0,
323859e346bSEdward-JW Yang 	/* [9] */
324859e346bSEdward-JW Yang 	.reg_sc_scp2spm_wakeup_mask_b = 0,
325859e346bSEdward-JW Yang 	/* [10] */
326859e346bSEdward-JW Yang 	.reg_csyspwrup_ack_mask = 0,
327859e346bSEdward-JW Yang 	/* [11] */
328859e346bSEdward-JW Yang 	.reg_csyspwrup_req_mask = 1,
329859e346bSEdward-JW Yang 
330859e346bSEdward-JW Yang 	/* SPM_WAKEUP_EVENT_MASK */
331859e346bSEdward-JW Yang 	/* [31:0] */
332859e346bSEdward-JW Yang 	.reg_wakeup_event_mask = 0xC1382213,
333859e346bSEdward-JW Yang 
334859e346bSEdward-JW Yang 	/* SPM_WAKEUP_EVENT_EXT_MASK */
335859e346bSEdward-JW Yang 	/* [31:0] */
336859e346bSEdward-JW Yang 	.reg_ext_wakeup_event_mask = 0xFFFFFFFF,
337859e346bSEdward-JW Yang };
338859e346bSEdward-JW Yang 
339859e346bSEdward-JW Yang struct spm_lp_scen __spm_suspend = {
340859e346bSEdward-JW Yang 	.pwrctrl = &suspend_ctrl,
341859e346bSEdward-JW Yang };
342859e346bSEdward-JW Yang 
mt_spm_suspend_mode_set(int mode)343859e346bSEdward-JW Yang int mt_spm_suspend_mode_set(int mode)
344859e346bSEdward-JW Yang {
345859e346bSEdward-JW Yang 	if (mode == MT_SPM_SUSPEND_SLEEP) {
346859e346bSEdward-JW Yang 		suspend_ctrl.pcm_flags = SPM_SUSPEND_SLEEP_PCM_FLAG;
347859e346bSEdward-JW Yang 		suspend_ctrl.pcm_flags1 = SPM_SUSPEND_SLEEP_PCM_FLAG1;
348859e346bSEdward-JW Yang 	} else {
349859e346bSEdward-JW Yang 		suspend_ctrl.pcm_flags = SPM_SUSPEND_PCM_FLAG;
350859e346bSEdward-JW Yang 		suspend_ctrl.pcm_flags1 = SPM_SUSPEND_PCM_FLAG1;
351859e346bSEdward-JW Yang 	}
352859e346bSEdward-JW Yang 
353859e346bSEdward-JW Yang 	return 0;
354859e346bSEdward-JW Yang }
355859e346bSEdward-JW Yang 
mt_spm_suspend_enter(int state_id,unsigned int ext_opand,unsigned int resource_req)356859e346bSEdward-JW Yang int mt_spm_suspend_enter(int state_id, unsigned int ext_opand,
357859e346bSEdward-JW Yang 			 unsigned int resource_req)
358859e346bSEdward-JW Yang {
359859e346bSEdward-JW Yang 	/* If FMAudio / ADSP is active, change to sleep suspend mode */
360859e346bSEdward-JW Yang 	if ((ext_opand & MT_SPM_EX_OP_SET_SUSPEND_MODE) != 0U) {
361859e346bSEdward-JW Yang 		mt_spm_suspend_mode_set(MT_SPM_SUSPEND_SLEEP);
362859e346bSEdward-JW Yang 	}
363859e346bSEdward-JW Yang 
364859e346bSEdward-JW Yang 	/* Notify MCUPM that device is going suspend flow */
365859e346bSEdward-JW Yang 	mmio_write_32(MCUPM_MBOX_OFFSET_PDN, MCUPM_POWER_DOWN);
366859e346bSEdward-JW Yang 
367859e346bSEdward-JW Yang 	/* Notify UART to sleep */
368859e346bSEdward-JW Yang 	mt_uart_save();
369859e346bSEdward-JW Yang 
370859e346bSEdward-JW Yang 	return spm_conservation(state_id, ext_opand,
371859e346bSEdward-JW Yang 				&__spm_suspend, resource_req);
372859e346bSEdward-JW Yang }
373859e346bSEdward-JW Yang 
mt_spm_suspend_resume(int state_id,unsigned int ext_opand,struct wake_status ** status)374859e346bSEdward-JW Yang void mt_spm_suspend_resume(int state_id, unsigned int ext_opand,
375859e346bSEdward-JW Yang 			   struct wake_status **status)
376859e346bSEdward-JW Yang {
377859e346bSEdward-JW Yang 	spm_conservation_finish(state_id, ext_opand, &__spm_suspend, status);
378859e346bSEdward-JW Yang 
379859e346bSEdward-JW Yang 	/* Notify UART to wakeup */
380859e346bSEdward-JW Yang 	mt_uart_restore();
381859e346bSEdward-JW Yang 
382859e346bSEdward-JW Yang 	/* Notify MCUPM that device leave suspend */
383859e346bSEdward-JW Yang 	mmio_write_32(MCUPM_MBOX_OFFSET_PDN, 0);
384859e346bSEdward-JW Yang 
385859e346bSEdward-JW Yang 	/* If FMAudio / ADSP is active, change back to suspend mode */
386859e346bSEdward-JW Yang 	if ((ext_opand & MT_SPM_EX_OP_SET_SUSPEND_MODE) != 0U) {
387859e346bSEdward-JW Yang 		mt_spm_suspend_mode_set(MT_SPM_SUSPEND_SYSTEM_PDN);
388859e346bSEdward-JW Yang 	}
389859e346bSEdward-JW Yang }
390859e346bSEdward-JW Yang 
mt_spm_suspend_init(void)391859e346bSEdward-JW Yang void mt_spm_suspend_init(void)
392859e346bSEdward-JW Yang {
393859e346bSEdward-JW Yang 	spm_conservation_pwrctrl_init(__spm_suspend.pwrctrl);
394859e346bSEdward-JW Yang }
395