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