1*01ce1d5dSWenzhen Yu /*
2*01ce1d5dSWenzhen Yu * Copyright (c) 2025, Mediatek Inc. All rights reserved.
3*01ce1d5dSWenzhen Yu *
4*01ce1d5dSWenzhen Yu * SPDX-License-Identifier: BSD-3-Clause
5*01ce1d5dSWenzhen Yu */
6*01ce1d5dSWenzhen Yu
7*01ce1d5dSWenzhen Yu #include <stdint.h>
8*01ce1d5dSWenzhen Yu #include <stdio.h>
9*01ce1d5dSWenzhen Yu
10*01ce1d5dSWenzhen Yu #include <common/debug.h>
11*01ce1d5dSWenzhen Yu #include <drivers/delay_timer.h>
12*01ce1d5dSWenzhen Yu #include <drivers/gpio.h>
13*01ce1d5dSWenzhen Yu #include <lib/mmio.h>
14*01ce1d5dSWenzhen Yu
15*01ce1d5dSWenzhen Yu #include <constraints/mt_spm_rc_internal.h>
16*01ce1d5dSWenzhen Yu #include <drivers/spm/mt_spm_resource_req.h>
17*01ce1d5dSWenzhen Yu #include <lib/pm/mtk_pm.h>
18*01ce1d5dSWenzhen Yu #include <lpm_v2/mt_lp_api.h>
19*01ce1d5dSWenzhen Yu #include <lpm_v2/mt_lp_rqm.h>
20*01ce1d5dSWenzhen Yu #include <mt_spm.h>
21*01ce1d5dSWenzhen Yu #include <mt_spm_conservation.h>
22*01ce1d5dSWenzhen Yu #include <mt_spm_internal.h>
23*01ce1d5dSWenzhen Yu #include <mt_spm_reg.h>
24*01ce1d5dSWenzhen Yu #include <mt_spm_stats.h>
25*01ce1d5dSWenzhen Yu #include <mt_spm_suspend.h>
26*01ce1d5dSWenzhen Yu #if defined(CONFIG_MTK_VCOREDVFS_SUPPORT)
27*01ce1d5dSWenzhen Yu #include <mt_spm_vcorefs_exp.h>
28*01ce1d5dSWenzhen Yu #endif
29*01ce1d5dSWenzhen Yu
30*01ce1d5dSWenzhen Yu #define SPM_SUSPEND_SLEEP_PCM_FLAG (SPM_FLAG_DISABLE_DDR_DFS | \
31*01ce1d5dSWenzhen Yu SPM_FLAG_DISABLE_EMI_DFS | \
32*01ce1d5dSWenzhen Yu SPM_FLAG_DISABLE_VLP_PDN | \
33*01ce1d5dSWenzhen Yu SPM_FLAG_DISABLE_BUS_DFS | \
34*01ce1d5dSWenzhen Yu SPM_FLAG_KEEP_CSYSPWRACK_HIGH | \
35*01ce1d5dSWenzhen Yu SPM_FLAG_ENABLE_AOV | \
36*01ce1d5dSWenzhen Yu SPM_FLAG_ENABLE_MD_MUMTAS | \
37*01ce1d5dSWenzhen Yu SPM_FLAG_SRAM_SLEEP_CTRL)
38*01ce1d5dSWenzhen Yu
39*01ce1d5dSWenzhen Yu #define SPM_SUSPEND_SLEEP_PCM_FLAG1 (SPM_FLAG1_ENABLE_ALCO_TRACE | \
40*01ce1d5dSWenzhen Yu SPM_FLAG1_ENABLE_SUSPEND_AVS)
41*01ce1d5dSWenzhen Yu
42*01ce1d5dSWenzhen Yu #define SPM_SUSPEND_PCM_FLAG (SPM_FLAG_DISABLE_VCORE_DVS | \
43*01ce1d5dSWenzhen Yu SPM_FLAG_DISABLE_MCUPM_PDN | \
44*01ce1d5dSWenzhen Yu SPM_FLAG_DISABLE_VLP_PDN | \
45*01ce1d5dSWenzhen Yu SPM_FLAG_DISABLE_DDR_DFS | \
46*01ce1d5dSWenzhen Yu SPM_FLAG_DISABLE_EMI_DFS | \
47*01ce1d5dSWenzhen Yu SPM_FLAG_DISABLE_BUS_DFS | \
48*01ce1d5dSWenzhen Yu SPM_FLAG_ENABLE_MD_MUMTAS | \
49*01ce1d5dSWenzhen Yu SPM_FLAG_SRAM_SLEEP_CTRL)
50*01ce1d5dSWenzhen Yu
51*01ce1d5dSWenzhen Yu #define SPM_SUSPEND_PCM_FLAG1 (SPM_FLAG1_ENABLE_ALCO_TRACE | \
52*01ce1d5dSWenzhen Yu SPM_FLAG1_ENABLE_SUSPEND_AVS | \
53*01ce1d5dSWenzhen Yu SPM_FLAG1_ENABLE_CSOPLU_OFF)
54*01ce1d5dSWenzhen Yu
55*01ce1d5dSWenzhen Yu /* Suspend spm power control */
56*01ce1d5dSWenzhen Yu #define __WAKE_SRC_FOR_SUSPEND_COMMON__ ( \
57*01ce1d5dSWenzhen Yu (R12_KP_IRQ_B) | \
58*01ce1d5dSWenzhen Yu (R12_APWDT_EVENT_B) | \
59*01ce1d5dSWenzhen Yu (R12_CONN2AP_WAKEUP_B) | \
60*01ce1d5dSWenzhen Yu (R12_EINT_EVENT_B) | \
61*01ce1d5dSWenzhen Yu (R12_CONN_WDT_IRQ_B) | \
62*01ce1d5dSWenzhen Yu (R12_CCIF0_EVENT_B) | \
63*01ce1d5dSWenzhen Yu (R12_CCIF1_EVENT_B) | \
64*01ce1d5dSWenzhen Yu (R12_SCP2SPM_WAKEUP_B) | \
65*01ce1d5dSWenzhen Yu (R12_ADSP2SPM_WAKEUP_B) | \
66*01ce1d5dSWenzhen Yu (R12_USB0_CDSC_B) | \
67*01ce1d5dSWenzhen Yu (R12_USB0_POWERDWN_B) | \
68*01ce1d5dSWenzhen Yu (R12_UART_EVENT_B) |\
69*01ce1d5dSWenzhen Yu (R12_SYS_TIMER_EVENT_B) | \
70*01ce1d5dSWenzhen Yu (R12_EINT_EVENT_SECURE_B) | \
71*01ce1d5dSWenzhen Yu (R12_SYS_CIRQ_IRQ_B) | \
72*01ce1d5dSWenzhen Yu (R12_MD_WDT_B) | \
73*01ce1d5dSWenzhen Yu (R12_AP2AP_PEER_WAKEUP_B) | \
74*01ce1d5dSWenzhen Yu (R12_CPU_WAKEUP) | \
75*01ce1d5dSWenzhen Yu (R12_APUSYS_WAKE_HOST_B)|\
76*01ce1d5dSWenzhen Yu (R12_PCIE_WAKE_B))
77*01ce1d5dSWenzhen Yu
78*01ce1d5dSWenzhen Yu #if defined(CFG_MICROTRUST_TEE_SUPPORT)
79*01ce1d5dSWenzhen Yu #define WAKE_SRC_FOR_SUSPEND \
80*01ce1d5dSWenzhen Yu (__WAKE_SRC_FOR_SUSPEND_COMMON__)
81*01ce1d5dSWenzhen Yu #else
82*01ce1d5dSWenzhen Yu #define WAKE_SRC_FOR_SUSPEND \
83*01ce1d5dSWenzhen Yu (__WAKE_SRC_FOR_SUSPEND_COMMON__ | \
84*01ce1d5dSWenzhen Yu R12_SEJ_B)
85*01ce1d5dSWenzhen Yu #endif
86*01ce1d5dSWenzhen Yu static uint32_t gpio_bk1;
87*01ce1d5dSWenzhen Yu static uint32_t gpio_bk2;
88*01ce1d5dSWenzhen Yu static uint32_t gpio_bk3;
89*01ce1d5dSWenzhen Yu
90*01ce1d5dSWenzhen Yu static struct pwr_ctrl suspend_ctrl = {
91*01ce1d5dSWenzhen Yu .wake_src = WAKE_SRC_FOR_SUSPEND,
92*01ce1d5dSWenzhen Yu
93*01ce1d5dSWenzhen Yu /* SPM_SRC_REQ */
94*01ce1d5dSWenzhen Yu .reg_spm_adsp_mailbox_req = 0,
95*01ce1d5dSWenzhen Yu .reg_spm_apsrc_req = 0,
96*01ce1d5dSWenzhen Yu .reg_spm_ddren_req = 0,
97*01ce1d5dSWenzhen Yu .reg_spm_dvfs_req = 0,
98*01ce1d5dSWenzhen Yu .reg_spm_emi_req = 0,
99*01ce1d5dSWenzhen Yu .reg_spm_f26m_req = 0,
100*01ce1d5dSWenzhen Yu .reg_spm_infra_req = 0,
101*01ce1d5dSWenzhen Yu .reg_spm_pmic_req = 0,
102*01ce1d5dSWenzhen Yu .reg_spm_scp_mailbox_req = 0,
103*01ce1d5dSWenzhen Yu .reg_spm_sspm_mailbox_req = 0,
104*01ce1d5dSWenzhen Yu .reg_spm_sw_mailbox_req = 0,
105*01ce1d5dSWenzhen Yu .reg_spm_vcore_req = 1,
106*01ce1d5dSWenzhen Yu .reg_spm_vrf18_req = 0,
107*01ce1d5dSWenzhen Yu .adsp_mailbox_state = 0,
108*01ce1d5dSWenzhen Yu .apsrc_state = 0,
109*01ce1d5dSWenzhen Yu .ddren_state = 0,
110*01ce1d5dSWenzhen Yu .dvfs_state = 0,
111*01ce1d5dSWenzhen Yu .emi_state = 0,
112*01ce1d5dSWenzhen Yu .f26m_state = 0,
113*01ce1d5dSWenzhen Yu .infra_state = 0,
114*01ce1d5dSWenzhen Yu .pmic_state = 0,
115*01ce1d5dSWenzhen Yu .scp_mailbox_state = 0,
116*01ce1d5dSWenzhen Yu .sspm_mailbox_state = 0,
117*01ce1d5dSWenzhen Yu .sw_mailbox_state = 0,
118*01ce1d5dSWenzhen Yu .vcore_state = 0,
119*01ce1d5dSWenzhen Yu .vrf18_state = 0,
120*01ce1d5dSWenzhen Yu
121*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_0 */
122*01ce1d5dSWenzhen Yu .reg_apifr_apsrc_rmb = 0,
123*01ce1d5dSWenzhen Yu .reg_apifr_ddren_rmb = 0,
124*01ce1d5dSWenzhen Yu .reg_apifr_emi_rmb = 0,
125*01ce1d5dSWenzhen Yu .reg_apifr_infra_rmb = 0,
126*01ce1d5dSWenzhen Yu .reg_apifr_pmic_rmb = 0,
127*01ce1d5dSWenzhen Yu .reg_apifr_srcclkena_mb = 0,
128*01ce1d5dSWenzhen Yu .reg_apifr_vcore_rmb = 0,
129*01ce1d5dSWenzhen Yu .reg_apifr_vrf18_rmb = 0,
130*01ce1d5dSWenzhen Yu .reg_apu_apsrc_rmb = 1,
131*01ce1d5dSWenzhen Yu .reg_apu_ddren_rmb = 0,
132*01ce1d5dSWenzhen Yu .reg_apu_emi_rmb = 1,
133*01ce1d5dSWenzhen Yu .reg_apu_infra_rmb = 1,
134*01ce1d5dSWenzhen Yu .reg_apu_pmic_rmb = 1,
135*01ce1d5dSWenzhen Yu .reg_apu_srcclkena_mb = 1,
136*01ce1d5dSWenzhen Yu .reg_apu_vcore_rmb = 1,
137*01ce1d5dSWenzhen Yu .reg_apu_vrf18_rmb = 1,
138*01ce1d5dSWenzhen Yu .reg_audio_apsrc_rmb = 1,
139*01ce1d5dSWenzhen Yu .reg_audio_ddren_rmb = 0,
140*01ce1d5dSWenzhen Yu .reg_audio_emi_rmb = 1,
141*01ce1d5dSWenzhen Yu .reg_audio_infra_rmb = 1,
142*01ce1d5dSWenzhen Yu .reg_audio_pmic_rmb = 0,
143*01ce1d5dSWenzhen Yu .reg_audio_srcclkena_mb = 1,
144*01ce1d5dSWenzhen Yu .reg_audio_vcore_rmb = 1,
145*01ce1d5dSWenzhen Yu .reg_audio_vrf18_rmb = 1,
146*01ce1d5dSWenzhen Yu
147*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_1 */
148*01ce1d5dSWenzhen Yu .reg_audio_dsp_apsrc_rmb = 1,
149*01ce1d5dSWenzhen Yu .reg_audio_dsp_ddren_rmb = 0,
150*01ce1d5dSWenzhen Yu .reg_audio_dsp_emi_rmb = 1,
151*01ce1d5dSWenzhen Yu .reg_audio_dsp_infra_rmb = 1,
152*01ce1d5dSWenzhen Yu .reg_audio_dsp_pmic_rmb = 1,
153*01ce1d5dSWenzhen Yu .reg_audio_dsp_srcclkena_mb = 1,
154*01ce1d5dSWenzhen Yu .reg_audio_dsp_vcore_rmb = 1,
155*01ce1d5dSWenzhen Yu .reg_audio_dsp_vrf18_rmb = 1,
156*01ce1d5dSWenzhen Yu .reg_cam_apsrc_rmb = 0,
157*01ce1d5dSWenzhen Yu .reg_cam_ddren_rmb = 0,
158*01ce1d5dSWenzhen Yu .reg_cam_emi_rmb = 0,
159*01ce1d5dSWenzhen Yu .reg_cam_infra_rmb = 0,
160*01ce1d5dSWenzhen Yu .reg_cam_pmic_rmb = 0,
161*01ce1d5dSWenzhen Yu .reg_cam_srcclkena_mb = 0,
162*01ce1d5dSWenzhen Yu .reg_cam_vrf18_rmb = 0,
163*01ce1d5dSWenzhen Yu .reg_ccif_apsrc_rmb = 0xfff,
164*01ce1d5dSWenzhen Yu
165*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_2 */
166*01ce1d5dSWenzhen Yu .reg_ccif_emi_rmb = 0xfff,
167*01ce1d5dSWenzhen Yu .reg_ccif_infra_rmb = 0xfff,
168*01ce1d5dSWenzhen Yu
169*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_3 */
170*01ce1d5dSWenzhen Yu .reg_ccif_pmic_rmb = 0xfff,
171*01ce1d5dSWenzhen Yu .reg_ccif_srcclkena_mb = 0xfff,
172*01ce1d5dSWenzhen Yu
173*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_4 */
174*01ce1d5dSWenzhen Yu .reg_ccif_vcore_rmb = 0xfff,
175*01ce1d5dSWenzhen Yu .reg_ccif_vrf18_rmb = 0xfff,
176*01ce1d5dSWenzhen Yu .reg_ccu_apsrc_rmb = 0,
177*01ce1d5dSWenzhen Yu .reg_ccu_ddren_rmb = 0,
178*01ce1d5dSWenzhen Yu .reg_ccu_emi_rmb = 0,
179*01ce1d5dSWenzhen Yu .reg_ccu_infra_rmb = 0,
180*01ce1d5dSWenzhen Yu .reg_ccu_pmic_rmb = 0,
181*01ce1d5dSWenzhen Yu .reg_ccu_srcclkena_mb = 0,
182*01ce1d5dSWenzhen Yu .reg_ccu_vrf18_rmb = 0,
183*01ce1d5dSWenzhen Yu .reg_cg_check_apsrc_rmb = 0,
184*01ce1d5dSWenzhen Yu
185*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_5 */
186*01ce1d5dSWenzhen Yu .reg_cg_check_ddren_rmb = 0,
187*01ce1d5dSWenzhen Yu .reg_cg_check_emi_rmb = 0,
188*01ce1d5dSWenzhen Yu .reg_cg_check_infra_rmb = 0,
189*01ce1d5dSWenzhen Yu .reg_cg_check_pmic_rmb = 0,
190*01ce1d5dSWenzhen Yu .reg_cg_check_srcclkena_mb = 0,
191*01ce1d5dSWenzhen Yu .reg_cg_check_vcore_rmb = 1,
192*01ce1d5dSWenzhen Yu .reg_cg_check_vrf18_rmb = 0,
193*01ce1d5dSWenzhen Yu .reg_cksys_apsrc_rmb = 1,
194*01ce1d5dSWenzhen Yu .reg_cksys_ddren_rmb = 0,
195*01ce1d5dSWenzhen Yu .reg_cksys_emi_rmb = 1,
196*01ce1d5dSWenzhen Yu .reg_cksys_infra_rmb = 1,
197*01ce1d5dSWenzhen Yu .reg_cksys_pmic_rmb = 1,
198*01ce1d5dSWenzhen Yu .reg_cksys_srcclkena_mb = 1,
199*01ce1d5dSWenzhen Yu .reg_cksys_vcore_rmb = 1,
200*01ce1d5dSWenzhen Yu .reg_cksys_vrf18_rmb = 1,
201*01ce1d5dSWenzhen Yu .reg_cksys_1_apsrc_rmb = 1,
202*01ce1d5dSWenzhen Yu .reg_cksys_1_ddren_rmb = 0,
203*01ce1d5dSWenzhen Yu .reg_cksys_1_emi_rmb = 1,
204*01ce1d5dSWenzhen Yu .reg_cksys_1_infra_rmb = 1,
205*01ce1d5dSWenzhen Yu .reg_cksys_1_pmic_rmb = 1,
206*01ce1d5dSWenzhen Yu .reg_cksys_1_srcclkena_mb = 1,
207*01ce1d5dSWenzhen Yu .reg_cksys_1_vcore_rmb = 1,
208*01ce1d5dSWenzhen Yu .reg_cksys_1_vrf18_rmb = 1,
209*01ce1d5dSWenzhen Yu
210*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_6 */
211*01ce1d5dSWenzhen Yu .reg_cksys_2_apsrc_rmb = 1,
212*01ce1d5dSWenzhen Yu .reg_cksys_2_ddren_rmb = 0,
213*01ce1d5dSWenzhen Yu .reg_cksys_2_emi_rmb = 1,
214*01ce1d5dSWenzhen Yu .reg_cksys_2_infra_rmb = 1,
215*01ce1d5dSWenzhen Yu .reg_cksys_2_pmic_rmb = 1,
216*01ce1d5dSWenzhen Yu .reg_cksys_2_srcclkena_mb = 1,
217*01ce1d5dSWenzhen Yu .reg_cksys_2_vcore_rmb = 1,
218*01ce1d5dSWenzhen Yu .reg_cksys_2_vrf18_rmb = 1,
219*01ce1d5dSWenzhen Yu .reg_conn_apsrc_rmb = 1,
220*01ce1d5dSWenzhen Yu .reg_conn_ddren_rmb = 0,
221*01ce1d5dSWenzhen Yu .reg_conn_emi_rmb = 1,
222*01ce1d5dSWenzhen Yu .reg_conn_infra_rmb = 1,
223*01ce1d5dSWenzhen Yu .reg_conn_pmic_rmb = 1,
224*01ce1d5dSWenzhen Yu .reg_conn_srcclkena_mb = 1,
225*01ce1d5dSWenzhen Yu .reg_conn_srcclkenb_mb = 1,
226*01ce1d5dSWenzhen Yu .reg_conn_vcore_rmb = 1,
227*01ce1d5dSWenzhen Yu .reg_conn_vrf18_rmb = 1,
228*01ce1d5dSWenzhen Yu .reg_corecfg_apsrc_rmb = 0,
229*01ce1d5dSWenzhen Yu .reg_corecfg_ddren_rmb = 0,
230*01ce1d5dSWenzhen Yu .reg_corecfg_emi_rmb = 0,
231*01ce1d5dSWenzhen Yu .reg_corecfg_infra_rmb = 0,
232*01ce1d5dSWenzhen Yu .reg_corecfg_pmic_rmb = 0,
233*01ce1d5dSWenzhen Yu .reg_corecfg_srcclkena_mb = 0,
234*01ce1d5dSWenzhen Yu .reg_corecfg_vcore_rmb = 0,
235*01ce1d5dSWenzhen Yu .reg_corecfg_vrf18_rmb = 0,
236*01ce1d5dSWenzhen Yu
237*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_7 */
238*01ce1d5dSWenzhen Yu .reg_cpueb_apsrc_rmb = 1,
239*01ce1d5dSWenzhen Yu .reg_cpueb_ddren_rmb = 0,
240*01ce1d5dSWenzhen Yu .reg_cpueb_emi_rmb = 1,
241*01ce1d5dSWenzhen Yu .reg_cpueb_infra_rmb = 1,
242*01ce1d5dSWenzhen Yu .reg_cpueb_pmic_rmb = 1,
243*01ce1d5dSWenzhen Yu .reg_cpueb_srcclkena_mb = 1,
244*01ce1d5dSWenzhen Yu .reg_cpueb_vcore_rmb = 0,
245*01ce1d5dSWenzhen Yu .reg_cpueb_vrf18_rmb = 1,
246*01ce1d5dSWenzhen Yu .reg_disp0_apsrc_rmb = 0,
247*01ce1d5dSWenzhen Yu .reg_disp0_ddren_rmb = 0,
248*01ce1d5dSWenzhen Yu .reg_disp0_emi_rmb = 0,
249*01ce1d5dSWenzhen Yu .reg_disp0_infra_rmb = 0,
250*01ce1d5dSWenzhen Yu .reg_disp0_pmic_rmb = 0,
251*01ce1d5dSWenzhen Yu .reg_disp0_srcclkena_mb = 0,
252*01ce1d5dSWenzhen Yu .reg_disp0_vrf18_rmb = 0,
253*01ce1d5dSWenzhen Yu .reg_disp1_apsrc_rmb = 0,
254*01ce1d5dSWenzhen Yu .reg_disp1_ddren_rmb = 0,
255*01ce1d5dSWenzhen Yu .reg_disp1_emi_rmb = 0,
256*01ce1d5dSWenzhen Yu .reg_disp1_infra_rmb = 0,
257*01ce1d5dSWenzhen Yu .reg_disp1_pmic_rmb = 0,
258*01ce1d5dSWenzhen Yu .reg_disp1_srcclkena_mb = 0,
259*01ce1d5dSWenzhen Yu .reg_disp1_vrf18_rmb = 0,
260*01ce1d5dSWenzhen Yu .reg_dpm_apsrc_rmb = 0xf,
261*01ce1d5dSWenzhen Yu .reg_dpm_ddren_rmb = 0xf,
262*01ce1d5dSWenzhen Yu
263*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_8 */
264*01ce1d5dSWenzhen Yu .reg_dpm_emi_rmb = 0xf,
265*01ce1d5dSWenzhen Yu .reg_dpm_infra_rmb = 0xf,
266*01ce1d5dSWenzhen Yu .reg_dpm_pmic_rmb = 0xf,
267*01ce1d5dSWenzhen Yu .reg_dpm_srcclkena_mb = 0xf,
268*01ce1d5dSWenzhen Yu .reg_dpm_vcore_rmb = 0xf,
269*01ce1d5dSWenzhen Yu .reg_dpm_vrf18_rmb = 0xf,
270*01ce1d5dSWenzhen Yu .reg_dpmaif_apsrc_rmb = 1,
271*01ce1d5dSWenzhen Yu .reg_dpmaif_ddren_rmb = 0,
272*01ce1d5dSWenzhen Yu .reg_dpmaif_emi_rmb = 1,
273*01ce1d5dSWenzhen Yu .reg_dpmaif_infra_rmb = 1,
274*01ce1d5dSWenzhen Yu .reg_dpmaif_pmic_rmb = 1,
275*01ce1d5dSWenzhen Yu .reg_dpmaif_srcclkena_mb = 1,
276*01ce1d5dSWenzhen Yu .reg_dpmaif_vcore_rmb = 1,
277*01ce1d5dSWenzhen Yu .reg_dpmaif_vrf18_rmb = 1,
278*01ce1d5dSWenzhen Yu
279*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_9 */
280*01ce1d5dSWenzhen Yu .reg_dvfsrc_level_rmb = 1,
281*01ce1d5dSWenzhen Yu .reg_emisys_apsrc_rmb = 0,
282*01ce1d5dSWenzhen Yu .reg_emisys_ddren_rmb = 0,
283*01ce1d5dSWenzhen Yu .reg_emisys_emi_rmb = 0,
284*01ce1d5dSWenzhen Yu .reg_emisys_infra_rmb = 0,
285*01ce1d5dSWenzhen Yu .reg_emisys_pmic_rmb = 0,
286*01ce1d5dSWenzhen Yu .reg_emisys_srcclkena_mb = 0,
287*01ce1d5dSWenzhen Yu .reg_emisys_vcore_rmb = 0,
288*01ce1d5dSWenzhen Yu .reg_emisys_vrf18_rmb = 0,
289*01ce1d5dSWenzhen Yu .reg_gce_apsrc_rmb = 0,
290*01ce1d5dSWenzhen Yu .reg_gce_ddren_rmb = 0,
291*01ce1d5dSWenzhen Yu .reg_gce_emi_rmb = 0,
292*01ce1d5dSWenzhen Yu .reg_gce_infra_rmb = 0,
293*01ce1d5dSWenzhen Yu .reg_gce_pmic_rmb = 0,
294*01ce1d5dSWenzhen Yu .reg_gce_srcclkena_mb = 0,
295*01ce1d5dSWenzhen Yu .reg_gce_vcore_rmb = 0,
296*01ce1d5dSWenzhen Yu .reg_gce_vrf18_rmb = 0,
297*01ce1d5dSWenzhen Yu .reg_gpueb_apsrc_rmb = 1,
298*01ce1d5dSWenzhen Yu .reg_gpueb_ddren_rmb = 0,
299*01ce1d5dSWenzhen Yu .reg_gpueb_emi_rmb = 1,
300*01ce1d5dSWenzhen Yu .reg_gpueb_infra_rmb = 1,
301*01ce1d5dSWenzhen Yu .reg_gpueb_pmic_rmb = 1,
302*01ce1d5dSWenzhen Yu .reg_gpueb_srcclkena_mb = 1,
303*01ce1d5dSWenzhen Yu .reg_gpueb_vcore_rmb = 1,
304*01ce1d5dSWenzhen Yu .reg_gpueb_vrf18_rmb = 1,
305*01ce1d5dSWenzhen Yu .reg_hwccf_apsrc_rmb = 1,
306*01ce1d5dSWenzhen Yu .reg_hwccf_ddren_rmb = 0,
307*01ce1d5dSWenzhen Yu .reg_hwccf_emi_rmb = 1,
308*01ce1d5dSWenzhen Yu .reg_hwccf_infra_rmb = 1,
309*01ce1d5dSWenzhen Yu .reg_hwccf_pmic_rmb = 1,
310*01ce1d5dSWenzhen Yu .reg_hwccf_srcclkena_mb = 1,
311*01ce1d5dSWenzhen Yu .reg_hwccf_vcore_rmb = 1,
312*01ce1d5dSWenzhen Yu
313*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_10 */
314*01ce1d5dSWenzhen Yu .reg_hwccf_vrf18_rmb = 1,
315*01ce1d5dSWenzhen Yu .reg_img_apsrc_rmb = 0,
316*01ce1d5dSWenzhen Yu .reg_img_ddren_rmb = 0,
317*01ce1d5dSWenzhen Yu .reg_img_emi_rmb = 0,
318*01ce1d5dSWenzhen Yu .reg_img_infra_rmb = 0,
319*01ce1d5dSWenzhen Yu .reg_img_pmic_rmb = 0,
320*01ce1d5dSWenzhen Yu .reg_img_srcclkena_mb = 0,
321*01ce1d5dSWenzhen Yu .reg_img_vrf18_rmb = 0,
322*01ce1d5dSWenzhen Yu .reg_infrasys_apsrc_rmb = 0,
323*01ce1d5dSWenzhen Yu .reg_infrasys_ddren_rmb = 0,
324*01ce1d5dSWenzhen Yu .reg_infrasys_emi_rmb = 0,
325*01ce1d5dSWenzhen Yu .reg_infrasys_infra_rmb = 0,
326*01ce1d5dSWenzhen Yu .reg_infrasys_pmic_rmb = 0,
327*01ce1d5dSWenzhen Yu .reg_infrasys_srcclkena_mb = 0,
328*01ce1d5dSWenzhen Yu .reg_infrasys_vcore_rmb = 0,
329*01ce1d5dSWenzhen Yu .reg_infrasys_vrf18_rmb = 0,
330*01ce1d5dSWenzhen Yu .reg_ipic_infra_rmb = 1,
331*01ce1d5dSWenzhen Yu .reg_ipic_vrf18_rmb = 1,
332*01ce1d5dSWenzhen Yu .reg_mcu_apsrc_rmb = 1,
333*01ce1d5dSWenzhen Yu .reg_mcu_ddren_rmb = 0,
334*01ce1d5dSWenzhen Yu .reg_mcu_emi_rmb = 1,
335*01ce1d5dSWenzhen Yu .reg_mcu_infra_rmb = 1,
336*01ce1d5dSWenzhen Yu .reg_mcu_pmic_rmb = 1,
337*01ce1d5dSWenzhen Yu .reg_mcu_srcclkena_mb = 1,
338*01ce1d5dSWenzhen Yu .reg_mcu_vcore_rmb = 0,
339*01ce1d5dSWenzhen Yu .reg_mcu_vrf18_rmb = 1,
340*01ce1d5dSWenzhen Yu .reg_md_apsrc_rmb = 1,
341*01ce1d5dSWenzhen Yu .reg_md_ddren_rmb = 0,
342*01ce1d5dSWenzhen Yu .reg_md_emi_rmb = 1,
343*01ce1d5dSWenzhen Yu .reg_md_infra_rmb = 1,
344*01ce1d5dSWenzhen Yu .reg_md_pmic_rmb = 1,
345*01ce1d5dSWenzhen Yu .reg_md_srcclkena_mb = 1,
346*01ce1d5dSWenzhen Yu
347*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_11 */
348*01ce1d5dSWenzhen Yu .reg_md_srcclkena1_mb = 1,
349*01ce1d5dSWenzhen Yu .reg_md_vcore_rmb = 1,
350*01ce1d5dSWenzhen Yu .reg_md_vrf18_rmb = 1,
351*01ce1d5dSWenzhen Yu .reg_mm_proc_apsrc_rmb = 1,
352*01ce1d5dSWenzhen Yu .reg_mm_proc_ddren_rmb = 0,
353*01ce1d5dSWenzhen Yu .reg_mm_proc_emi_rmb = 1,
354*01ce1d5dSWenzhen Yu .reg_mm_proc_infra_rmb = 1,
355*01ce1d5dSWenzhen Yu .reg_mm_proc_pmic_rmb = 1,
356*01ce1d5dSWenzhen Yu .reg_mm_proc_srcclkena_mb = 1,
357*01ce1d5dSWenzhen Yu .reg_mm_proc_vcore_rmb = 1,
358*01ce1d5dSWenzhen Yu .reg_mm_proc_vrf18_rmb = 1,
359*01ce1d5dSWenzhen Yu .reg_mml0_apsrc_rmb = 0,
360*01ce1d5dSWenzhen Yu .reg_mml0_ddren_rmb = 0,
361*01ce1d5dSWenzhen Yu .reg_mml0_emi_rmb = 0,
362*01ce1d5dSWenzhen Yu .reg_mml0_infra_rmb = 0,
363*01ce1d5dSWenzhen Yu .reg_mml0_pmic_rmb = 0,
364*01ce1d5dSWenzhen Yu .reg_mml0_srcclkena_mb = 0,
365*01ce1d5dSWenzhen Yu .reg_mml0_vrf18_rmb = 0,
366*01ce1d5dSWenzhen Yu .reg_mml1_apsrc_rmb = 0,
367*01ce1d5dSWenzhen Yu .reg_mml1_ddren_rmb = 0,
368*01ce1d5dSWenzhen Yu .reg_mml1_emi_rmb = 0,
369*01ce1d5dSWenzhen Yu .reg_mml1_infra_rmb = 0,
370*01ce1d5dSWenzhen Yu .reg_mml1_pmic_rmb = 0,
371*01ce1d5dSWenzhen Yu .reg_mml1_srcclkena_mb = 0,
372*01ce1d5dSWenzhen Yu .reg_mml1_vrf18_rmb = 0,
373*01ce1d5dSWenzhen Yu .reg_ovl0_apsrc_rmb = 0,
374*01ce1d5dSWenzhen Yu .reg_ovl0_ddren_rmb = 0,
375*01ce1d5dSWenzhen Yu .reg_ovl0_emi_rmb = 0,
376*01ce1d5dSWenzhen Yu .reg_ovl0_infra_rmb = 0,
377*01ce1d5dSWenzhen Yu .reg_ovl0_pmic_rmb = 0,
378*01ce1d5dSWenzhen Yu .reg_ovl0_srcclkena_mb = 0,
379*01ce1d5dSWenzhen Yu .reg_ovl0_vrf18_rmb = 0,
380*01ce1d5dSWenzhen Yu
381*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_12 */
382*01ce1d5dSWenzhen Yu .reg_ovl1_apsrc_rmb = 0,
383*01ce1d5dSWenzhen Yu .reg_ovl1_ddren_rmb = 0,
384*01ce1d5dSWenzhen Yu .reg_ovl1_emi_rmb = 0,
385*01ce1d5dSWenzhen Yu .reg_ovl1_infra_rmb = 0,
386*01ce1d5dSWenzhen Yu .reg_ovl1_pmic_rmb = 0,
387*01ce1d5dSWenzhen Yu .reg_ovl1_srcclkena_mb = 0,
388*01ce1d5dSWenzhen Yu .reg_ovl1_vrf18_rmb = 0,
389*01ce1d5dSWenzhen Yu .reg_pcie0_apsrc_rmb = 1,
390*01ce1d5dSWenzhen Yu .reg_pcie0_ddren_rmb = 0,
391*01ce1d5dSWenzhen Yu .reg_pcie0_emi_rmb = 1,
392*01ce1d5dSWenzhen Yu .reg_pcie0_infra_rmb = 1,
393*01ce1d5dSWenzhen Yu .reg_pcie0_pmic_rmb = 1,
394*01ce1d5dSWenzhen Yu .reg_pcie0_srcclkena_mb = 1,
395*01ce1d5dSWenzhen Yu .reg_pcie0_vcore_rmb = 1,
396*01ce1d5dSWenzhen Yu .reg_pcie0_vrf18_rmb = 1,
397*01ce1d5dSWenzhen Yu .reg_pcie1_apsrc_rmb = 1,
398*01ce1d5dSWenzhen Yu .reg_pcie1_ddren_rmb = 0,
399*01ce1d5dSWenzhen Yu .reg_pcie1_emi_rmb = 1,
400*01ce1d5dSWenzhen Yu .reg_pcie1_infra_rmb = 1,
401*01ce1d5dSWenzhen Yu .reg_pcie1_pmic_rmb = 1,
402*01ce1d5dSWenzhen Yu .reg_pcie1_srcclkena_mb = 1,
403*01ce1d5dSWenzhen Yu .reg_pcie1_vcore_rmb = 1,
404*01ce1d5dSWenzhen Yu .reg_pcie1_vrf18_rmb = 1,
405*01ce1d5dSWenzhen Yu .reg_perisys_apsrc_rmb = 1,
406*01ce1d5dSWenzhen Yu .reg_perisys_ddren_rmb = 0,
407*01ce1d5dSWenzhen Yu .reg_perisys_emi_rmb = 1,
408*01ce1d5dSWenzhen Yu .reg_perisys_infra_rmb = 1,
409*01ce1d5dSWenzhen Yu .reg_perisys_pmic_rmb = 1,
410*01ce1d5dSWenzhen Yu .reg_perisys_srcclkena_mb = 1,
411*01ce1d5dSWenzhen Yu .reg_perisys_vcore_rmb = 1,
412*01ce1d5dSWenzhen Yu .reg_perisys_vrf18_rmb = 1,
413*01ce1d5dSWenzhen Yu .reg_pmsr_apsrc_rmb = 1,
414*01ce1d5dSWenzhen Yu
415*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_13 */
416*01ce1d5dSWenzhen Yu .reg_pmsr_ddren_rmb = 0,
417*01ce1d5dSWenzhen Yu .reg_pmsr_emi_rmb = 1,
418*01ce1d5dSWenzhen Yu .reg_pmsr_infra_rmb = 1,
419*01ce1d5dSWenzhen Yu .reg_pmsr_pmic_rmb = 1,
420*01ce1d5dSWenzhen Yu .reg_pmsr_srcclkena_mb = 1,
421*01ce1d5dSWenzhen Yu .reg_pmsr_vcore_rmb = 1,
422*01ce1d5dSWenzhen Yu .reg_pmsr_vrf18_rmb = 1,
423*01ce1d5dSWenzhen Yu .reg_scp_apsrc_rmb = 1,
424*01ce1d5dSWenzhen Yu .reg_scp_ddren_rmb = 0,
425*01ce1d5dSWenzhen Yu .reg_scp_emi_rmb = 1,
426*01ce1d5dSWenzhen Yu .reg_scp_infra_rmb = 1,
427*01ce1d5dSWenzhen Yu .reg_scp_pmic_rmb = 1,
428*01ce1d5dSWenzhen Yu .reg_scp_srcclkena_mb = 1,
429*01ce1d5dSWenzhen Yu .reg_scp_vcore_rmb = 1,
430*01ce1d5dSWenzhen Yu .reg_scp_vrf18_rmb = 1,
431*01ce1d5dSWenzhen Yu .reg_spu_hwr_apsrc_rmb = 1,
432*01ce1d5dSWenzhen Yu .reg_spu_hwr_ddren_rmb = 0,
433*01ce1d5dSWenzhen Yu .reg_spu_hwr_emi_rmb = 1,
434*01ce1d5dSWenzhen Yu .reg_spu_hwr_infra_rmb = 1,
435*01ce1d5dSWenzhen Yu .reg_spu_hwr_pmic_rmb = 1,
436*01ce1d5dSWenzhen Yu .reg_spu_hwr_srcclkena_mb = 1,
437*01ce1d5dSWenzhen Yu .reg_spu_hwr_vcore_rmb = 1,
438*01ce1d5dSWenzhen Yu .reg_spu_hwr_vrf18_rmb = 1,
439*01ce1d5dSWenzhen Yu .reg_spu_ise_apsrc_rmb = 1,
440*01ce1d5dSWenzhen Yu .reg_spu_ise_ddren_rmb = 0,
441*01ce1d5dSWenzhen Yu .reg_spu_ise_emi_rmb = 1,
442*01ce1d5dSWenzhen Yu .reg_spu_ise_infra_rmb = 1,
443*01ce1d5dSWenzhen Yu .reg_spu_ise_pmic_rmb = 1,
444*01ce1d5dSWenzhen Yu .reg_spu_ise_srcclkena_mb = 1,
445*01ce1d5dSWenzhen Yu .reg_spu_ise_vcore_rmb = 1,
446*01ce1d5dSWenzhen Yu .reg_spu_ise_vrf18_rmb = 1,
447*01ce1d5dSWenzhen Yu
448*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_14 */
449*01ce1d5dSWenzhen Yu .reg_srcclkeni_infra_rmb = 0x3,
450*01ce1d5dSWenzhen Yu .reg_srcclkeni_pmic_rmb = 0x3,
451*01ce1d5dSWenzhen Yu .reg_srcclkeni_srcclkena_mb = 0x3,
452*01ce1d5dSWenzhen Yu .reg_srcclkeni_vcore_rmb = 0x3,
453*01ce1d5dSWenzhen Yu .reg_sspm_apsrc_rmb = 1,
454*01ce1d5dSWenzhen Yu .reg_sspm_ddren_rmb = 0,
455*01ce1d5dSWenzhen Yu .reg_sspm_emi_rmb = 1,
456*01ce1d5dSWenzhen Yu .reg_sspm_infra_rmb = 1,
457*01ce1d5dSWenzhen Yu .reg_sspm_pmic_rmb = 1,
458*01ce1d5dSWenzhen Yu .reg_sspm_srcclkena_mb = 1,
459*01ce1d5dSWenzhen Yu .reg_sspm_vrf18_rmb = 1,
460*01ce1d5dSWenzhen Yu .reg_ssrsys_apsrc_rmb = 1,
461*01ce1d5dSWenzhen Yu .reg_ssrsys_ddren_rmb = 0,
462*01ce1d5dSWenzhen Yu .reg_ssrsys_emi_rmb = 1,
463*01ce1d5dSWenzhen Yu .reg_ssrsys_infra_rmb = 1,
464*01ce1d5dSWenzhen Yu .reg_ssrsys_pmic_rmb = 1,
465*01ce1d5dSWenzhen Yu .reg_ssrsys_srcclkena_mb = 1,
466*01ce1d5dSWenzhen Yu .reg_ssrsys_vcore_rmb = 1,
467*01ce1d5dSWenzhen Yu .reg_ssrsys_vrf18_rmb = 1,
468*01ce1d5dSWenzhen Yu .reg_ssusb_apsrc_rmb = 1,
469*01ce1d5dSWenzhen Yu .reg_ssusb_ddren_rmb = 0,
470*01ce1d5dSWenzhen Yu .reg_ssusb_emi_rmb = 1,
471*01ce1d5dSWenzhen Yu .reg_ssusb_infra_rmb = 1,
472*01ce1d5dSWenzhen Yu .reg_ssusb_pmic_rmb = 1,
473*01ce1d5dSWenzhen Yu .reg_ssusb_srcclkena_mb = 1,
474*01ce1d5dSWenzhen Yu .reg_ssusb_vcore_rmb = 1,
475*01ce1d5dSWenzhen Yu .reg_ssusb_vrf18_rmb = 1,
476*01ce1d5dSWenzhen Yu .reg_uart_hub_infra_rmb = 1,
477*01ce1d5dSWenzhen Yu
478*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_15 */
479*01ce1d5dSWenzhen Yu .reg_uart_hub_pmic_rmb = 1,
480*01ce1d5dSWenzhen Yu .reg_uart_hub_srcclkena_mb = 1,
481*01ce1d5dSWenzhen Yu .reg_uart_hub_vcore_rmb = 1,
482*01ce1d5dSWenzhen Yu .reg_uart_hub_vrf18_rmb = 1,
483*01ce1d5dSWenzhen Yu .reg_ufs_apsrc_rmb = 1,
484*01ce1d5dSWenzhen Yu .reg_ufs_ddren_rmb = 0,
485*01ce1d5dSWenzhen Yu .reg_ufs_emi_rmb = 1,
486*01ce1d5dSWenzhen Yu .reg_ufs_infra_rmb = 1,
487*01ce1d5dSWenzhen Yu .reg_ufs_pmic_rmb = 1,
488*01ce1d5dSWenzhen Yu .reg_ufs_srcclkena_mb = 1,
489*01ce1d5dSWenzhen Yu .reg_ufs_vcore_rmb = 1,
490*01ce1d5dSWenzhen Yu .reg_ufs_vrf18_rmb = 1,
491*01ce1d5dSWenzhen Yu .reg_vdec_apsrc_rmb = 0,
492*01ce1d5dSWenzhen Yu .reg_vdec_ddren_rmb = 0,
493*01ce1d5dSWenzhen Yu .reg_vdec_emi_rmb = 0,
494*01ce1d5dSWenzhen Yu .reg_vdec_infra_rmb = 0,
495*01ce1d5dSWenzhen Yu .reg_vdec_pmic_rmb = 0,
496*01ce1d5dSWenzhen Yu .reg_vdec_srcclkena_mb = 0,
497*01ce1d5dSWenzhen Yu .reg_vdec_vrf18_rmb = 0,
498*01ce1d5dSWenzhen Yu .reg_venc_apsrc_rmb = 0,
499*01ce1d5dSWenzhen Yu .reg_venc_ddren_rmb = 0,
500*01ce1d5dSWenzhen Yu .reg_venc_emi_rmb = 0,
501*01ce1d5dSWenzhen Yu .reg_venc_infra_rmb = 0,
502*01ce1d5dSWenzhen Yu .reg_venc_pmic_rmb = 0,
503*01ce1d5dSWenzhen Yu .reg_venc_srcclkena_mb = 0,
504*01ce1d5dSWenzhen Yu .reg_venc_vrf18_rmb = 0,
505*01ce1d5dSWenzhen Yu .reg_vlpcfg_apsrc_rmb = 1,
506*01ce1d5dSWenzhen Yu .reg_vlpcfg_ddren_rmb = 0,
507*01ce1d5dSWenzhen Yu .reg_vlpcfg_emi_rmb = 1,
508*01ce1d5dSWenzhen Yu .reg_vlpcfg_infra_rmb = 1,
509*01ce1d5dSWenzhen Yu .reg_vlpcfg_pmic_rmb = 1,
510*01ce1d5dSWenzhen Yu .reg_vlpcfg_srcclkena_mb = 1,
511*01ce1d5dSWenzhen Yu
512*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_16 */
513*01ce1d5dSWenzhen Yu .reg_vlpcfg_vcore_rmb = 1,
514*01ce1d5dSWenzhen Yu .reg_vlpcfg_vrf18_rmb = 1,
515*01ce1d5dSWenzhen Yu .reg_vlpcfg1_apsrc_rmb = 1,
516*01ce1d5dSWenzhen Yu .reg_vlpcfg1_ddren_rmb = 0,
517*01ce1d5dSWenzhen Yu .reg_vlpcfg1_emi_rmb = 1,
518*01ce1d5dSWenzhen Yu .reg_vlpcfg1_infra_rmb = 1,
519*01ce1d5dSWenzhen Yu .reg_vlpcfg1_pmic_rmb = 0,
520*01ce1d5dSWenzhen Yu .reg_vlpcfg1_srcclkena_mb = 1,
521*01ce1d5dSWenzhen Yu .reg_vlpcfg1_vcore_rmb = 1,
522*01ce1d5dSWenzhen Yu .reg_vlpcfg1_vrf18_rmb = 1,
523*01ce1d5dSWenzhen Yu
524*01ce1d5dSWenzhen Yu /* SPM_EVENT_CON_MISC */
525*01ce1d5dSWenzhen Yu .reg_srcclken_fast_resp = 0,
526*01ce1d5dSWenzhen Yu .reg_csyspwrup_ack_mask = 1,
527*01ce1d5dSWenzhen Yu
528*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_17 */
529*01ce1d5dSWenzhen Yu .reg_spm_sw_vcore_rmb = 0x3,
530*01ce1d5dSWenzhen Yu .reg_spm_sw_pmic_rmb = 0,
531*01ce1d5dSWenzhen Yu
532*01ce1d5dSWenzhen Yu /* SPM_SRC_MASK_18 */
533*01ce1d5dSWenzhen Yu .reg_spm_sw_srcclkena_mb = 0,
534*01ce1d5dSWenzhen Yu
535*01ce1d5dSWenzhen Yu /* SPM_WAKE_MASK*/
536*01ce1d5dSWenzhen Yu .reg_wake_mask = 0x81322012,
537*01ce1d5dSWenzhen Yu
538*01ce1d5dSWenzhen Yu /* SPM_WAKEUP_EVENT_EXT_MASK */
539*01ce1d5dSWenzhen Yu .reg_ext_wake_mask = 0xFFFFFFFF,
540*01ce1d5dSWenzhen Yu
541*01ce1d5dSWenzhen Yu /*SW flag setting */
542*01ce1d5dSWenzhen Yu .pcm_flags = SPM_SUSPEND_PCM_FLAG,
543*01ce1d5dSWenzhen Yu .pcm_flags1 = SPM_SUSPEND_PCM_FLAG1,
544*01ce1d5dSWenzhen Yu };
545*01ce1d5dSWenzhen Yu
546*01ce1d5dSWenzhen Yu static struct suspend_dbg_ctrl suspend_spm_dbg_ext = {
547*01ce1d5dSWenzhen Yu .sleep_suspend_cnt = 0,
548*01ce1d5dSWenzhen Yu };
549*01ce1d5dSWenzhen Yu
550*01ce1d5dSWenzhen Yu static struct dbg_ctrl suspend_spm_dbg = {
551*01ce1d5dSWenzhen Yu .count = 0,
552*01ce1d5dSWenzhen Yu .duration = 0,
553*01ce1d5dSWenzhen Yu .ext = &suspend_spm_dbg_ext,
554*01ce1d5dSWenzhen Yu };
555*01ce1d5dSWenzhen Yu
556*01ce1d5dSWenzhen Yu static struct spm_lp_stat suspend_lp_stat;
557*01ce1d5dSWenzhen Yu
558*01ce1d5dSWenzhen Yu struct spm_lp_scen __spm_suspend = {
559*01ce1d5dSWenzhen Yu .pwrctrl = &suspend_ctrl,
560*01ce1d5dSWenzhen Yu .dbgctrl = &suspend_spm_dbg,
561*01ce1d5dSWenzhen Yu .lpstat = &suspend_lp_stat,
562*01ce1d5dSWenzhen Yu };
563*01ce1d5dSWenzhen Yu
564*01ce1d5dSWenzhen Yu static uint8_t bak_spm_vcore_req;
565*01ce1d5dSWenzhen Yu
mt_spm_suspend_mode_set(enum mt_spm_suspend_mode mode,void * prv)566*01ce1d5dSWenzhen Yu int mt_spm_suspend_mode_set(enum mt_spm_suspend_mode mode, void *prv)
567*01ce1d5dSWenzhen Yu {
568*01ce1d5dSWenzhen Yu
569*01ce1d5dSWenzhen Yu if (mode == MT_SPM_SUSPEND_SLEEP) {
570*01ce1d5dSWenzhen Yu suspend_ctrl.pcm_flags = SPM_SUSPEND_SLEEP_PCM_FLAG;
571*01ce1d5dSWenzhen Yu suspend_ctrl.pcm_flags1 = SPM_SUSPEND_SLEEP_PCM_FLAG1;
572*01ce1d5dSWenzhen Yu suspend_ctrl.reg_spm_vcore_req = 1;
573*01ce1d5dSWenzhen Yu } else {
574*01ce1d5dSWenzhen Yu suspend_ctrl.pcm_flags = SPM_SUSPEND_PCM_FLAG;
575*01ce1d5dSWenzhen Yu suspend_ctrl.pcm_flags1 = SPM_SUSPEND_PCM_FLAG1;
576*01ce1d5dSWenzhen Yu }
577*01ce1d5dSWenzhen Yu
578*01ce1d5dSWenzhen Yu return 0;
579*01ce1d5dSWenzhen Yu }
580*01ce1d5dSWenzhen Yu
spm_CSOPLU_ctrl_leave_suspend(void)581*01ce1d5dSWenzhen Yu static void spm_CSOPLU_ctrl_leave_suspend(void)
582*01ce1d5dSWenzhen Yu {
583*01ce1d5dSWenzhen Yu mmio_setbits_32(SPM_RSV_CSOPLU_REQ, (0x1));
584*01ce1d5dSWenzhen Yu }
585*01ce1d5dSWenzhen Yu
mt_spm_suspend_ec_pin(void)586*01ce1d5dSWenzhen Yu static void mt_spm_suspend_ec_pin(void)
587*01ce1d5dSWenzhen Yu {
588*01ce1d5dSWenzhen Yu gpio_bk1 = mmio_read_32(MODE_BACKUP_REG);
589*01ce1d5dSWenzhen Yu gpio_bk2 = mmio_read_32(DIR_BACKUP_REG);
590*01ce1d5dSWenzhen Yu gpio_bk3 = mmio_read_32(DOUT_BACKUP_REG);
591*01ce1d5dSWenzhen Yu
592*01ce1d5dSWenzhen Yu mmio_write_32(MODE_SET, SET_GPIO_MODE);
593*01ce1d5dSWenzhen Yu gpio_set_direction(EC_SUSPEND_BK_PIN, GPIO_DIR_OUT);
594*01ce1d5dSWenzhen Yu /* GPIO111 LOW */
595*01ce1d5dSWenzhen Yu gpio_set_value(EC_SUSPEND_BK_PIN, GPIO_LEVEL_LOW);
596*01ce1d5dSWenzhen Yu /* GPIO38 LOW */
597*01ce1d5dSWenzhen Yu gpio_set_value(EC_SUSPEND_PIN, GPIO_LEVEL_LOW);
598*01ce1d5dSWenzhen Yu }
599*01ce1d5dSWenzhen Yu
mt_spm_resume_ec_pin(void)600*01ce1d5dSWenzhen Yu static void mt_spm_resume_ec_pin(void)
601*01ce1d5dSWenzhen Yu {
602*01ce1d5dSWenzhen Yu /* GPIO38 HIGH */
603*01ce1d5dSWenzhen Yu gpio_set_value(EC_SUSPEND_PIN, GPIO_LEVEL_HIGH);
604*01ce1d5dSWenzhen Yu /* GPIO111 HIGH */
605*01ce1d5dSWenzhen Yu gpio_set_value(EC_SUSPEND_BK_PIN, GPIO_LEVEL_HIGH);
606*01ce1d5dSWenzhen Yu udelay(10);
607*01ce1d5dSWenzhen Yu
608*01ce1d5dSWenzhen Yu mmio_write_32(MODE_BACKUP_REG, gpio_bk1);
609*01ce1d5dSWenzhen Yu mmio_write_32(DIR_BACKUP_REG, gpio_bk2);
610*01ce1d5dSWenzhen Yu mmio_write_32(DOUT_BACKUP_REG, gpio_bk3);
611*01ce1d5dSWenzhen Yu }
612*01ce1d5dSWenzhen Yu
mt_spm_suspend_enter(int state_id,uint32_t ext_opand,uint32_t resource_req)613*01ce1d5dSWenzhen Yu int mt_spm_suspend_enter(int state_id,
614*01ce1d5dSWenzhen Yu uint32_t ext_opand, uint32_t resource_req)
615*01ce1d5dSWenzhen Yu {
616*01ce1d5dSWenzhen Yu int ret = 0;
617*01ce1d5dSWenzhen Yu
618*01ce1d5dSWenzhen Yu bak_spm_vcore_req = suspend_ctrl.reg_spm_vcore_req;
619*01ce1d5dSWenzhen Yu
620*01ce1d5dSWenzhen Yu /* if FMAudio, ADSP, USB headset is active, change to sleep mode */
621*01ce1d5dSWenzhen Yu if (ext_opand & MT_SPM_EX_OP_SET_SUSPEND_MODE)
622*01ce1d5dSWenzhen Yu mt_spm_suspend_mode_set(MT_SPM_SUSPEND_SLEEP,
623*01ce1d5dSWenzhen Yu &resource_req);
624*01ce1d5dSWenzhen Yu else
625*01ce1d5dSWenzhen Yu mt_spm_suspend_mode_set(MT_SPM_SUSPEND_SYSTEM_PDN,
626*01ce1d5dSWenzhen Yu &resource_req);
627*01ce1d5dSWenzhen Yu
628*01ce1d5dSWenzhen Yu mmio_write_32(SPM2SW_MAILBOX_0, 0x1);
629*01ce1d5dSWenzhen Yu
630*01ce1d5dSWenzhen Yu ext_opand |= MT_SPM_EX_OP_DEVICES_SAVE;
631*01ce1d5dSWenzhen Yu
632*01ce1d5dSWenzhen Yu #if defined(CONFIG_MTK_VCOREDVFS_SUPPORT)
633*01ce1d5dSWenzhen Yu /* Notify vcoredvfs suspend enter */
634*01ce1d5dSWenzhen Yu spm_vcorefs_plat_suspend();
635*01ce1d5dSWenzhen Yu #endif
636*01ce1d5dSWenzhen Yu
637*01ce1d5dSWenzhen Yu ret = spm_conservation(state_id, ext_opand,
638*01ce1d5dSWenzhen Yu &__spm_suspend, resource_req);
639*01ce1d5dSWenzhen Yu if (ret == 0) {
640*01ce1d5dSWenzhen Yu struct mt_lp_publish_event event = {
641*01ce1d5dSWenzhen Yu .id = MT_LPM_PUBEVENTS_SYS_POWER_OFF,
642*01ce1d5dSWenzhen Yu .val.u32 = 0,
643*01ce1d5dSWenzhen Yu .level = MT_LP_SYSPOWER_LEVEL_SUSPEND,
644*01ce1d5dSWenzhen Yu };
645*01ce1d5dSWenzhen Yu
646*01ce1d5dSWenzhen Yu MT_LP_SUSPEND_PUBLISH_EVENT(&event);
647*01ce1d5dSWenzhen Yu }
648*01ce1d5dSWenzhen Yu
649*01ce1d5dSWenzhen Yu mt_spm_suspend_ec_pin();
650*01ce1d5dSWenzhen Yu
651*01ce1d5dSWenzhen Yu return ret;
652*01ce1d5dSWenzhen Yu }
653*01ce1d5dSWenzhen Yu
mt_spm_suspend_resume(int state_id,uint32_t ext_opand,struct wake_status ** status)654*01ce1d5dSWenzhen Yu void mt_spm_suspend_resume(int state_id, uint32_t ext_opand,
655*01ce1d5dSWenzhen Yu struct wake_status **status)
656*01ce1d5dSWenzhen Yu {
657*01ce1d5dSWenzhen Yu struct mt_lp_publish_event event;
658*01ce1d5dSWenzhen Yu struct wake_status *st = NULL;
659*01ce1d5dSWenzhen Yu
660*01ce1d5dSWenzhen Yu ext_opand |= MT_SPM_EX_OP_DEVICES_SAVE;
661*01ce1d5dSWenzhen Yu
662*01ce1d5dSWenzhen Yu mt_spm_resume_ec_pin();
663*01ce1d5dSWenzhen Yu spm_conservation_finish(state_id, ext_opand, &__spm_suspend, &st);
664*01ce1d5dSWenzhen Yu
665*01ce1d5dSWenzhen Yu spm_CSOPLU_ctrl_leave_suspend();
666*01ce1d5dSWenzhen Yu
667*01ce1d5dSWenzhen Yu mt_spm_update_lp_stat(&suspend_lp_stat);
668*01ce1d5dSWenzhen Yu #if defined(CONFIG_MTK_VCOREDVFS_SUPPORT)
669*01ce1d5dSWenzhen Yu /* Notify vcoredvfs suspend enter */
670*01ce1d5dSWenzhen Yu spm_vcorefs_plat_resume();
671*01ce1d5dSWenzhen Yu mmio_write_32(SPM2SW_MAILBOX_0, 0x0);
672*01ce1d5dSWenzhen Yu #endif
673*01ce1d5dSWenzhen Yu
674*01ce1d5dSWenzhen Yu /*****************************************
675*01ce1d5dSWenzhen Yu * If FMAudio, ADSP, USB headset is active,
676*01ce1d5dSWenzhen Yu * change back to suspend mode and counting in resume
677*01ce1d5dSWenzhen Yu *****************************************/
678*01ce1d5dSWenzhen Yu
679*01ce1d5dSWenzhen Yu if (ext_opand & MT_SPM_EX_OP_SET_SUSPEND_MODE) {
680*01ce1d5dSWenzhen Yu mt_spm_suspend_mode_set(MT_SPM_SUSPEND_SYSTEM_PDN, NULL);
681*01ce1d5dSWenzhen Yu suspend_spm_dbg_ext.sleep_suspend_cnt += 1;
682*01ce1d5dSWenzhen Yu }
683*01ce1d5dSWenzhen Yu
684*01ce1d5dSWenzhen Yu suspend_ctrl.reg_spm_vcore_req = bak_spm_vcore_req;
685*01ce1d5dSWenzhen Yu
686*01ce1d5dSWenzhen Yu suspend_spm_dbg.count += 1;
687*01ce1d5dSWenzhen Yu event.id = MT_LPM_PUBEVENTS_SYS_POWER_ON;
688*01ce1d5dSWenzhen Yu event.val.u32 = 0;
689*01ce1d5dSWenzhen Yu event.level = MT_LP_SYSPOWER_LEVEL_SUSPEND;
690*01ce1d5dSWenzhen Yu
691*01ce1d5dSWenzhen Yu if (st) {
692*01ce1d5dSWenzhen Yu if (st->tr.comm.r12 & R12_AP2AP_PEER_WAKEUP_B)
693*01ce1d5dSWenzhen Yu event.val.u32 = MT_LPM_WAKE_MD_WAKEUP_DPMAIF;
694*01ce1d5dSWenzhen Yu if (st->tr.comm.r12 & R12_CCIF0_EVENT_B)
695*01ce1d5dSWenzhen Yu event.val.u32 = MT_LPM_WAKE_MD_WAKEUP_CCIF0;
696*01ce1d5dSWenzhen Yu if (st->tr.comm.r12 & R12_CCIF1_EVENT_B)
697*01ce1d5dSWenzhen Yu event.val.u32 = MT_LPM_WAKE_MD_WAKEUP_CCIF1;
698*01ce1d5dSWenzhen Yu }
699*01ce1d5dSWenzhen Yu if (status)
700*01ce1d5dSWenzhen Yu *status = st;
701*01ce1d5dSWenzhen Yu MT_LP_SUSPEND_PUBLISH_EVENT(&event);
702*01ce1d5dSWenzhen Yu }
703*01ce1d5dSWenzhen Yu
mt_spm_suspend_get_spm_lp(struct spm_lp_scen ** lp)704*01ce1d5dSWenzhen Yu int mt_spm_suspend_get_spm_lp(struct spm_lp_scen **lp)
705*01ce1d5dSWenzhen Yu {
706*01ce1d5dSWenzhen Yu if (!lp)
707*01ce1d5dSWenzhen Yu return -1;
708*01ce1d5dSWenzhen Yu
709*01ce1d5dSWenzhen Yu *lp = &__spm_suspend;
710*01ce1d5dSWenzhen Yu return 0;
711*01ce1d5dSWenzhen Yu }
712