1*a24b53e0SWenzhen Yu /*
2*a24b53e0SWenzhen Yu * Copyright (c) 2025, Mediatek Inc. All rights reserved.
3*a24b53e0SWenzhen Yu *
4*a24b53e0SWenzhen Yu * SPDX-License-Identifier: BSD-3-Clause
5*a24b53e0SWenzhen Yu */
6*a24b53e0SWenzhen Yu
7*a24b53e0SWenzhen Yu #include <assert.h>
8*a24b53e0SWenzhen Yu #include <stddef.h>
9*a24b53e0SWenzhen Yu #include <stdio.h>
10*a24b53e0SWenzhen Yu #include <string.h>
11*a24b53e0SWenzhen Yu
12*a24b53e0SWenzhen Yu #include <common/debug.h>
13*a24b53e0SWenzhen Yu #include <drivers/delay_timer.h>
14*a24b53e0SWenzhen Yu #include <lib/mmio.h>
15*a24b53e0SWenzhen Yu #include <plat/common/platform.h>
16*a24b53e0SWenzhen Yu #include <platform_def.h>
17*a24b53e0SWenzhen Yu
18*a24b53e0SWenzhen Yu #include <drivers/spm/mt_spm_resource_req.h>
19*a24b53e0SWenzhen Yu #include <mt_plat_spm_setting.h>
20*a24b53e0SWenzhen Yu #include <mt_spm.h>
21*a24b53e0SWenzhen Yu #include <mt_spm_internal.h>
22*a24b53e0SWenzhen Yu #include <mt_spm_reg.h>
23*a24b53e0SWenzhen Yu #include <pmic_wrap/inc/mt_spm_pmic_wrap.h>
24*a24b53e0SWenzhen Yu
25*a24b53e0SWenzhen Yu /**************************************
26*a24b53e0SWenzhen Yu * Define and Declare
27*a24b53e0SWenzhen Yu **************************************/
28*a24b53e0SWenzhen Yu #define SPM_INIT_DONE_US 20 /* Simulation result */
29*a24b53e0SWenzhen Yu
__spm_output_wake_reason(const struct wake_status * wakesta)30*a24b53e0SWenzhen Yu wake_reason_t __spm_output_wake_reason(const struct wake_status *wakesta)
31*a24b53e0SWenzhen Yu {
32*a24b53e0SWenzhen Yu uint32_t i;
33*a24b53e0SWenzhen Yu wake_reason_t wr = WR_UNKNOWN;
34*a24b53e0SWenzhen Yu
35*a24b53e0SWenzhen Yu if (!wakesta)
36*a24b53e0SWenzhen Yu return WR_UNKNOWN;
37*a24b53e0SWenzhen Yu
38*a24b53e0SWenzhen Yu if (wakesta->is_abort) {
39*a24b53e0SWenzhen Yu INFO("SPM EARLY WAKE r13 = 0x%x, ", wakesta->tr.comm.r13);
40*a24b53e0SWenzhen Yu #ifndef MTK_PLAT_SPM_PMIC_WRAP_DUMP_UNSUPPORT
41*a24b53e0SWenzhen Yu mt_spm_dump_pmic_warp_reg();
42*a24b53e0SWenzhen Yu #endif
43*a24b53e0SWenzhen Yu }
44*a24b53e0SWenzhen Yu
45*a24b53e0SWenzhen Yu if (wakesta->tr.comm.r12 & R12_PCM_TIMER_B) {
46*a24b53e0SWenzhen Yu
47*a24b53e0SWenzhen Yu if (wakesta->wake_misc & WAKE_MISC_PCM_TIMER_EVENT)
48*a24b53e0SWenzhen Yu wr = WR_PCM_TIMER;
49*a24b53e0SWenzhen Yu }
50*a24b53e0SWenzhen Yu
51*a24b53e0SWenzhen Yu for (i = 2; i < 32; i++) {
52*a24b53e0SWenzhen Yu if (wakesta->tr.comm.r12 & (1U << i))
53*a24b53e0SWenzhen Yu wr = WR_WAKE_SRC;
54*a24b53e0SWenzhen Yu }
55*a24b53e0SWenzhen Yu
56*a24b53e0SWenzhen Yu return wr;
57*a24b53e0SWenzhen Yu }
58*a24b53e0SWenzhen Yu
__spm_init_pcm_register(void)59*a24b53e0SWenzhen Yu void __spm_init_pcm_register(void)
60*a24b53e0SWenzhen Yu {
61*a24b53e0SWenzhen Yu /* Disable r0 and r7 to control power */
62*a24b53e0SWenzhen Yu mmio_write_32(PCM_PWR_IO_EN, 0);
63*a24b53e0SWenzhen Yu }
64*a24b53e0SWenzhen Yu
__spm_set_power_control(const struct pwr_ctrl * pwrctrl,uint32_t resource_usage)65*a24b53e0SWenzhen Yu void __spm_set_power_control(const struct pwr_ctrl *pwrctrl,
66*a24b53e0SWenzhen Yu uint32_t resource_usage)
67*a24b53e0SWenzhen Yu {
68*a24b53e0SWenzhen Yu /* SPM_SRC_REQ */
69*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_REQ,
70*a24b53e0SWenzhen Yu ((pwrctrl->reg_spm_adsp_mailbox_req & 0x1) << 0) |
71*a24b53e0SWenzhen Yu (((pwrctrl->reg_spm_apsrc_req |
72*a24b53e0SWenzhen Yu !!(resource_usage & MT_SPM_DRAM_S0)) & 0x1) << 1) |
73*a24b53e0SWenzhen Yu (((pwrctrl->reg_spm_ddren_req |
74*a24b53e0SWenzhen Yu !!(resource_usage & MT_SPM_DRAM_S1)) & 0x1) << 2) |
75*a24b53e0SWenzhen Yu ((pwrctrl->reg_spm_dvfs_req & 0x1) << 3) |
76*a24b53e0SWenzhen Yu (((pwrctrl->reg_spm_emi_req |
77*a24b53e0SWenzhen Yu !!(resource_usage & MT_SPM_EMI)) & 0x1) << 4) |
78*a24b53e0SWenzhen Yu (((pwrctrl->reg_spm_f26m_req |
79*a24b53e0SWenzhen Yu !!(resource_usage & (MT_SPM_26M |
80*a24b53e0SWenzhen Yu MT_SPM_XO_FPM))) & 0x1) << 5) |
81*a24b53e0SWenzhen Yu (((pwrctrl->reg_spm_infra_req |
82*a24b53e0SWenzhen Yu !!(resource_usage & MT_SPM_INFRA)) & 0x1) << 6) |
83*a24b53e0SWenzhen Yu (((pwrctrl->reg_spm_pmic_req |
84*a24b53e0SWenzhen Yu !!(resource_usage & MT_SPM_PMIC)) & 0x1) << 7) |
85*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spm_scp_mailbox_req & 0x1) << 8) |
86*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spm_sspm_mailbox_req & 0x1) << 9) |
87*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spm_sw_mailbox_req & 0x1) << 10) |
88*a24b53e0SWenzhen Yu ((((u32)pwrctrl->reg_spm_vcore_req |
89*a24b53e0SWenzhen Yu !!(resource_usage & MT_SPM_VCORE)) & 0x1) << 11) |
90*a24b53e0SWenzhen Yu ((((u32)pwrctrl->reg_spm_vrf18_req |
91*a24b53e0SWenzhen Yu !!(resource_usage & MT_SPM_SYSPLL)) & 0x1) << 12) |
92*a24b53e0SWenzhen Yu (((u32)pwrctrl->adsp_mailbox_state & 0x1) << 16) |
93*a24b53e0SWenzhen Yu (((u32)pwrctrl->apsrc_state & 0x1) << 17) |
94*a24b53e0SWenzhen Yu (((u32)pwrctrl->ddren_state & 0x1) << 18) |
95*a24b53e0SWenzhen Yu (((u32)pwrctrl->dvfs_state & 0x1) << 19) |
96*a24b53e0SWenzhen Yu (((u32)pwrctrl->emi_state & 0x1) << 20) |
97*a24b53e0SWenzhen Yu (((u32)pwrctrl->f26m_state & 0x1) << 21) |
98*a24b53e0SWenzhen Yu (((u32)pwrctrl->infra_state & 0x1) << 22) |
99*a24b53e0SWenzhen Yu (((u32)pwrctrl->pmic_state & 0x1) << 23) |
100*a24b53e0SWenzhen Yu (((u32)pwrctrl->scp_mailbox_state & 0x1) << 24) |
101*a24b53e0SWenzhen Yu (((u32)pwrctrl->sspm_mailbox_state & 0x1) << 25) |
102*a24b53e0SWenzhen Yu (((u32)pwrctrl->sw_mailbox_state & 0x1) << 26) |
103*a24b53e0SWenzhen Yu (((u32)pwrctrl->vcore_state & 0x1) << 27) |
104*a24b53e0SWenzhen Yu (((u32)pwrctrl->vrf18_state & 0x1) << 28));
105*a24b53e0SWenzhen Yu
106*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_0 */
107*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_0,
108*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apifr_apsrc_rmb & 0x1) << 0) |
109*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apifr_ddren_rmb & 0x1) << 1) |
110*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apifr_emi_rmb & 0x1) << 2) |
111*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apifr_infra_rmb & 0x1) << 3) |
112*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apifr_pmic_rmb & 0x1) << 4) |
113*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apifr_srcclkena_mb & 0x1) << 5) |
114*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apifr_vcore_rmb & 0x1) << 6) |
115*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apifr_vrf18_rmb & 0x1) << 7) |
116*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apu_apsrc_rmb & 0x1) << 8) |
117*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apu_ddren_rmb & 0x1) << 9) |
118*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apu_emi_rmb & 0x1) << 10) |
119*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apu_infra_rmb & 0x1) << 11) |
120*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apu_pmic_rmb & 0x1) << 12) |
121*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apu_srcclkena_mb & 0x1) << 13) |
122*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apu_vcore_rmb & 0x1) << 14) |
123*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_apu_vrf18_rmb & 0x1) << 15) |
124*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_apsrc_rmb & 0x1) << 16) |
125*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_ddren_rmb & 0x1) << 17) |
126*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_emi_rmb & 0x1) << 18) |
127*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_infra_rmb & 0x1) << 19) |
128*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_pmic_rmb & 0x1) << 20) |
129*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_srcclkena_mb & 0x1) << 21) |
130*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_vcore_rmb & 0x1) << 22) |
131*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_vrf18_rmb & 0x1) << 23));
132*a24b53e0SWenzhen Yu
133*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_1 */
134*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_1,
135*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_dsp_apsrc_rmb & 0x1) << 0) |
136*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_dsp_ddren_rmb & 0x1) << 1) |
137*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_dsp_emi_rmb & 0x1) << 2) |
138*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_dsp_infra_rmb & 0x1) << 3) |
139*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_dsp_pmic_rmb & 0x1) << 4) |
140*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_dsp_srcclkena_mb & 0x1) << 5) |
141*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_dsp_vcore_rmb & 0x1) << 6) |
142*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_audio_dsp_vrf18_rmb & 0x1) << 7) |
143*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cam_apsrc_rmb & 0x1) << 8) |
144*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cam_ddren_rmb & 0x1) << 9) |
145*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cam_emi_rmb & 0x1) << 10) |
146*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cam_infra_rmb & 0x1) << 11) |
147*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cam_pmic_rmb & 0x1) << 12) |
148*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cam_srcclkena_mb & 0x1) << 13) |
149*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cam_vrf18_rmb & 0x1) << 14) |
150*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccif_apsrc_rmb & 0xfff) << 15));
151*a24b53e0SWenzhen Yu
152*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_2 */
153*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_2,
154*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccif_emi_rmb & 0xfff) << 0) |
155*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccif_infra_rmb & 0xfff) << 12));
156*a24b53e0SWenzhen Yu
157*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_3 */
158*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_3,
159*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccif_pmic_rmb & 0xfff) << 0) |
160*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccif_srcclkena_mb & 0xfff) << 12));
161*a24b53e0SWenzhen Yu
162*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_4 */
163*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_4,
164*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccif_vcore_rmb & 0xfff) << 0) |
165*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccif_vrf18_rmb & 0xfff) << 12) |
166*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccu_apsrc_rmb & 0x1) << 24) |
167*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccu_ddren_rmb & 0x1) << 25) |
168*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccu_emi_rmb & 0x1) << 26) |
169*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccu_infra_rmb & 0x1) << 27) |
170*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccu_pmic_rmb & 0x1) << 28) |
171*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccu_srcclkena_mb & 0x1) << 29) |
172*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ccu_vrf18_rmb & 0x1) << 30) |
173*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cg_check_apsrc_rmb & 0x1) << 31));
174*a24b53e0SWenzhen Yu
175*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_5 */
176*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_5,
177*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cg_check_ddren_rmb & 0x1) << 0) |
178*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cg_check_emi_rmb & 0x1) << 1) |
179*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cg_check_infra_rmb & 0x1) << 2) |
180*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cg_check_pmic_rmb & 0x1) << 3) |
181*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cg_check_srcclkena_mb & 0x1) << 4) |
182*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cg_check_vcore_rmb & 0x1) << 5) |
183*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cg_check_vrf18_rmb & 0x1) << 6) |
184*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_apsrc_rmb & 0x1) << 7) |
185*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_ddren_rmb & 0x1) << 8) |
186*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_emi_rmb & 0x1) << 9) |
187*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_infra_rmb & 0x1) << 10) |
188*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_pmic_rmb & 0x1) << 11) |
189*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_srcclkena_mb & 0x1) << 12) |
190*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_vcore_rmb & 0x1) << 13) |
191*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_vrf18_rmb & 0x1) << 14) |
192*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_1_apsrc_rmb & 0x1) << 15) |
193*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_1_ddren_rmb & 0x1) << 16) |
194*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_1_emi_rmb & 0x1) << 17) |
195*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_1_infra_rmb & 0x1) << 18) |
196*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_1_pmic_rmb & 0x1) << 19) |
197*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_1_srcclkena_mb & 0x1) << 20) |
198*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_1_vcore_rmb & 0x1) << 21) |
199*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_1_vrf18_rmb & 0x1) << 22));
200*a24b53e0SWenzhen Yu
201*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_6 */
202*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_6,
203*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_2_apsrc_rmb & 0x1) << 0) |
204*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_2_ddren_rmb & 0x1) << 1) |
205*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_2_emi_rmb & 0x1) << 2) |
206*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_2_infra_rmb & 0x1) << 3) |
207*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_2_pmic_rmb & 0x1) << 4) |
208*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_2_srcclkena_mb & 0x1) << 5) |
209*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_2_vcore_rmb & 0x1) << 6) |
210*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cksys_2_vrf18_rmb & 0x1) << 7) |
211*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_conn_apsrc_rmb & 0x1) << 8) |
212*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_conn_ddren_rmb & 0x1) << 9) |
213*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_conn_emi_rmb & 0x1) << 10) |
214*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_conn_infra_rmb & 0x1) << 11) |
215*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_conn_pmic_rmb & 0x1) << 12) |
216*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_conn_srcclkena_mb & 0x1) << 13) |
217*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_conn_srcclkenb_mb & 0x1) << 14) |
218*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_conn_vcore_rmb & 0x1) << 15) |
219*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_conn_vrf18_rmb & 0x1) << 16) |
220*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_corecfg_apsrc_rmb & 0x1) << 17) |
221*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_corecfg_ddren_rmb & 0x1) << 18) |
222*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_corecfg_emi_rmb & 0x1) << 19) |
223*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_corecfg_infra_rmb & 0x1) << 20) |
224*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_corecfg_pmic_rmb & 0x1) << 21) |
225*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_corecfg_srcclkena_mb & 0x1) << 22) |
226*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_corecfg_vcore_rmb & 0x1) << 23) |
227*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_corecfg_vrf18_rmb & 0x1) << 24));
228*a24b53e0SWenzhen Yu
229*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_7 */
230*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_7,
231*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cpueb_apsrc_rmb & 0x1) << 0) |
232*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cpueb_ddren_rmb & 0x1) << 1) |
233*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cpueb_emi_rmb & 0x1) << 2) |
234*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cpueb_infra_rmb & 0x1) << 3) |
235*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cpueb_pmic_rmb & 0x1) << 4) |
236*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cpueb_srcclkena_mb & 0x1) << 5) |
237*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cpueb_vcore_rmb & 0x1) << 6) |
238*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_cpueb_vrf18_rmb & 0x1) << 7) |
239*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp0_apsrc_rmb & 0x1) << 8) |
240*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp0_ddren_rmb & 0x1) << 9) |
241*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp0_emi_rmb & 0x1) << 10) |
242*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp0_infra_rmb & 0x1) << 11) |
243*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp0_pmic_rmb & 0x1) << 12) |
244*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp0_srcclkena_mb & 0x1) << 13) |
245*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp0_vrf18_rmb & 0x1) << 14) |
246*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp1_apsrc_rmb & 0x1) << 15) |
247*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp1_ddren_rmb & 0x1) << 16) |
248*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp1_emi_rmb & 0x1) << 17) |
249*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp1_infra_rmb & 0x1) << 18) |
250*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp1_pmic_rmb & 0x1) << 19) |
251*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp1_srcclkena_mb & 0x1) << 20) |
252*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_disp1_vrf18_rmb & 0x1) << 21) |
253*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpm_apsrc_rmb & 0xf) << 22) |
254*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpm_ddren_rmb & 0xf) << 26));
255*a24b53e0SWenzhen Yu
256*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_8 */
257*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_8,
258*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpm_emi_rmb & 0xf) << 0) |
259*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpm_infra_rmb & 0xf) << 4) |
260*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpm_pmic_rmb & 0xf) << 8) |
261*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpm_srcclkena_mb & 0xf) << 12) |
262*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpm_vcore_rmb & 0xf) << 16) |
263*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpm_vrf18_rmb & 0xf) << 20) |
264*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpmaif_apsrc_rmb & 0x1) << 24) |
265*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpmaif_ddren_rmb & 0x1) << 25) |
266*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpmaif_emi_rmb & 0x1) << 26) |
267*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpmaif_infra_rmb & 0x1) << 27) |
268*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpmaif_pmic_rmb & 0x1) << 28) |
269*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpmaif_srcclkena_mb & 0x1) << 29) |
270*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpmaif_vcore_rmb & 0x1) << 30) |
271*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dpmaif_vrf18_rmb & 0x1) << 31));
272*a24b53e0SWenzhen Yu
273*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_9 */
274*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_9,
275*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_dvfsrc_level_rmb & 0x1) << 0) |
276*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_emisys_apsrc_rmb & 0x1) << 1) |
277*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_emisys_ddren_rmb & 0x1) << 2) |
278*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_emisys_emi_rmb & 0x1) << 3) |
279*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_emisys_infra_rmb & 0x1) << 4) |
280*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_emisys_pmic_rmb & 0x1) << 5) |
281*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_emisys_srcclkena_mb & 0x1) << 6) |
282*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_emisys_vcore_rmb & 0x1) << 7) |
283*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_emisys_vrf18_rmb & 0x1) << 8) |
284*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gce_apsrc_rmb & 0x1) << 9) |
285*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gce_ddren_rmb & 0x1) << 10) |
286*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gce_emi_rmb & 0x1) << 11) |
287*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gce_infra_rmb & 0x1) << 12) |
288*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gce_pmic_rmb & 0x1) << 13) |
289*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gce_srcclkena_mb & 0x1) << 14) |
290*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gce_vcore_rmb & 0x1) << 15) |
291*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gce_vrf18_rmb & 0x1) << 16) |
292*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gpueb_apsrc_rmb & 0x1) << 17) |
293*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gpueb_ddren_rmb & 0x1) << 18) |
294*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gpueb_emi_rmb & 0x1) << 19) |
295*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gpueb_infra_rmb & 0x1) << 20) |
296*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gpueb_pmic_rmb & 0x1) << 21) |
297*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gpueb_srcclkena_mb & 0x1) << 22) |
298*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gpueb_vcore_rmb & 0x1) << 23) |
299*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_gpueb_vrf18_rmb & 0x1) << 24) |
300*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_hwccf_apsrc_rmb & 0x1) << 25) |
301*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_hwccf_ddren_rmb & 0x1) << 26) |
302*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_hwccf_emi_rmb & 0x1) << 27) |
303*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_hwccf_infra_rmb & 0x1) << 28) |
304*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_hwccf_pmic_rmb & 0x1) << 29) |
305*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_hwccf_srcclkena_mb & 0x1) << 30) |
306*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_hwccf_vcore_rmb & 0x1) << 31));
307*a24b53e0SWenzhen Yu
308*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_10 */
309*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_10,
310*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_hwccf_vrf18_rmb & 0x1) << 0) |
311*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_img_apsrc_rmb & 0x1) << 1) |
312*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_img_ddren_rmb & 0x1) << 2) |
313*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_img_emi_rmb & 0x1) << 3) |
314*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_img_infra_rmb & 0x1) << 4) |
315*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_img_pmic_rmb & 0x1) << 5) |
316*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_img_srcclkena_mb & 0x1) << 6) |
317*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_img_vrf18_rmb & 0x1) << 7) |
318*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_infrasys_apsrc_rmb & 0x1) << 8) |
319*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_infrasys_ddren_rmb & 0x1) << 9) |
320*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_infrasys_emi_rmb & 0x1) << 10) |
321*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_infrasys_infra_rmb & 0x1) << 11) |
322*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_infrasys_pmic_rmb & 0x1) << 12) |
323*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_infrasys_srcclkena_mb & 0x1) << 13) |
324*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_infrasys_vcore_rmb & 0x1) << 14) |
325*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_infrasys_vrf18_rmb & 0x1) << 15) |
326*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ipic_infra_rmb & 0x1) << 16) |
327*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ipic_vrf18_rmb & 0x1) << 17) |
328*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mcu_apsrc_rmb & 0x1) << 18) |
329*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mcu_ddren_rmb & 0x1) << 19) |
330*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mcu_emi_rmb & 0x1) << 20) |
331*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mcu_infra_rmb & 0x1) << 21) |
332*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mcu_pmic_rmb & 0x1) << 22) |
333*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mcu_srcclkena_mb & 0x1) << 23) |
334*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mcu_vcore_rmb & 0x1) << 24) |
335*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mcu_vrf18_rmb & 0x1) << 25) |
336*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_md_apsrc_rmb & 0x1) << 26) |
337*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_md_ddren_rmb & 0x1) << 27) |
338*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_md_emi_rmb & 0x1) << 28) |
339*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_md_infra_rmb & 0x1) << 29) |
340*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_md_pmic_rmb & 0x1) << 30) |
341*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_md_srcclkena_mb & 0x1) << 31));
342*a24b53e0SWenzhen Yu
343*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_11 */
344*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_11,
345*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_md_srcclkena1_mb & 0x1) << 0) |
346*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_md_vcore_rmb & 0x1) << 1) |
347*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_md_vrf18_rmb & 0x1) << 2) |
348*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mm_proc_apsrc_rmb & 0x1) << 3) |
349*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mm_proc_ddren_rmb & 0x1) << 4) |
350*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mm_proc_emi_rmb & 0x1) << 5) |
351*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mm_proc_infra_rmb & 0x1) << 6) |
352*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mm_proc_pmic_rmb & 0x1) << 7) |
353*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mm_proc_srcclkena_mb & 0x1) << 8) |
354*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mm_proc_vcore_rmb & 0x1) << 9) |
355*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mm_proc_vrf18_rmb & 0x1) << 10) |
356*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml0_apsrc_rmb & 0x1) << 11) |
357*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml0_ddren_rmb & 0x1) << 12) |
358*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml0_emi_rmb & 0x1) << 13) |
359*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml0_infra_rmb & 0x1) << 14) |
360*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml0_pmic_rmb & 0x1) << 15) |
361*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml0_srcclkena_mb & 0x1) << 16) |
362*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml0_vrf18_rmb & 0x1) << 17) |
363*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml1_apsrc_rmb & 0x1) << 18) |
364*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml1_ddren_rmb & 0x1) << 19) |
365*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml1_emi_rmb & 0x1) << 20) |
366*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml1_infra_rmb & 0x1) << 21) |
367*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml1_pmic_rmb & 0x1) << 22) |
368*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml1_srcclkena_mb & 0x1) << 23) |
369*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_mml1_vrf18_rmb & 0x1) << 24) |
370*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl0_apsrc_rmb & 0x1) << 25) |
371*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl0_ddren_rmb & 0x1) << 26) |
372*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl0_emi_rmb & 0x1) << 27) |
373*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl0_infra_rmb & 0x1) << 28) |
374*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl0_pmic_rmb & 0x1) << 29) |
375*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl0_srcclkena_mb & 0x1) << 30) |
376*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl0_vrf18_rmb & 0x1) << 31));
377*a24b53e0SWenzhen Yu
378*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_12,
379*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl1_apsrc_rmb & 0x1) << 0) |
380*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl1_ddren_rmb & 0x1) << 1) |
381*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl1_emi_rmb & 0x1) << 2) |
382*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl1_infra_rmb & 0x1) << 3) |
383*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl1_pmic_rmb & 0x1) << 4) |
384*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl1_srcclkena_mb & 0x1) << 5) |
385*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ovl1_vrf18_rmb & 0x1) << 6) |
386*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie0_apsrc_rmb & 0x1) << 7) |
387*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie0_ddren_rmb & 0x1) << 8) |
388*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie0_emi_rmb & 0x1) << 9) |
389*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie0_infra_rmb & 0x1) << 10) |
390*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie0_pmic_rmb & 0x1) << 11) |
391*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie0_srcclkena_mb & 0x1) << 12) |
392*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie0_vcore_rmb & 0x1) << 13) |
393*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie0_vrf18_rmb & 0x1) << 14) |
394*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie1_apsrc_rmb & 0x1) << 15) |
395*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie1_ddren_rmb & 0x1) << 16) |
396*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie1_emi_rmb & 0x1) << 17) |
397*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie1_infra_rmb & 0x1) << 18) |
398*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie1_pmic_rmb & 0x1) << 19) |
399*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie1_srcclkena_mb & 0x1) << 20) |
400*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie1_vcore_rmb & 0x1) << 21) |
401*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pcie1_vrf18_rmb & 0x1) << 22) |
402*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_perisys_apsrc_rmb & 0x1) << 23) |
403*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_perisys_ddren_rmb & 0x1) << 24) |
404*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_perisys_emi_rmb & 0x1) << 25) |
405*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_perisys_infra_rmb & 0x1) << 26) |
406*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_perisys_pmic_rmb & 0x1) << 27) |
407*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_perisys_srcclkena_mb & 0x1) << 28) |
408*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_perisys_vcore_rmb & 0x1) << 29) |
409*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_perisys_vrf18_rmb & 0x1) << 30) |
410*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pmsr_apsrc_rmb & 0x1) << 31));
411*a24b53e0SWenzhen Yu
412*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_13 */
413*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_13,
414*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pmsr_ddren_rmb & 0x1) << 0) |
415*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pmsr_emi_rmb & 0x1) << 1) |
416*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pmsr_infra_rmb & 0x1) << 2) |
417*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pmsr_pmic_rmb & 0x1) << 3) |
418*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pmsr_srcclkena_mb & 0x1) << 4) |
419*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pmsr_vcore_rmb & 0x1) << 5) |
420*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_pmsr_vrf18_rmb & 0x1) << 6) |
421*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_scp_apsrc_rmb & 0x1) << 7) |
422*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_scp_ddren_rmb & 0x1) << 8) |
423*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_scp_emi_rmb & 0x1) << 9) |
424*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_scp_infra_rmb & 0x1) << 10) |
425*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_scp_pmic_rmb & 0x1) << 11) |
426*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_scp_srcclkena_mb & 0x1) << 12) |
427*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_scp_vcore_rmb & 0x1) << 13) |
428*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_scp_vrf18_rmb & 0x1) << 14) |
429*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_hwr_apsrc_rmb & 0x1) << 15) |
430*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_hwr_ddren_rmb & 0x1) << 16) |
431*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_hwr_emi_rmb & 0x1) << 17) |
432*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_hwr_infra_rmb & 0x1) << 18) |
433*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_hwr_pmic_rmb & 0x1) << 19) |
434*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_hwr_srcclkena_mb & 0x1) << 20) |
435*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_hwr_vcore_rmb & 0x1) << 21) |
436*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_hwr_vrf18_rmb & 0x1) << 22) |
437*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_ise_apsrc_rmb & 0x1) << 23) |
438*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_ise_ddren_rmb & 0x1) << 24) |
439*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_ise_emi_rmb & 0x1) << 25) |
440*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_ise_infra_rmb & 0x1) << 26) |
441*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_ise_pmic_rmb & 0x1) << 27) |
442*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_ise_srcclkena_mb & 0x1) << 28) |
443*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_ise_vcore_rmb & 0x1) << 29) |
444*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spu_ise_vrf18_rmb & 0x1) << 30));
445*a24b53e0SWenzhen Yu
446*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_14 */
447*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_14,
448*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_srcclkeni_infra_rmb & 0x3) << 0) |
449*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_srcclkeni_pmic_rmb & 0x3) << 2) |
450*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_srcclkeni_srcclkena_mb & 0x3) << 4) |
451*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_srcclkeni_vcore_rmb & 0x3) << 6) |
452*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_sspm_apsrc_rmb & 0x1) << 8) |
453*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_sspm_ddren_rmb & 0x1) << 9) |
454*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_sspm_emi_rmb & 0x1) << 10) |
455*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_sspm_infra_rmb & 0x1) << 11) |
456*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_sspm_pmic_rmb & 0x1) << 12) |
457*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_sspm_srcclkena_mb & 0x1) << 13) |
458*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_sspm_vrf18_rmb & 0x1) << 14) |
459*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssrsys_apsrc_rmb & 0x1) << 15) |
460*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssrsys_ddren_rmb & 0x1) << 16) |
461*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssrsys_emi_rmb & 0x1) << 17) |
462*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssrsys_infra_rmb & 0x1) << 18) |
463*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssrsys_pmic_rmb & 0x1) << 19) |
464*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssrsys_srcclkena_mb & 0x1) << 20) |
465*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssrsys_vcore_rmb & 0x1) << 21) |
466*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssrsys_vrf18_rmb & 0x1) << 22) |
467*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssusb_apsrc_rmb & 0x1) << 23) |
468*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssusb_ddren_rmb & 0x1) << 24) |
469*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssusb_emi_rmb & 0x1) << 25) |
470*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssusb_infra_rmb & 0x1) << 26) |
471*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssusb_pmic_rmb & 0x1) << 27) |
472*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssusb_srcclkena_mb & 0x1) << 28) |
473*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssusb_vcore_rmb & 0x1) << 29) |
474*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ssusb_vrf18_rmb & 0x1) << 30) |
475*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_uart_hub_infra_rmb & 0x1) << 31));
476*a24b53e0SWenzhen Yu
477*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_15 */
478*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_15,
479*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_uart_hub_pmic_rmb & 0x1) << 0) |
480*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_uart_hub_srcclkena_mb & 0x1) << 1) |
481*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_uart_hub_vcore_rmb & 0x1) << 2) |
482*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_uart_hub_vrf18_rmb & 0x1) << 3) |
483*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ufs_apsrc_rmb & 0x1) << 4) |
484*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ufs_ddren_rmb & 0x1) << 5) |
485*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ufs_emi_rmb & 0x1) << 6) |
486*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ufs_infra_rmb & 0x1) << 7) |
487*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ufs_pmic_rmb & 0x1) << 8) |
488*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ufs_srcclkena_mb & 0x1) << 9) |
489*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ufs_vcore_rmb & 0x1) << 10) |
490*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ufs_vrf18_rmb & 0x1) << 11) |
491*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vdec_apsrc_rmb & 0x1) << 12) |
492*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vdec_ddren_rmb & 0x1) << 13) |
493*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vdec_emi_rmb & 0x1) << 14) |
494*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vdec_infra_rmb & 0x1) << 15) |
495*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vdec_pmic_rmb & 0x1) << 16) |
496*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vdec_srcclkena_mb & 0x1) << 17) |
497*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vdec_vrf18_rmb & 0x1) << 18) |
498*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_venc_apsrc_rmb & 0x1) << 19) |
499*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_venc_ddren_rmb & 0x1) << 20) |
500*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_venc_emi_rmb & 0x1) << 21) |
501*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_venc_infra_rmb & 0x1) << 22) |
502*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_venc_pmic_rmb & 0x1) << 23) |
503*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_venc_srcclkena_mb & 0x1) << 24) |
504*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_venc_vrf18_rmb & 0x1) << 25) |
505*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg_apsrc_rmb & 0x1) << 26) |
506*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg_ddren_rmb & 0x1) << 27) |
507*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg_emi_rmb & 0x1) << 28) |
508*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg_infra_rmb & 0x1) << 29) |
509*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg_pmic_rmb & 0x1) << 30) |
510*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg_srcclkena_mb & 0x1) << 31));
511*a24b53e0SWenzhen Yu
512*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_16 */
513*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_16,
514*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg_vcore_rmb & 0x1) << 0) |
515*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg_vrf18_rmb & 0x1) << 1) |
516*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg1_apsrc_rmb & 0x1) << 2) |
517*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg1_ddren_rmb & 0x1) << 3) |
518*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg1_emi_rmb & 0x1) << 4) |
519*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg1_infra_rmb & 0x1) << 5) |
520*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg1_pmic_rmb & 0x1) << 6) |
521*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg1_srcclkena_mb & 0x1) << 7) |
522*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg1_vcore_rmb & 0x1) << 8) |
523*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_vlpcfg1_vrf18_rmb & 0x1) << 9));
524*a24b53e0SWenzhen Yu
525*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_17 */
526*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_17,
527*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spm_sw_vcore_rmb & 0xffff) << 0) |
528*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spm_sw_pmic_rmb & 0xffff) << 16));
529*a24b53e0SWenzhen Yu
530*a24b53e0SWenzhen Yu /* SPM_SRC_MASK_18 */
531*a24b53e0SWenzhen Yu mmio_write_32(SPM_SRC_MASK_18,
532*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_spm_sw_srcclkena_mb & 0xffff) << 0));
533*a24b53e0SWenzhen Yu
534*a24b53e0SWenzhen Yu /* SPM_EVENT_CON_MISC */
535*a24b53e0SWenzhen Yu mmio_write_32(SPM_EVENT_CON_MISC,
536*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_srcclken_fast_resp & 0x1) << 0) |
537*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_csyspwrup_ack_mask & 0x1) << 1));
538*a24b53e0SWenzhen Yu
539*a24b53e0SWenzhen Yu /* SPM_WAKE_MASK*/
540*a24b53e0SWenzhen Yu mmio_write_32(SPM_WAKEUP_EVENT_MASK,
541*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_wake_mask & 0xffffffff) << 0));
542*a24b53e0SWenzhen Yu
543*a24b53e0SWenzhen Yu /* SPM_WAKEUP_EVENT_EXT_MASK */
544*a24b53e0SWenzhen Yu mmio_write_32(SPM_WAKEUP_EVENT_EXT_MASK,
545*a24b53e0SWenzhen Yu (((u32)pwrctrl->reg_ext_wake_mask & 0xffffffff) << 0));
546*a24b53e0SWenzhen Yu }
547*a24b53e0SWenzhen Yu
548*a24b53e0SWenzhen Yu #define CHECK_ONE 0xffffffff
549*a24b53e0SWenzhen Yu #define CHECK_ZERO 0x0
__spm_check_ack(u32 reg,u32 mask,u32 check_en)550*a24b53e0SWenzhen Yu static int32_t __spm_check_ack(u32 reg, u32 mask, u32 check_en)
551*a24b53e0SWenzhen Yu {
552*a24b53e0SWenzhen Yu u32 val;
553*a24b53e0SWenzhen Yu
554*a24b53e0SWenzhen Yu val = mmio_read_32(reg);
555*a24b53e0SWenzhen Yu if ((val & mask) == (mask & check_en))
556*a24b53e0SWenzhen Yu return 0;
557*a24b53e0SWenzhen Yu return -1;
558*a24b53e0SWenzhen Yu }
559*a24b53e0SWenzhen Yu
__spm_wait_spm_request_ack(u32 spm_resource_req,u32 timeout_us)560*a24b53e0SWenzhen Yu int32_t __spm_wait_spm_request_ack(u32 spm_resource_req, u32 timeout_us)
561*a24b53e0SWenzhen Yu {
562*a24b53e0SWenzhen Yu u32 spm_ctrl0_mask, spm_ctrl1_mask;
563*a24b53e0SWenzhen Yu int32_t ret, retry;
564*a24b53e0SWenzhen Yu
565*a24b53e0SWenzhen Yu if (spm_resource_req == 0)
566*a24b53e0SWenzhen Yu return 0;
567*a24b53e0SWenzhen Yu
568*a24b53e0SWenzhen Yu spm_ctrl0_mask = 0;
569*a24b53e0SWenzhen Yu spm_ctrl1_mask = 0;
570*a24b53e0SWenzhen Yu
571*a24b53e0SWenzhen Yu if (spm_resource_req & (MT_SPM_XO_FPM | MT_SPM_26M))
572*a24b53e0SWenzhen Yu spm_ctrl0_mask |= CTRL0_SC_MD26M_CK_OFF;
573*a24b53e0SWenzhen Yu
574*a24b53e0SWenzhen Yu if (spm_resource_req & MT_SPM_VCORE)
575*a24b53e0SWenzhen Yu spm_ctrl1_mask |= CTRL1_SPM_VCORE_INTERNAL_ACK;
576*a24b53e0SWenzhen Yu if (spm_resource_req & MT_SPM_PMIC)
577*a24b53e0SWenzhen Yu spm_ctrl1_mask |= CTRL1_SPM_PMIC_INTERNAL_ACK;
578*a24b53e0SWenzhen Yu if (spm_resource_req & MT_SPM_INFRA)
579*a24b53e0SWenzhen Yu spm_ctrl1_mask |= CTRL1_SPM_INFRA_INTERNAL_ACK;
580*a24b53e0SWenzhen Yu if (spm_resource_req & MT_SPM_SYSPLL)
581*a24b53e0SWenzhen Yu spm_ctrl1_mask |= CTRL1_SPM_VRF18_INTERNAL_ACK;
582*a24b53e0SWenzhen Yu if (spm_resource_req & MT_SPM_EMI)
583*a24b53e0SWenzhen Yu spm_ctrl1_mask |= CTRL1_SPM_EMI_INTERNAL_ACK;
584*a24b53e0SWenzhen Yu if (spm_resource_req & MT_SPM_DRAM_S0)
585*a24b53e0SWenzhen Yu spm_ctrl1_mask |= CTRL1_SPM_APSRC_INTERNAL_ACK;
586*a24b53e0SWenzhen Yu if (spm_resource_req & MT_SPM_DRAM_S1)
587*a24b53e0SWenzhen Yu spm_ctrl1_mask |= CTRL1_SPM_DDREN_INTERNAL_ACK;
588*a24b53e0SWenzhen Yu
589*a24b53e0SWenzhen Yu retry = -1;
590*a24b53e0SWenzhen Yu ret = 0;
591*a24b53e0SWenzhen Yu
592*a24b53e0SWenzhen Yu while (retry++ < timeout_us) {
593*a24b53e0SWenzhen Yu udelay(1);
594*a24b53e0SWenzhen Yu if (spm_ctrl0_mask != 0) {
595*a24b53e0SWenzhen Yu ret = __spm_check_ack(MD32PCM_SCU_CTRL0,
596*a24b53e0SWenzhen Yu spm_ctrl0_mask,
597*a24b53e0SWenzhen Yu CHECK_ZERO);
598*a24b53e0SWenzhen Yu if (ret)
599*a24b53e0SWenzhen Yu continue;
600*a24b53e0SWenzhen Yu }
601*a24b53e0SWenzhen Yu if (spm_ctrl1_mask != 0) {
602*a24b53e0SWenzhen Yu ret = __spm_check_ack(MD32PCM_SCU_CTRL1,
603*a24b53e0SWenzhen Yu spm_ctrl1_mask,
604*a24b53e0SWenzhen Yu CHECK_ONE);
605*a24b53e0SWenzhen Yu if (ret)
606*a24b53e0SWenzhen Yu continue;
607*a24b53e0SWenzhen Yu }
608*a24b53e0SWenzhen Yu break;
609*a24b53e0SWenzhen Yu }
610*a24b53e0SWenzhen Yu
611*a24b53e0SWenzhen Yu return ret;
612*a24b53e0SWenzhen Yu }
613*a24b53e0SWenzhen Yu
__spm_set_wakeup_event(const struct pwr_ctrl * pwrctrl)614*a24b53e0SWenzhen Yu void __spm_set_wakeup_event(const struct pwr_ctrl *pwrctrl)
615*a24b53e0SWenzhen Yu {
616*a24b53e0SWenzhen Yu u32 val, mask;
617*a24b53e0SWenzhen Yu
618*a24b53e0SWenzhen Yu /* Toggle event counter clear */
619*a24b53e0SWenzhen Yu mmio_write_32(SPM_EVENT_COUNTER_CLEAR, REG_SPM_EVENT_COUNTER_CLR_LSB);
620*a24b53e0SWenzhen Yu /* Toggle for reset SYS TIMER start point */
621*a24b53e0SWenzhen Yu mmio_setbits_32(SYS_TIMER_CON, SYS_TIMER_START_EN_LSB);
622*a24b53e0SWenzhen Yu
623*a24b53e0SWenzhen Yu if (pwrctrl->timer_val_cust == 0)
624*a24b53e0SWenzhen Yu val = pwrctrl->timer_val ? pwrctrl->timer_val : PCM_TIMER_MAX;
625*a24b53e0SWenzhen Yu else
626*a24b53e0SWenzhen Yu val = pwrctrl->timer_val_cust;
627*a24b53e0SWenzhen Yu
628*a24b53e0SWenzhen Yu mmio_write_32(PCM_TIMER_VAL, val);
629*a24b53e0SWenzhen Yu mmio_setbits_32(PCM_CON1, SPM_REGWR_CFG_KEY | REG_PCM_TIMER_EN_LSB);
630*a24b53e0SWenzhen Yu
631*a24b53e0SWenzhen Yu /* Unmask AP wakeup source */
632*a24b53e0SWenzhen Yu if (pwrctrl->wake_src_cust == 0)
633*a24b53e0SWenzhen Yu mask = pwrctrl->wake_src;
634*a24b53e0SWenzhen Yu else
635*a24b53e0SWenzhen Yu mask = pwrctrl->wake_src_cust;
636*a24b53e0SWenzhen Yu
637*a24b53e0SWenzhen Yu if (pwrctrl->reg_csyspwrup_ack_mask)
638*a24b53e0SWenzhen Yu mask &= ~R12_CSYSPWREQ_B;
639*a24b53e0SWenzhen Yu mmio_write_32(SPM_WAKEUP_EVENT_MASK, ~mask);
640*a24b53e0SWenzhen Yu
641*a24b53e0SWenzhen Yu /* Unmask SPM ISR (keep TWAM setting) */
642*a24b53e0SWenzhen Yu mmio_setbits_32(SPM_IRQ_MASK, ISRM_RET_IRQ_AUX);
643*a24b53e0SWenzhen Yu
644*a24b53e0SWenzhen Yu /* Toggle event counter clear */
645*a24b53e0SWenzhen Yu mmio_write_32(SPM_EVENT_COUNTER_CLEAR, 0);
646*a24b53e0SWenzhen Yu /* Toggle for reset SYS TIMER start point */
647*a24b53e0SWenzhen Yu mmio_clrbits_32(SYS_TIMER_CON, SYS_TIMER_START_EN_LSB);
648*a24b53e0SWenzhen Yu }
649*a24b53e0SWenzhen Yu
__spm_set_fw_resume_option(struct pwr_ctrl * pwrctrl)650*a24b53e0SWenzhen Yu void __spm_set_fw_resume_option(struct pwr_ctrl *pwrctrl)
651*a24b53e0SWenzhen Yu {
652*a24b53e0SWenzhen Yu #if SPM_FW_NO_RESUME
653*a24b53e0SWenzhen Yu /* Do Nothing */
654*a24b53e0SWenzhen Yu #else
655*a24b53e0SWenzhen Yu pwrctrl->pcm_flags1 |= SPM_FLAG1_DISABLE_NO_RESUME;
656*a24b53e0SWenzhen Yu #endif
657*a24b53e0SWenzhen Yu }
658*a24b53e0SWenzhen Yu
__spm_set_pcm_flags(struct pwr_ctrl * pwrctrl)659*a24b53e0SWenzhen Yu void __spm_set_pcm_flags(struct pwr_ctrl *pwrctrl)
660*a24b53e0SWenzhen Yu {
661*a24b53e0SWenzhen Yu /* Set PCM flags and data */
662*a24b53e0SWenzhen Yu if (pwrctrl->pcm_flags_cust_clr != 0)
663*a24b53e0SWenzhen Yu pwrctrl->pcm_flags &= ~pwrctrl->pcm_flags_cust_clr;
664*a24b53e0SWenzhen Yu if (pwrctrl->pcm_flags_cust_set != 0)
665*a24b53e0SWenzhen Yu pwrctrl->pcm_flags |= pwrctrl->pcm_flags_cust_set;
666*a24b53e0SWenzhen Yu if (pwrctrl->pcm_flags1_cust_clr != 0)
667*a24b53e0SWenzhen Yu pwrctrl->pcm_flags1 &= ~pwrctrl->pcm_flags1_cust_clr;
668*a24b53e0SWenzhen Yu if (pwrctrl->pcm_flags1_cust_set != 0)
669*a24b53e0SWenzhen Yu pwrctrl->pcm_flags1 |= pwrctrl->pcm_flags1_cust_set;
670*a24b53e0SWenzhen Yu
671*a24b53e0SWenzhen Yu mmio_write_32(SPM_SW_FLAG_0, pwrctrl->pcm_flags);
672*a24b53e0SWenzhen Yu
673*a24b53e0SWenzhen Yu mmio_write_32(SPM_SW_FLAG_1, pwrctrl->pcm_flags1);
674*a24b53e0SWenzhen Yu
675*a24b53e0SWenzhen Yu mmio_write_32(SPM_SW_RSV_7, pwrctrl->pcm_flags);
676*a24b53e0SWenzhen Yu
677*a24b53e0SWenzhen Yu mmio_write_32(SPM_SW_RSV_8, pwrctrl->pcm_flags1);
678*a24b53e0SWenzhen Yu }
679*a24b53e0SWenzhen Yu
__spm_kick_pcm_to_run(struct pwr_ctrl * pwrctrl)680*a24b53e0SWenzhen Yu void __spm_kick_pcm_to_run(struct pwr_ctrl *pwrctrl)
681*a24b53e0SWenzhen Yu {
682*a24b53e0SWenzhen Yu /* Waiting for loading SPMFW done*/
683*a24b53e0SWenzhen Yu while (mmio_read_32(MD32PCM_DMA0_RLCT) != 0x0)
684*a24b53e0SWenzhen Yu ;
685*a24b53e0SWenzhen Yu
686*a24b53e0SWenzhen Yu __spm_set_pcm_flags(pwrctrl);
687*a24b53e0SWenzhen Yu
688*a24b53e0SWenzhen Yu udelay(SPM_INIT_DONE_US);
689*a24b53e0SWenzhen Yu }
690*a24b53e0SWenzhen Yu
__spm_get_wakeup_status(struct wake_status * wakesta,uint32_t ext_status)691*a24b53e0SWenzhen Yu void __spm_get_wakeup_status(struct wake_status *wakesta,
692*a24b53e0SWenzhen Yu uint32_t ext_status)
693*a24b53e0SWenzhen Yu {
694*a24b53e0SWenzhen Yu /* Get wakeup event */
695*a24b53e0SWenzhen Yu wakesta->tr.comm.r12 = mmio_read_32(SPM_BK_WAKE_EVENT);
696*a24b53e0SWenzhen Yu wakesta->r12_ext = mmio_read_32(SPM_WAKEUP_EXT_STA);
697*a24b53e0SWenzhen Yu wakesta->tr.comm.raw_sta = mmio_read_32(SPM_WAKEUP_STA);
698*a24b53e0SWenzhen Yu wakesta->raw_ext_sta = mmio_read_32(SPM_WAKEUP_EXT_STA);
699*a24b53e0SWenzhen Yu wakesta->md32pcm_wakeup_sta = mmio_read_32(MD32PCM_WAKEUP_STA);
700*a24b53e0SWenzhen Yu wakesta->md32pcm_event_sta = mmio_read_32(MD32PCM_EVENT_STA);
701*a24b53e0SWenzhen Yu wakesta->wake_misc = mmio_read_32(SPM_BK_WAKE_MISC);
702*a24b53e0SWenzhen Yu
703*a24b53e0SWenzhen Yu /* Get sleep time */
704*a24b53e0SWenzhen Yu wakesta->tr.comm.timer_out = mmio_read_32(SPM_BK_PCM_TIMER);
705*a24b53e0SWenzhen Yu wakesta->tr.comm.r13 = mmio_read_32(MD32PCM_SCU_STA0);
706*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta0 = mmio_read_32(SPM_REQ_STA_0);
707*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta1 = mmio_read_32(SPM_REQ_STA_1);
708*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta2 = mmio_read_32(SPM_REQ_STA_2);
709*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta3 = mmio_read_32(SPM_REQ_STA_3);
710*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta4 = mmio_read_32(SPM_REQ_STA_4);
711*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta5 = mmio_read_32(SPM_REQ_STA_5);
712*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta6 = mmio_read_32(SPM_REQ_STA_6);
713*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta7 = mmio_read_32(SPM_REQ_STA_7);
714*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta8 = mmio_read_32(SPM_REQ_STA_8);
715*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta9 = mmio_read_32(SPM_REQ_STA_9);
716*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta10 = mmio_read_32(SPM_REQ_STA_10);
717*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta11 = mmio_read_32(SPM_REQ_STA_11);
718*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta12 = mmio_read_32(SPM_REQ_STA_12);
719*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta13 = mmio_read_32(SPM_REQ_STA_13);
720*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta14 = mmio_read_32(SPM_REQ_STA_14);
721*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta15 = mmio_read_32(SPM_REQ_STA_15);
722*a24b53e0SWenzhen Yu wakesta->tr.comm.req_sta16 = mmio_read_32(SPM_REQ_STA_16);
723*a24b53e0SWenzhen Yu
724*a24b53e0SWenzhen Yu /* Get debug flag for PCM execution check */
725*a24b53e0SWenzhen Yu wakesta->tr.comm.debug_flag = mmio_read_32(PCM_WDT_LATCH_SPARE_0);
726*a24b53e0SWenzhen Yu wakesta->tr.comm.debug_flag1 = mmio_read_32(PCM_WDT_LATCH_SPARE_1);
727*a24b53e0SWenzhen Yu
728*a24b53e0SWenzhen Yu /* Get backup SW flag status */
729*a24b53e0SWenzhen Yu wakesta->tr.comm.b_sw_flag0 = mmio_read_32(SPM_SW_RSV_7);
730*a24b53e0SWenzhen Yu wakesta->tr.comm.b_sw_flag1 = mmio_read_32(SPM_SW_RSV_8);
731*a24b53e0SWenzhen Yu
732*a24b53e0SWenzhen Yu /* Get ISR status */
733*a24b53e0SWenzhen Yu wakesta->isr = mmio_read_32(SPM_IRQ_STA);
734*a24b53e0SWenzhen Yu
735*a24b53e0SWenzhen Yu /* Get SW flag status */
736*a24b53e0SWenzhen Yu wakesta->sw_flag0 = mmio_read_32(SPM_SW_FLAG_0);
737*a24b53e0SWenzhen Yu wakesta->sw_flag1 = mmio_read_32(SPM_SW_FLAG_1);
738*a24b53e0SWenzhen Yu
739*a24b53e0SWenzhen Yu /* Check abort */
740*a24b53e0SWenzhen Yu wakesta->is_abort = wakesta->tr.comm.debug_flag1 & DEBUG_ABORT_MASK_1;
741*a24b53e0SWenzhen Yu }
742*a24b53e0SWenzhen Yu
__spm_clean_after_wakeup(void)743*a24b53e0SWenzhen Yu void __spm_clean_after_wakeup(void)
744*a24b53e0SWenzhen Yu {
745*a24b53e0SWenzhen Yu /*
746*a24b53e0SWenzhen Yu * Copy SPM_WAKEUP_STA to SPM_BK_WAKE_EVENT
747*a24b53e0SWenzhen Yu * before clear SPM_WAKEUP_STA
748*a24b53e0SWenzhen Yu *
749*a24b53e0SWenzhen Yu * CPU dormant driver @kernel will copy edge-trig IRQ pending
750*a24b53e0SWenzhen Yu * (recorded @SPM_BK_WAKE_EVENT) to GIC
751*a24b53e0SWenzhen Yu */
752*a24b53e0SWenzhen Yu mmio_write_32(SPM_BK_WAKE_EVENT, mmio_read_32(SPM_WAKEUP_STA) |
753*a24b53e0SWenzhen Yu mmio_read_32(SPM_BK_WAKE_EVENT));
754*a24b53e0SWenzhen Yu
755*a24b53e0SWenzhen Yu mmio_write_32(SPM_CPU_WAKEUP_EVENT, 0);
756*a24b53e0SWenzhen Yu
757*a24b53e0SWenzhen Yu /* Clean wakeup event raw status (for edge trigger event) */
758*a24b53e0SWenzhen Yu mmio_write_32(SPM_WAKEUP_EVENT_MASK, 0xefffffff);
759*a24b53e0SWenzhen Yu
760*a24b53e0SWenzhen Yu /* Clean ISR status (except TWAM) */
761*a24b53e0SWenzhen Yu mmio_setbits_32(SPM_IRQ_MASK, ISRM_ALL_EXC_TWAM);
762*a24b53e0SWenzhen Yu mmio_write_32(SPM_IRQ_STA, ISRC_ALL_EXC_TWAM);
763*a24b53e0SWenzhen Yu mmio_write_32(SPM_SWINT_CLR, PCM_SW_INT_ALL);
764*a24b53e0SWenzhen Yu }
765*a24b53e0SWenzhen Yu
__spm_set_pcm_wdt(int en)766*a24b53e0SWenzhen Yu void __spm_set_pcm_wdt(int en)
767*a24b53e0SWenzhen Yu {
768*a24b53e0SWenzhen Yu /* Enable PCM WDT (normal mode) to start count if needed */
769*a24b53e0SWenzhen Yu if (en) {
770*a24b53e0SWenzhen Yu mmio_clrsetbits_32(PCM_CON1, REG_PCM_WDT_WAKE_LSB,
771*a24b53e0SWenzhen Yu SPM_REGWR_CFG_KEY);
772*a24b53e0SWenzhen Yu
773*a24b53e0SWenzhen Yu if (mmio_read_32(PCM_TIMER_VAL) > PCM_TIMER_MAX)
774*a24b53e0SWenzhen Yu mmio_write_32(PCM_TIMER_VAL, PCM_TIMER_MAX);
775*a24b53e0SWenzhen Yu mmio_write_32(PCM_WDT_VAL, mmio_read_32(PCM_TIMER_VAL) +
776*a24b53e0SWenzhen Yu PCM_WDT_TIMEOUT);
777*a24b53e0SWenzhen Yu mmio_setbits_32(PCM_CON1, SPM_REGWR_CFG_KEY |
778*a24b53e0SWenzhen Yu REG_PCM_WDT_EN_LSB);
779*a24b53e0SWenzhen Yu } else {
780*a24b53e0SWenzhen Yu mmio_clrsetbits_32(PCM_CON1, REG_PCM_WDT_EN_LSB,
781*a24b53e0SWenzhen Yu SPM_REGWR_CFG_KEY);
782*a24b53e0SWenzhen Yu }
783*a24b53e0SWenzhen Yu }
784*a24b53e0SWenzhen Yu
__spm_get_pcm_timer_val(void)785*a24b53e0SWenzhen Yu u32 __spm_get_pcm_timer_val(void)
786*a24b53e0SWenzhen Yu {
787*a24b53e0SWenzhen Yu return mmio_read_32(PCM_TIMER_VAL) >> 15;
788*a24b53e0SWenzhen Yu }
789*a24b53e0SWenzhen Yu
__spm_send_cpu_wakeup_event(void)790*a24b53e0SWenzhen Yu void __spm_send_cpu_wakeup_event(void)
791*a24b53e0SWenzhen Yu {
792*a24b53e0SWenzhen Yu mmio_write_32(SPM_CPU_WAKEUP_EVENT, 1);
793*a24b53e0SWenzhen Yu }
794*a24b53e0SWenzhen Yu
__spm_ext_int_wakeup_req_clr(void)795*a24b53e0SWenzhen Yu void __spm_ext_int_wakeup_req_clr(void)
796*a24b53e0SWenzhen Yu {
797*a24b53e0SWenzhen Yu u32 cpu = plat_my_core_pos();
798*a24b53e0SWenzhen Yu
799*a24b53e0SWenzhen Yu mmio_write_32(EXT_INT_WAKEUP_REQ_CLR, (1U << cpu));
800*a24b53e0SWenzhen Yu
801*a24b53e0SWenzhen Yu /* Clear spm2mcupm wakeup interrupt status */
802*a24b53e0SWenzhen Yu mmio_clrbits_32(SPM2MCUPM_CON, SPM2MCUPM_SW_INT_LSB);
803*a24b53e0SWenzhen Yu }
804*a24b53e0SWenzhen Yu
__spm_hw_s1_state_monitor(int en,uint32_t * status)805*a24b53e0SWenzhen Yu void __spm_hw_s1_state_monitor(int en, uint32_t *status)
806*a24b53e0SWenzhen Yu {
807*a24b53e0SWenzhen Yu uint32_t reg;
808*a24b53e0SWenzhen Yu
809*a24b53e0SWenzhen Yu if (en) {
810*a24b53e0SWenzhen Yu mmio_clrsetbits_32(SPM_ACK_CHK_CON_3,
811*a24b53e0SWenzhen Yu SPM_ACK_CHK_3_CON_CLR_ALL,
812*a24b53e0SWenzhen Yu SPM_ACK_CHK_3_CON_EN);
813*a24b53e0SWenzhen Yu } else {
814*a24b53e0SWenzhen Yu
815*a24b53e0SWenzhen Yu reg = mmio_read_32(SPM_ACK_CHK_CON_3);
816*a24b53e0SWenzhen Yu
817*a24b53e0SWenzhen Yu if (reg & SPM_ACK_CHK_3_CON_RESULT) {
818*a24b53e0SWenzhen Yu if (status)
819*a24b53e0SWenzhen Yu *status |= SPM_INTERNAL_STATUS_HW_S1;
820*a24b53e0SWenzhen Yu }
821*a24b53e0SWenzhen Yu mmio_clrsetbits_32(SPM_ACK_CHK_CON_3, SPM_ACK_CHK_3_CON_EN,
822*a24b53e0SWenzhen Yu (SPM_ACK_CHK_3_CON_HW_MODE_TRIG |
823*a24b53e0SWenzhen Yu SPM_ACK_CHK_3_CON_CLR_ALL));
824*a24b53e0SWenzhen Yu }
825*a24b53e0SWenzhen Yu }
826