xref: /rk3399_ARM-atf/plat/mediatek/drivers/spm/mt8189/mt_spm_suspend.c (revision c0047dec92fb161a60074938793d59491987f476)
1083cfadbSKun Lu /*
2083cfadbSKun Lu  * Copyright (c) 2025, Mediatek Inc. All rights reserved.
3083cfadbSKun Lu  *
4083cfadbSKun Lu  * SPDX-License-Identifier: BSD-3-Clause
5083cfadbSKun Lu  */
6083cfadbSKun Lu 
7083cfadbSKun Lu #include <stdint.h>
8083cfadbSKun Lu #include <stdio.h>
9083cfadbSKun Lu 
10083cfadbSKun Lu #include <common/debug.h>
11ed11c2ffSKun Lu #include <drivers/gpio.h>
12083cfadbSKun Lu #include <lib/mmio.h>
13083cfadbSKun Lu 
14083cfadbSKun Lu #include <constraints/mt_spm_rc_internal.h>
15083cfadbSKun Lu #include <drivers/spm/mt_spm_resource_req.h>
16083cfadbSKun Lu #include <lib/pm/mtk_pm.h>
17083cfadbSKun Lu #include <lpm_v2/mt_lp_api.h>
18083cfadbSKun Lu #include <lpm_v2/mt_lp_rqm.h>
19083cfadbSKun Lu #include <mt_spm.h>
20083cfadbSKun Lu #include <mt_spm_conservation.h>
21083cfadbSKun Lu #include <mt_spm_internal.h>
22083cfadbSKun Lu #include <mt_spm_reg.h>
23083cfadbSKun Lu #include <mt_spm_stats.h>
24083cfadbSKun Lu #include <mt_spm_suspend.h>
25083cfadbSKun Lu #if defined(CONFIG_MTK_VCOREDVFS_SUPPORT)
26083cfadbSKun Lu #include <mt_spm_vcorefs_exp.h>
27083cfadbSKun Lu #endif
28083cfadbSKun Lu 
29083cfadbSKun Lu #define SPM_SUSPEND_SLEEP_PCM_FLAG                                  \
30083cfadbSKun Lu 	(SPM_FLAG_DISABLE_INFRA_PDN | SPM_FLAG_DISABLE_DPM_PDN |    \
31083cfadbSKun Lu 	 SPM_FLAG_DISABLE_MCUPM_PDN | SPM_FLAG_DISABLE_VCORE_DVS |  \
32083cfadbSKun Lu 	 SPM_FLAG_DISABLE_DDR_DFS | SPM_FLAG_DISABLE_EMI_DFS |      \
33083cfadbSKun Lu 	 SPM_FLAG_DISABLE_BUS_DFS | SPM_FLAG_KEEP_CSYSPWRACK_HIGH | \
34083cfadbSKun Lu 	 SPM_FLAG_SRAM_SLEEP_CTRL)
35083cfadbSKun Lu 
36083cfadbSKun Lu #define SPM_SUSPEND_SLEEP_PCM_FLAG1 (SPM_FLAG1_ENABLE_VS2_VS3_VOTER)
37083cfadbSKun Lu 
38083cfadbSKun Lu #define SPM_SUSPEND_PCM_FLAG                                     \
39083cfadbSKun Lu 	(SPM_FLAG_DISABLE_VCORE_DVS | SPM_FLAG_DISABLE_DDR_DFS | \
40083cfadbSKun Lu 	 SPM_FLAG_DISABLE_EMI_DFS | SPM_FLAG_DISABLE_BUS_DFS |   \
41083cfadbSKun Lu 	 SPM_FLAG_SRAM_SLEEP_CTRL)
42083cfadbSKun Lu 
43*32896781SKun Lu #define SPM_SUSPEND_PCM_FLAG1                                           \
44*32896781SKun Lu 	(SPM_FLAG1_ENABLE_VS2_VS3_VOTER	| SPM_FLAG1_DISABLE_PERI_OFF |  \
45*32896781SKun Lu 	 SPM_FLAG1_ENABLE_MCU_INFRA_PARITY)
46083cfadbSKun Lu 
47083cfadbSKun Lu /* Suspend spm power control */
48083cfadbSKun Lu #define __WAKE_SRC_FOR_SUSPEND_COMMON__                                        \
49083cfadbSKun Lu 	((R12_PCM_TIMER_B) | (R12_KP_IRQ_B) | (R12_CONN2AP_WAKEUP_B) |         \
50083cfadbSKun Lu 	 (R12_EINT_EVENT_B) | (R12_CONN_WDT_IRQ_B) | (R12_SSPM2SPM_WAKEUP_B) | \
51083cfadbSKun Lu 	 (R12_SCP2SPM_WAKEUP_B) | (R12_VADSP2SPM_WAKEUP_B) |                   \
52083cfadbSKun Lu 	 (R12_USB0_CDSC_B) | (R12_USB0_POWERDWN_B) | (R12_SBD_INTR_B) |        \
53083cfadbSKun Lu 	 (R12_UART2SPM_IRQ_B) | (R12_SYS_TIMER_EVENT_B) |                      \
54083cfadbSKun Lu 	 (R12_EINT_EVENT_SECURE_B) | (R12_SYS_CIRQ_IRQ_B) | (R12_CPU_WAKEUP) | \
55083cfadbSKun Lu 	 (R12_APUSYS_WAKE_HOST_B) | (R12_PCIE_MAC_IRQ_WAKE_B) |                \
56083cfadbSKun Lu 	 (R12_MSDC_WAKEUP_EVENT_B))
57083cfadbSKun Lu 
58083cfadbSKun Lu #if defined(CFG_MICROTRUST_TEE_SUPPORT)
59083cfadbSKun Lu #define WAKE_SRC_FOR_SUSPEND (__WAKE_SRC_FOR_SUSPEND_COMMON__)
60083cfadbSKun Lu #else
61083cfadbSKun Lu #define WAKE_SRC_FOR_SUSPEND (__WAKE_SRC_FOR_SUSPEND_COMMON__ | R12_SEJ_B)
62083cfadbSKun Lu #endif
63083cfadbSKun Lu 
64083cfadbSKun Lu static struct pwr_ctrl suspend_ctrl = {
65083cfadbSKun Lu 	.wake_src = WAKE_SRC_FOR_SUSPEND,
66083cfadbSKun Lu 
67083cfadbSKun Lu 	/* Auto-gen Start */
68083cfadbSKun Lu 
69083cfadbSKun Lu 	/* SPM_SRC_REQ */
70083cfadbSKun Lu 	.reg_spm_adsp_mailbox_req = 0,
71083cfadbSKun Lu 	.reg_spm_apsrc_req = 0,
72083cfadbSKun Lu 	.reg_spm_ddren_req = 0,
73083cfadbSKun Lu 	.reg_spm_dvfs_req = 0,
74083cfadbSKun Lu 	.reg_spm_emi_req = 0,
75083cfadbSKun Lu 	.reg_spm_f26m_req = 0,
76083cfadbSKun Lu 	.reg_spm_infra_req = 0,
77083cfadbSKun Lu 	.reg_spm_pmic_req = 0,
78083cfadbSKun Lu 	.reg_spm_scp_mailbox_req = 0,
79083cfadbSKun Lu 	.reg_spm_sspm_mailbox_req = 0,
80083cfadbSKun Lu 	.reg_spm_sw_mailbox_req = 0,
81*32896781SKun Lu 	.reg_spm_vcore_req = 1,
82083cfadbSKun Lu 	.reg_spm_vrf18_req = 0,
83083cfadbSKun Lu 	.adsp_mailbox_state = 0,
84083cfadbSKun Lu 	.apsrc_state = 0,
85083cfadbSKun Lu 	.ddren_state = 0,
86083cfadbSKun Lu 	.dvfs_state = 0,
87083cfadbSKun Lu 	.emi_state = 0,
88083cfadbSKun Lu 	.f26m_state = 0,
89083cfadbSKun Lu 	.infra_state = 0,
90083cfadbSKun Lu 	.pmic_state = 0,
91083cfadbSKun Lu 	.scp_mailbox_state = 0,
92083cfadbSKun Lu 	.sspm_mailbox_state = 0,
93083cfadbSKun Lu 	.sw_mailbox_state = 0,
94083cfadbSKun Lu 	.vcore_state = 0,
95083cfadbSKun Lu 	.vrf18_state = 0,
96083cfadbSKun Lu 
97083cfadbSKun Lu 	/* SPM_SRC_MASK_0 */
98083cfadbSKun Lu 	.reg_apu_apsrc_req_mask_b = 0x1,
99083cfadbSKun Lu 	.reg_apu_ddren_req_mask_b = 0x1,
100083cfadbSKun Lu 	.reg_apu_emi_req_mask_b = 0x1,
101083cfadbSKun Lu 	.reg_apu_infra_req_mask_b = 0x1,
102083cfadbSKun Lu 	.reg_apu_pmic_req_mask_b = 0x1,
103083cfadbSKun Lu 	.reg_apu_srcclkena_mask_b = 0x1,
104083cfadbSKun Lu 	.reg_apu_vrf18_req_mask_b = 0x1,
105083cfadbSKun Lu 	.reg_audio_dsp_apsrc_req_mask_b = 0x0,
106083cfadbSKun Lu 	.reg_audio_dsp_ddren_req_mask_b = 0x0,
107083cfadbSKun Lu 	.reg_audio_dsp_emi_req_mask_b = 0x0,
108083cfadbSKun Lu 	.reg_audio_dsp_infra_req_mask_b = 0x0,
109083cfadbSKun Lu 	.reg_audio_dsp_pmic_req_mask_b = 0x0,
110083cfadbSKun Lu 	.reg_audio_dsp_srcclkena_mask_b = 0x0,
111083cfadbSKun Lu 	.reg_audio_dsp_vcore_req_mask_b = 0x0,
112083cfadbSKun Lu 	.reg_audio_dsp_vrf18_req_mask_b = 0x0,
113083cfadbSKun Lu 	.reg_cam_apsrc_req_mask_b = 0x1,
114083cfadbSKun Lu 	.reg_cam_ddren_req_mask_b = 0x1,
115083cfadbSKun Lu 	.reg_cam_emi_req_mask_b = 0x1,
116083cfadbSKun Lu 	.reg_cam_infra_req_mask_b = 0x0,
117083cfadbSKun Lu 	.reg_cam_pmic_req_mask_b = 0x0,
118083cfadbSKun Lu 	.reg_cam_srcclkena_mask_b = 0x0,
119083cfadbSKun Lu 	.reg_cam_vrf18_req_mask_b = 0x0,
120083cfadbSKun Lu 	.reg_mdp_emi_req_mask_b = 0x1,
121083cfadbSKun Lu 
122083cfadbSKun Lu 	/* SPM_SRC_MASK_1 */
123083cfadbSKun Lu 	.reg_ccif_apsrc_req_mask_b = 0x0,
124083cfadbSKun Lu 	.reg_ccif_emi_req_mask_b = 0xfff,
125083cfadbSKun Lu 
126083cfadbSKun Lu 	/* SPM_SRC_MASK_2 */
127083cfadbSKun Lu 	.reg_ccif_infra_req_mask_b = 0x0,
128083cfadbSKun Lu 	.reg_ccif_pmic_req_mask_b = 0xfff,
129083cfadbSKun Lu 
130083cfadbSKun Lu 	/* SPM_SRC_MASK_3 */
131083cfadbSKun Lu 	.reg_ccif_srcclkena_mask_b = 0x0,
132083cfadbSKun Lu 	.reg_ccif_vrf18_req_mask_b = 0xfff,
133083cfadbSKun Lu 	.reg_ccu_apsrc_req_mask_b = 0x0,
134083cfadbSKun Lu 	.reg_ccu_ddren_req_mask_b = 0x0,
135083cfadbSKun Lu 	.reg_ccu_emi_req_mask_b = 0x0,
136083cfadbSKun Lu 	.reg_ccu_infra_req_mask_b = 0x0,
137083cfadbSKun Lu 	.reg_ccu_pmic_req_mask_b = 0x0,
138083cfadbSKun Lu 	.reg_ccu_srcclkena_mask_b = 0x0,
139083cfadbSKun Lu 	.reg_ccu_vrf18_req_mask_b = 0x0,
140083cfadbSKun Lu 	.reg_cg_check_apsrc_req_mask_b = 0x1,
141083cfadbSKun Lu 
142083cfadbSKun Lu 	/* SPM_SRC_MASK_4 */
143083cfadbSKun Lu 	.reg_cg_check_ddren_req_mask_b = 0x1,
144083cfadbSKun Lu 	.reg_cg_check_emi_req_mask_b = 0x1,
145*32896781SKun Lu 	.reg_cg_check_infra_req_mask_b = 0x0,
146*32896781SKun Lu 	.reg_cg_check_pmic_req_mask_b = 0x0,
147*32896781SKun Lu 	.reg_cg_check_srcclkena_mask_b = 0x0,
148083cfadbSKun Lu 	.reg_cg_check_vcore_req_mask_b = 0x1,
149*32896781SKun Lu 	.reg_cg_check_vrf18_req_mask_b = 0x0,
150083cfadbSKun Lu 	.reg_conn_apsrc_req_mask_b = 0x1,
151083cfadbSKun Lu 	.reg_conn_ddren_req_mask_b = 0x1,
152083cfadbSKun Lu 	.reg_conn_emi_req_mask_b = 0x1,
153083cfadbSKun Lu 	.reg_conn_infra_req_mask_b = 0x1,
154083cfadbSKun Lu 	.reg_conn_pmic_req_mask_b = 0x1,
155083cfadbSKun Lu 	.reg_conn_srcclkena_mask_b = 0x1,
156083cfadbSKun Lu 	.reg_conn_srcclkenb_mask_b = 0x1,
157083cfadbSKun Lu 	.reg_conn_vcore_req_mask_b = 0x1,
158083cfadbSKun Lu 	.reg_conn_vrf18_req_mask_b = 0x1,
159083cfadbSKun Lu 	.reg_cpueb_apsrc_req_mask_b = 0x1,
160083cfadbSKun Lu 	.reg_cpueb_ddren_req_mask_b = 0x1,
161083cfadbSKun Lu 	.reg_cpueb_emi_req_mask_b = 0x1,
162083cfadbSKun Lu 	.reg_cpueb_infra_req_mask_b = 0x1,
163083cfadbSKun Lu 	.reg_cpueb_pmic_req_mask_b = 0x1,
164083cfadbSKun Lu 	.reg_cpueb_srcclkena_mask_b = 0x1,
165083cfadbSKun Lu 	.reg_cpueb_vrf18_req_mask_b = 0x1,
166083cfadbSKun Lu 	.reg_disp0_apsrc_req_mask_b = 0x1,
167083cfadbSKun Lu 	.reg_disp0_ddren_req_mask_b = 0x1,
168083cfadbSKun Lu 	.reg_disp0_emi_req_mask_b = 0x1,
169083cfadbSKun Lu 	.reg_disp0_infra_req_mask_b = 0x1,
170083cfadbSKun Lu 	.reg_disp0_pmic_req_mask_b = 0x0,
171083cfadbSKun Lu 	.reg_disp0_srcclkena_mask_b = 0x0,
172083cfadbSKun Lu 	.reg_disp0_vrf18_req_mask_b = 0x1,
173083cfadbSKun Lu 	.reg_disp1_apsrc_req_mask_b = 0x0,
174083cfadbSKun Lu 	.reg_disp1_ddren_req_mask_b = 0x0,
175083cfadbSKun Lu 
176083cfadbSKun Lu 	/* SPM_SRC_MASK_5 */
177083cfadbSKun Lu 	.reg_disp1_emi_req_mask_b = 0x0,
178083cfadbSKun Lu 	.reg_disp1_infra_req_mask_b = 0x0,
179083cfadbSKun Lu 	.reg_disp1_pmic_req_mask_b = 0x0,
180083cfadbSKun Lu 	.reg_disp1_srcclkena_mask_b = 0x0,
181083cfadbSKun Lu 	.reg_disp1_vrf18_req_mask_b = 0x0,
182083cfadbSKun Lu 	.reg_dpm_apsrc_req_mask_b = 0xf,
183083cfadbSKun Lu 	.reg_dpm_ddren_req_mask_b = 0xf,
184083cfadbSKun Lu 	.reg_dpm_emi_req_mask_b = 0xf,
185083cfadbSKun Lu 	.reg_dpm_infra_req_mask_b = 0xf,
186083cfadbSKun Lu 	.reg_dpm_pmic_req_mask_b = 0xf,
187083cfadbSKun Lu 	.reg_dpm_srcclkena_mask_b = 0xf,
188083cfadbSKun Lu 
189083cfadbSKun Lu 	/* SPM_SRC_MASK_6 */
190083cfadbSKun Lu 	.reg_dpm_vcore_req_mask_b = 0xf,
191083cfadbSKun Lu 	.reg_dpm_vrf18_req_mask_b = 0xf,
192083cfadbSKun Lu 	.reg_dpmaif_apsrc_req_mask_b = 0x1,
193083cfadbSKun Lu 	.reg_dpmaif_ddren_req_mask_b = 0x1,
194083cfadbSKun Lu 	.reg_dpmaif_emi_req_mask_b = 0x1,
195083cfadbSKun Lu 	.reg_dpmaif_infra_req_mask_b = 0x1,
196083cfadbSKun Lu 	.reg_dpmaif_pmic_req_mask_b = 0x1,
197083cfadbSKun Lu 	.reg_dpmaif_srcclkena_mask_b = 0x1,
198083cfadbSKun Lu 	.reg_dpmaif_vrf18_req_mask_b = 0x1,
199083cfadbSKun Lu 	.reg_dvfsrc_level_req_mask_b = 0x1,
200083cfadbSKun Lu 	.reg_emisys_apsrc_req_mask_b = 0x0,
201083cfadbSKun Lu 	.reg_emisys_ddren_req_mask_b = 0x1,
202083cfadbSKun Lu 	.reg_emisys_emi_req_mask_b = 0x0,
203083cfadbSKun Lu 	.reg_gce_d_apsrc_req_mask_b = 0x1,
204083cfadbSKun Lu 	.reg_gce_d_ddren_req_mask_b = 0x1,
205083cfadbSKun Lu 	.reg_gce_d_emi_req_mask_b = 0x1,
206083cfadbSKun Lu 	.reg_gce_d_infra_req_mask_b = 0x0,
207083cfadbSKun Lu 	.reg_gce_d_pmic_req_mask_b = 0x0,
208083cfadbSKun Lu 	.reg_gce_d_srcclkena_mask_b = 0x0,
209083cfadbSKun Lu 	.reg_gce_d_vrf18_req_mask_b = 0x0,
210083cfadbSKun Lu 	.reg_gce_m_apsrc_req_mask_b = 0x1,
211083cfadbSKun Lu 	.reg_gce_m_ddren_req_mask_b = 0x1,
212083cfadbSKun Lu 	.reg_gce_m_emi_req_mask_b = 0x1,
213083cfadbSKun Lu 	.reg_gce_m_infra_req_mask_b = 0x0,
214083cfadbSKun Lu 	.reg_gce_m_pmic_req_mask_b = 0x0,
215083cfadbSKun Lu 	.reg_gce_m_srcclkena_mask_b = 0x0,
216083cfadbSKun Lu 
217083cfadbSKun Lu 	/* SPM_SRC_MASK_7 */
218083cfadbSKun Lu 	.reg_gce_m_vrf18_req_mask_b = 0x0,
219083cfadbSKun Lu 	.reg_gpueb_apsrc_req_mask_b = 0x0,
220083cfadbSKun Lu 	.reg_gpueb_ddren_req_mask_b = 0x0,
221083cfadbSKun Lu 	.reg_gpueb_emi_req_mask_b = 0x0,
222083cfadbSKun Lu 	.reg_gpueb_infra_req_mask_b = 0x0,
223083cfadbSKun Lu 	.reg_gpueb_pmic_req_mask_b = 0x0,
224083cfadbSKun Lu 	.reg_gpueb_srcclkena_mask_b = 0x0,
225083cfadbSKun Lu 	.reg_gpueb_vrf18_req_mask_b = 0x0,
226083cfadbSKun Lu 	.reg_hwccf_apsrc_req_mask_b = 0x1,
227083cfadbSKun Lu 	.reg_hwccf_ddren_req_mask_b = 0x1,
228083cfadbSKun Lu 	.reg_hwccf_emi_req_mask_b = 0x1,
229083cfadbSKun Lu 	.reg_hwccf_infra_req_mask_b = 0x1,
230083cfadbSKun Lu 	.reg_hwccf_pmic_req_mask_b = 0x1,
231083cfadbSKun Lu 	.reg_hwccf_srcclkena_mask_b = 0x1,
232083cfadbSKun Lu 	.reg_hwccf_vcore_req_mask_b = 0x1,
233083cfadbSKun Lu 	.reg_hwccf_vrf18_req_mask_b = 0x1,
234083cfadbSKun Lu 	.reg_img_apsrc_req_mask_b = 0x1,
235083cfadbSKun Lu 	.reg_img_ddren_req_mask_b = 0x1,
236083cfadbSKun Lu 	.reg_img_emi_req_mask_b = 0x1,
237083cfadbSKun Lu 	.reg_img_infra_req_mask_b = 0x0,
238083cfadbSKun Lu 	.reg_img_pmic_req_mask_b = 0x0,
239083cfadbSKun Lu 	.reg_img_srcclkena_mask_b = 0x0,
240083cfadbSKun Lu 	.reg_img_vrf18_req_mask_b = 0x0,
241083cfadbSKun Lu 	.reg_infrasys_apsrc_req_mask_b = 0x1,
242083cfadbSKun Lu 	.reg_infrasys_ddren_req_mask_b = 0x1,
243083cfadbSKun Lu 	.reg_infrasys_emi_req_mask_b = 0x1,
244083cfadbSKun Lu 	.reg_ipic_infra_req_mask_b = 0x1,
245083cfadbSKun Lu 	.reg_ipic_vrf18_req_mask_b = 0x1,
246083cfadbSKun Lu 	.reg_mcu_apsrc_req_mask_b = 0x0,
247083cfadbSKun Lu 	.reg_mcu_ddren_req_mask_b = 0x0,
248083cfadbSKun Lu 	.reg_mcu_emi_req_mask_b = 0x0,
249083cfadbSKun Lu 
250083cfadbSKun Lu 	/* SPM_SRC_MASK_8 */
251083cfadbSKun Lu 	.reg_mcusys_apsrc_req_mask_b = 0x7,
252083cfadbSKun Lu 	.reg_mcusys_ddren_req_mask_b = 0x7,
253083cfadbSKun Lu 	.reg_mcusys_emi_req_mask_b = 0x7,
254083cfadbSKun Lu 	.reg_mcusys_infra_req_mask_b = 0x0,
255083cfadbSKun Lu 
256083cfadbSKun Lu 	/* SPM_SRC_MASK_9 */
257083cfadbSKun Lu 	.reg_mcusys_pmic_req_mask_b = 0x0,
258083cfadbSKun Lu 	.reg_mcusys_srcclkena_mask_b = 0x0,
259083cfadbSKun Lu 	.reg_mcusys_vrf18_req_mask_b = 0x0,
260083cfadbSKun Lu 	.reg_md_apsrc_req_mask_b = 0x0,
261083cfadbSKun Lu 	.reg_md_ddren_req_mask_b = 0x0,
262083cfadbSKun Lu 	.reg_md_emi_req_mask_b = 0x0,
263083cfadbSKun Lu 	.reg_md_infra_req_mask_b = 0x0,
264083cfadbSKun Lu 	.reg_md_pmic_req_mask_b = 0x0,
265083cfadbSKun Lu 	.reg_md_srcclkena_mask_b = 0x0,
266083cfadbSKun Lu 	.reg_md_srcclkena1_mask_b = 0x0,
267083cfadbSKun Lu 	.reg_md_vcore_req_mask_b = 0x0,
268083cfadbSKun Lu 
269083cfadbSKun Lu 	/* SPM_SRC_MASK_10 */
270083cfadbSKun Lu 	.reg_md_vrf18_req_mask_b = 0x0,
271083cfadbSKun Lu 	.reg_mdp_apsrc_req_mask_b = 0x0,
272083cfadbSKun Lu 	.reg_mdp_ddren_req_mask_b = 0x0,
273083cfadbSKun Lu 	.reg_mm_proc_apsrc_req_mask_b = 0x0,
274083cfadbSKun Lu 	.reg_mm_proc_ddren_req_mask_b = 0x0,
275083cfadbSKun Lu 	.reg_mm_proc_emi_req_mask_b = 0x0,
276083cfadbSKun Lu 	.reg_mm_proc_infra_req_mask_b = 0x0,
277083cfadbSKun Lu 	.reg_mm_proc_pmic_req_mask_b = 0x0,
278083cfadbSKun Lu 	.reg_mm_proc_srcclkena_mask_b = 0x0,
279083cfadbSKun Lu 	.reg_mm_proc_vrf18_req_mask_b = 0x0,
280083cfadbSKun Lu 	.reg_mmsys_apsrc_req_mask_b = 0x0,
281083cfadbSKun Lu 	.reg_mmsys_ddren_req_mask_b = 0x0,
282083cfadbSKun Lu 	.reg_mmsys_vrf18_req_mask_b = 0x0,
283083cfadbSKun Lu 	.reg_pcie0_apsrc_req_mask_b = 0x0,
284083cfadbSKun Lu 	.reg_pcie0_ddren_req_mask_b = 0x0,
285083cfadbSKun Lu 	.reg_pcie0_infra_req_mask_b = 0x0,
286083cfadbSKun Lu 	.reg_pcie0_srcclkena_mask_b = 0x0,
287083cfadbSKun Lu 	.reg_pcie0_vrf18_req_mask_b = 0x0,
288083cfadbSKun Lu 	.reg_pcie1_apsrc_req_mask_b = 0x0,
289083cfadbSKun Lu 	.reg_pcie1_ddren_req_mask_b = 0x0,
290083cfadbSKun Lu 	.reg_pcie1_infra_req_mask_b = 0x0,
291083cfadbSKun Lu 	.reg_pcie1_srcclkena_mask_b = 0x0,
292083cfadbSKun Lu 	.reg_pcie1_vrf18_req_mask_b = 0x0,
293083cfadbSKun Lu 	.reg_perisys_apsrc_req_mask_b = 0x1,
294083cfadbSKun Lu 	.reg_perisys_ddren_req_mask_b = 0x1,
295083cfadbSKun Lu 	.reg_perisys_emi_req_mask_b = 0x1,
296083cfadbSKun Lu 	.reg_perisys_infra_req_mask_b = 0x1,
297083cfadbSKun Lu 	.reg_perisys_pmic_req_mask_b = 0x1,
298083cfadbSKun Lu 	.reg_perisys_srcclkena_mask_b = 0x1,
299083cfadbSKun Lu 	.reg_perisys_vcore_req_mask_b = 0x1,
300083cfadbSKun Lu 	.reg_perisys_vrf18_req_mask_b = 0x1,
301083cfadbSKun Lu 	.reg_scp_apsrc_req_mask_b = 0x1,
302083cfadbSKun Lu 
303083cfadbSKun Lu 	/* SPM_SRC_MASK_11 */
304083cfadbSKun Lu 	.reg_scp_ddren_req_mask_b = 0x1,
305083cfadbSKun Lu 	.reg_scp_emi_req_mask_b = 0x1,
306083cfadbSKun Lu 	.reg_scp_infra_req_mask_b = 0x1,
307083cfadbSKun Lu 	.reg_scp_pmic_req_mask_b = 0x1,
308083cfadbSKun Lu 	.reg_scp_srcclkena_mask_b = 0x1,
309083cfadbSKun Lu 	.reg_scp_vcore_req_mask_b = 0x1,
310083cfadbSKun Lu 	.reg_scp_vrf18_req_mask_b = 0x1,
311083cfadbSKun Lu 	.reg_srcclkeni_infra_req_mask_b = 0x1,
312083cfadbSKun Lu 	.reg_srcclkeni_pmic_req_mask_b = 0x1,
313083cfadbSKun Lu 	.reg_srcclkeni_srcclkena_mask_b = 0x1,
314083cfadbSKun Lu 	.reg_sspm_apsrc_req_mask_b = 0x1,
315083cfadbSKun Lu 	.reg_sspm_ddren_req_mask_b = 0x1,
316083cfadbSKun Lu 	.reg_sspm_emi_req_mask_b = 0x1,
317083cfadbSKun Lu 	.reg_sspm_infra_req_mask_b = 0x1,
318083cfadbSKun Lu 	.reg_sspm_pmic_req_mask_b = 0x1,
319083cfadbSKun Lu 	.reg_sspm_srcclkena_mask_b = 0x1,
320083cfadbSKun Lu 	.reg_sspm_vrf18_req_mask_b = 0x1,
321083cfadbSKun Lu 	.reg_ssr_apsrc_req_mask_b = 0x0,
322083cfadbSKun Lu 	.reg_ssr_ddren_req_mask_b = 0x0,
323083cfadbSKun Lu 	.reg_ssr_emi_req_mask_b = 0x0,
324083cfadbSKun Lu 	.reg_ssr_infra_req_mask_b = 0x0,
325083cfadbSKun Lu 	.reg_ssr_pmic_req_mask_b = 0x0,
326083cfadbSKun Lu 	.reg_ssr_srcclkena_mask_b = 0x0,
327083cfadbSKun Lu 	.reg_ssr_vrf18_req_mask_b = 0x0,
328083cfadbSKun Lu 	.reg_ufs_apsrc_req_mask_b = 0x1,
329083cfadbSKun Lu 	.reg_ufs_ddren_req_mask_b = 0x1,
330083cfadbSKun Lu 	.reg_ufs_emi_req_mask_b = 0x1,
331083cfadbSKun Lu 	.reg_ufs_infra_req_mask_b = 0x1,
332083cfadbSKun Lu 	.reg_ufs_pmic_req_mask_b = 0x1,
333083cfadbSKun Lu 
334083cfadbSKun Lu 	/* SPM_SRC_MASK_12 */
335083cfadbSKun Lu 	.reg_ufs_srcclkena_mask_b = 0x1,
336083cfadbSKun Lu 	.reg_ufs_vrf18_req_mask_b = 0x1,
337083cfadbSKun Lu 	.reg_vdec_apsrc_req_mask_b = 0x1,
338083cfadbSKun Lu 	.reg_vdec_ddren_req_mask_b = 0x1,
339083cfadbSKun Lu 	.reg_vdec_emi_req_mask_b = 0x1,
340083cfadbSKun Lu 	.reg_vdec_infra_req_mask_b = 0x0,
341083cfadbSKun Lu 	.reg_vdec_pmic_req_mask_b = 0x0,
342083cfadbSKun Lu 	.reg_vdec_srcclkena_mask_b = 0x0,
343083cfadbSKun Lu 	.reg_vdec_vrf18_req_mask_b = 0x0,
344083cfadbSKun Lu 	.reg_venc_apsrc_req_mask_b = 0x1,
345083cfadbSKun Lu 	.reg_venc_ddren_req_mask_b = 0x1,
346083cfadbSKun Lu 	.reg_venc_emi_req_mask_b = 0x1,
347083cfadbSKun Lu 	.reg_venc_infra_req_mask_b = 0x0,
348083cfadbSKun Lu 	.reg_venc_pmic_req_mask_b = 0x0,
349083cfadbSKun Lu 	.reg_venc_srcclkena_mask_b = 0x0,
350083cfadbSKun Lu 	.reg_venc_vrf18_req_mask_b = 0x0,
351083cfadbSKun Lu 	.reg_ipe_apsrc_req_mask_b = 0x1,
352083cfadbSKun Lu 	.reg_ipe_ddren_req_mask_b = 0x1,
353083cfadbSKun Lu 	.reg_ipe_emi_req_mask_b = 0x1,
354083cfadbSKun Lu 	.reg_ipe_infra_req_mask_b = 0x1,
355083cfadbSKun Lu 	.reg_ipe_pmic_req_mask_b = 0x1,
356083cfadbSKun Lu 	.reg_ipe_srcclkena_mask_b = 0x1,
357083cfadbSKun Lu 	.reg_ipe_vrf18_req_mask_b = 0x1,
358083cfadbSKun Lu 	.reg_ufs_vcore_req_mask_b = 0x1,
359083cfadbSKun Lu 
360083cfadbSKun Lu 	/* SPM_EVENT_CON_MISC */
361083cfadbSKun Lu 	.reg_srcclken_fast_resp = 0,
362083cfadbSKun Lu 	.reg_csyspwrup_ack_mask = 1,
363083cfadbSKun Lu 
364083cfadbSKun Lu 	/* Auto-gen End */
365083cfadbSKun Lu 
366083cfadbSKun Lu 	/* SPM_WAKEUP_EVENT_MASK */
367083cfadbSKun Lu 	.reg_wakeup_event_mask = 0xC1B33012,
368083cfadbSKun Lu 
369083cfadbSKun Lu 	/* SPM_WAKEUP_EVENT_EXT_MASK */
370083cfadbSKun Lu 	.reg_ext_wakeup_event_mask = 0xFFFFFFFF,
371083cfadbSKun Lu 
372083cfadbSKun Lu 	/*sw flag setting */
373083cfadbSKun Lu 	.pcm_flags = SPM_SUSPEND_PCM_FLAG,
374083cfadbSKun Lu 	.pcm_flags1 = SPM_SUSPEND_PCM_FLAG1,
375083cfadbSKun Lu };
376083cfadbSKun Lu 
377083cfadbSKun Lu static struct suspend_dbg_ctrl suspend_spm_dbg_ext = {
378083cfadbSKun Lu 	.sleep_suspend_cnt = 0,
379083cfadbSKun Lu };
380083cfadbSKun Lu 
381083cfadbSKun Lu static struct dbg_ctrl suspend_spm_dbg = {
382083cfadbSKun Lu 	.count = 0,
383083cfadbSKun Lu 	.duration = 0,
384083cfadbSKun Lu 	.ext = &suspend_spm_dbg_ext,
385083cfadbSKun Lu };
386083cfadbSKun Lu 
387083cfadbSKun Lu static struct spm_lp_stat suspend_lp_stat;
388083cfadbSKun Lu 
389083cfadbSKun Lu struct spm_lp_scen __spm_suspend = {
390083cfadbSKun Lu 	.pwrctrl = &suspend_ctrl,
391083cfadbSKun Lu 	.dbgctrl = &suspend_spm_dbg,
392083cfadbSKun Lu 	.lpstat = &suspend_lp_stat,
393083cfadbSKun Lu };
394083cfadbSKun Lu 
395083cfadbSKun Lu static uint8_t bak_spm_vcore_req;
396083cfadbSKun Lu 
mt_spm_suspend_mode_set(enum mt_spm_suspend_mode mode,void * prv)397083cfadbSKun Lu int mt_spm_suspend_mode_set(enum mt_spm_suspend_mode mode, void *prv)
398083cfadbSKun Lu {
399083cfadbSKun Lu 	if (mode == MT_SPM_SUSPEND_SLEEP) {
400083cfadbSKun Lu 		suspend_ctrl.pcm_flags = SPM_SUSPEND_SLEEP_PCM_FLAG;
401083cfadbSKun Lu 		suspend_ctrl.pcm_flags1 = SPM_SUSPEND_SLEEP_PCM_FLAG1;
402083cfadbSKun Lu 		suspend_ctrl.reg_spm_vcore_req = 1; /* disable AOC */
403083cfadbSKun Lu 	} else {
404083cfadbSKun Lu 		suspend_ctrl.pcm_flags = SPM_SUSPEND_PCM_FLAG;
405083cfadbSKun Lu 		suspend_ctrl.pcm_flags1 = SPM_SUSPEND_PCM_FLAG1;
406083cfadbSKun Lu 	}
407083cfadbSKun Lu 	return 0;
408083cfadbSKun Lu }
409083cfadbSKun Lu 
mt_spm_suspend_ec_pin(void)410ed11c2ffSKun Lu static void mt_spm_suspend_ec_pin(void)
411ed11c2ffSKun Lu {
412ed11c2ffSKun Lu 	/* GPIO140 LOW */
413ed11c2ffSKun Lu 	gpio_set_value(EC_SUSPEND_PIN, GPIO_LEVEL_LOW);
414ed11c2ffSKun Lu }
415ed11c2ffSKun Lu 
mt_spm_resume_ec_pin(void)416ed11c2ffSKun Lu static void mt_spm_resume_ec_pin(void)
417ed11c2ffSKun Lu {
418ed11c2ffSKun Lu 	/* GPIO140 HIGH */
419ed11c2ffSKun Lu 	gpio_set_value(EC_SUSPEND_PIN, GPIO_LEVEL_HIGH);
420ed11c2ffSKun Lu }
421ed11c2ffSKun Lu 
mt_spm_suspend_enter(int state_id,uint32_t ext_opand,uint32_t resource_req)422ed11c2ffSKun Lu int mt_spm_suspend_enter(int state_id,
423ed11c2ffSKun Lu 			 uint32_t ext_opand, uint32_t resource_req)
424083cfadbSKun Lu {
425083cfadbSKun Lu 	int ret = 0;
426083cfadbSKun Lu 
427083cfadbSKun Lu 	bak_spm_vcore_req = suspend_ctrl.reg_spm_vcore_req;
428083cfadbSKun Lu 
429083cfadbSKun Lu 	/* if FMAudio, ADSP, USB headset is active, change to sleep suspend mode */
430083cfadbSKun Lu 	if (ext_opand & MT_SPM_EX_OP_SET_SUSPEND_MODE)
431083cfadbSKun Lu 		mt_spm_suspend_mode_set(MT_SPM_SUSPEND_SLEEP, NULL);
432083cfadbSKun Lu 
433083cfadbSKun Lu 	mmio_write_32(SPM2SW_MAILBOX_0, 0x1);
434083cfadbSKun Lu 
435083cfadbSKun Lu 	ext_opand |= MT_SPM_EX_OP_DEVICES_SAVE;
436083cfadbSKun Lu 
437083cfadbSKun Lu #if defined(CONFIG_MTK_VCOREDVFS_SUPPORT)
438083cfadbSKun Lu 	/* Notify vcoredvfs suspend enter */
439083cfadbSKun Lu 	spm_vcorefs_plat_suspend();
440083cfadbSKun Lu #endif
441083cfadbSKun Lu 
442083cfadbSKun Lu 	ret = spm_conservation(state_id, ext_opand, &__spm_suspend,
443083cfadbSKun Lu 			       resource_req);
444083cfadbSKun Lu 	if (ret == 0) {
445083cfadbSKun Lu 		struct mt_lp_publish_event event = {
446083cfadbSKun Lu 			.id = MT_LPM_PUBEVENTS_SYS_POWER_OFF,
447083cfadbSKun Lu 			.val.u32 = 0,
448083cfadbSKun Lu 			.level = MT_LP_SYSPOWER_LEVEL_SUSPEND,
449083cfadbSKun Lu 		};
450083cfadbSKun Lu 
451083cfadbSKun Lu 		MT_LP_SUSPEND_PUBLISH_EVENT(&event);
452083cfadbSKun Lu 	}
453ed11c2ffSKun Lu 
454ed11c2ffSKun Lu 	mt_spm_suspend_ec_pin();
455ed11c2ffSKun Lu 
456083cfadbSKun Lu 	return ret;
457083cfadbSKun Lu }
458083cfadbSKun Lu 
mt_spm_suspend_resume(int state_id,uint32_t ext_opand,struct wake_status ** status)459083cfadbSKun Lu void mt_spm_suspend_resume(int state_id, uint32_t ext_opand,
460083cfadbSKun Lu 			   struct wake_status **status)
461083cfadbSKun Lu {
462083cfadbSKun Lu 	struct mt_lp_publish_event event;
463083cfadbSKun Lu 	struct wake_status *st = NULL;
464083cfadbSKun Lu 
465083cfadbSKun Lu 	ext_opand |= MT_SPM_EX_OP_DEVICES_SAVE;
466083cfadbSKun Lu 
467ed11c2ffSKun Lu 	mt_spm_resume_ec_pin();
468ed11c2ffSKun Lu 
469083cfadbSKun Lu 	spm_conservation_finish(state_id, ext_opand, &__spm_suspend, &st);
470083cfadbSKun Lu 
471083cfadbSKun Lu 	mt_spm_update_lp_stat(&suspend_lp_stat);
472083cfadbSKun Lu #if defined(CONFIG_MTK_VCOREDVFS_SUPPORT)
473083cfadbSKun Lu 	/* Notify vcoredvfs suspend enter */
474083cfadbSKun Lu 	spm_vcorefs_plat_resume();
475083cfadbSKun Lu 	mmio_write_32(SPM2SW_MAILBOX_0, 0x0);
476083cfadbSKun Lu #endif
477083cfadbSKun Lu 
478083cfadbSKun Lu 	/*****************************************
479083cfadbSKun Lu 	 * if FMAudio, ADSP, USB headset is active,
480083cfadbSKun Lu 	 * change back to suspend mode and counting in resume
481083cfadbSKun Lu 	 *****************************************/
482083cfadbSKun Lu 
483083cfadbSKun Lu 	if (ext_opand & MT_SPM_EX_OP_SET_SUSPEND_MODE) {
484083cfadbSKun Lu 		mt_spm_suspend_mode_set(MT_SPM_SUSPEND_SYSTEM_PDN, NULL);
485083cfadbSKun Lu 		suspend_spm_dbg_ext.sleep_suspend_cnt += 1;
486083cfadbSKun Lu 	}
487083cfadbSKun Lu 
488083cfadbSKun Lu 	suspend_ctrl.reg_spm_vcore_req = bak_spm_vcore_req;
489083cfadbSKun Lu 
490083cfadbSKun Lu 	suspend_spm_dbg.count += 1;
491083cfadbSKun Lu 	event.id = MT_LPM_PUBEVENTS_SYS_POWER_ON;
492083cfadbSKun Lu 	event.val.u32 = 0;
493083cfadbSKun Lu 	event.level = MT_LP_SYSPOWER_LEVEL_SUSPEND;
494083cfadbSKun Lu 
495083cfadbSKun Lu 	if (st) {
496083cfadbSKun Lu 		if (st->tr.comm.r12 & R12_AP2AP_PEER_WAKEUP_B)
497083cfadbSKun Lu 			event.val.u32 = MT_LPM_WAKE_MD_WAKEUP_DPMAIF;
498083cfadbSKun Lu 		if (st->tr.comm.r12 & R12_CCIF0_EVENT_B)
499083cfadbSKun Lu 			event.val.u32 = MT_LPM_WAKE_MD_WAKEUP_CCIF0;
500083cfadbSKun Lu 		if (st->tr.comm.r12 & R12_CCIF1_EVENT_B)
501083cfadbSKun Lu 			event.val.u32 = MT_LPM_WAKE_MD_WAKEUP_CCIF1;
502083cfadbSKun Lu 	}
503083cfadbSKun Lu 	if (status)
504083cfadbSKun Lu 		*status = st;
505083cfadbSKun Lu 	MT_LP_SUSPEND_PUBLISH_EVENT(&event);
506083cfadbSKun Lu }
507083cfadbSKun Lu 
mt_spm_suspend_get_spm_lp(struct spm_lp_scen ** lp)508083cfadbSKun Lu int mt_spm_suspend_get_spm_lp(struct spm_lp_scen **lp)
509083cfadbSKun Lu {
510083cfadbSKun Lu 	if (!lp)
511083cfadbSKun Lu 		return -1;
512083cfadbSKun Lu 
513083cfadbSKun Lu 	*lp = &__spm_suspend;
514083cfadbSKun Lu 	return 0;
515083cfadbSKun Lu }
516