xref: /rk3399_ARM-atf/plat/mediatek/mt8195/drivers/spm/mt_spm_internal.c (revision 64fc535972e6ac7b1b6df842689065139942fb89)
1859e346bSEdward-JW Yang /*
2859e346bSEdward-JW Yang  * Copyright (c) 2021, MediaTek Inc. All rights reserved.
3859e346bSEdward-JW Yang  *
4859e346bSEdward-JW Yang  * SPDX-License-Identifier: BSD-3-Clause
5859e346bSEdward-JW Yang  */
6859e346bSEdward-JW Yang 
7859e346bSEdward-JW Yang #include <stddef.h>
8859e346bSEdward-JW Yang 
9859e346bSEdward-JW Yang #include <assert.h>
10859e346bSEdward-JW Yang #include <common/debug.h>
11859e346bSEdward-JW Yang #include <lib/mmio.h>
12859e346bSEdward-JW Yang 
13859e346bSEdward-JW Yang #include <mt_spm.h>
14859e346bSEdward-JW Yang #include <mt_spm_internal.h>
15859e346bSEdward-JW Yang #include <mt_spm_pmic_wrap.h>
16859e346bSEdward-JW Yang #include <mt_spm_reg.h>
17859e346bSEdward-JW Yang #include <mt_spm_resource_req.h>
18859e346bSEdward-JW Yang #include <platform_def.h>
19859e346bSEdward-JW Yang #include <plat_pm.h>
20859e346bSEdward-JW Yang 
21859e346bSEdward-JW Yang /**************************************
22859e346bSEdward-JW Yang  * Define and Declare
23859e346bSEdward-JW Yang  **************************************/
24859e346bSEdward-JW Yang #define ROOT_CORE_ADDR_OFFSET			0x20000000
25859e346bSEdward-JW Yang #define SPM_WAKEUP_EVENT_MASK_CLEAN_MASK	0xefffffff
26859e346bSEdward-JW Yang #define	SPM_INIT_DONE_US			20
27*ab453050SEdward-JW Yang #define SPM_WAKEUP_REASON_MISSING		0xdeaddead
28859e346bSEdward-JW Yang 
29859e346bSEdward-JW Yang static unsigned int mt_spm_bblpm_cnt;
30859e346bSEdward-JW Yang 
31859e346bSEdward-JW Yang const char *wakeup_src_str[32] = {
32*ab453050SEdward-JW Yang 	[0] = "PCM_TIMER",
33*ab453050SEdward-JW Yang 	[1] = "RESERVED_DEBUG_B",
34*ab453050SEdward-JW Yang 	[2] = "KEYPAD",
35*ab453050SEdward-JW Yang 	[3] = "APWDT",
36*ab453050SEdward-JW Yang 	[4] = "APXGPT",
37*ab453050SEdward-JW Yang 	[5] = "MSDC",
38*ab453050SEdward-JW Yang 	[6] = "EINT",
39*ab453050SEdward-JW Yang 	[7] = "IRRX",
40*ab453050SEdward-JW Yang 	[8] = "ETHERNET_QOS",
41*ab453050SEdward-JW Yang 	[9] = "RESERVE0",
42*ab453050SEdward-JW Yang 	[10] = "SSPM",
43*ab453050SEdward-JW Yang 	[11] = "SCP",
44*ab453050SEdward-JW Yang 	[12] = "ADSP",
45*ab453050SEdward-JW Yang 	[13] = "SPM_WDT",
46*ab453050SEdward-JW Yang 	[14] = "USB_U2",
47*ab453050SEdward-JW Yang 	[15] = "USB_TOP",
48*ab453050SEdward-JW Yang 	[16] = "SYS_TIMER",
49*ab453050SEdward-JW Yang 	[17] = "EINT_SECURE",
50*ab453050SEdward-JW Yang 	[18] = "HDMI",
51*ab453050SEdward-JW Yang 	[19] = "RESERVE1",
52*ab453050SEdward-JW Yang 	[20] = "AFE",
53*ab453050SEdward-JW Yang 	[21] = "THERMAL",
54*ab453050SEdward-JW Yang 	[22] = "SYS_CIRQ",
55*ab453050SEdward-JW Yang 	[23] = "NNA2INFRA",
56*ab453050SEdward-JW Yang 	[24] = "CSYSPWREQ",
57*ab453050SEdward-JW Yang 	[25] = "RESERVE2",
58*ab453050SEdward-JW Yang 	[26] = "PCIE",
59*ab453050SEdward-JW Yang 	[27] = "SEJ",
60*ab453050SEdward-JW Yang 	[28] = "SPM_CPU_WAKEUPEVENT",
61*ab453050SEdward-JW Yang 	[29] = "APUSYS",
62*ab453050SEdward-JW Yang 	[30] = "RESERVE3",
63*ab453050SEdward-JW Yang 	[31] = "RESERVE4",
64859e346bSEdward-JW Yang };
65859e346bSEdward-JW Yang 
66859e346bSEdward-JW Yang /**************************************
67859e346bSEdward-JW Yang  * Function and API
68859e346bSEdward-JW Yang  **************************************/
69859e346bSEdward-JW Yang 
__spm_output_wake_reason(int state_id,const struct wake_status * wakesta)70859e346bSEdward-JW Yang wake_reason_t __spm_output_wake_reason(int state_id,
71859e346bSEdward-JW Yang 				       const struct wake_status *wakesta)
72859e346bSEdward-JW Yang {
73859e346bSEdward-JW Yang 	uint32_t i, bk_vtcxo_dur, spm_26m_off_pct = 0U;
74*ab453050SEdward-JW Yang 	char *spm_26m_sta = NULL;
75859e346bSEdward-JW Yang 	wake_reason_t wr = WR_UNKNOWN;
76859e346bSEdward-JW Yang 
77859e346bSEdward-JW Yang 	if (wakesta == NULL) {
78859e346bSEdward-JW Yang 		return WR_UNKNOWN;
79859e346bSEdward-JW Yang 	}
80859e346bSEdward-JW Yang 
81*ab453050SEdward-JW Yang 	spm_26m_sta = ((wakesta->debug_flag & SPM_DBG_DEBUG_IDX_26M_SLEEP) == 0U) ? "on" : "off";
82*ab453050SEdward-JW Yang 
83859e346bSEdward-JW Yang 	if (wakesta->abort != 0U) {
84*ab453050SEdward-JW Yang 		ERROR("spmfw flow is aborted: 0x%x, timer_out = %u, 26M(%s)\n",
85*ab453050SEdward-JW Yang 		      wakesta->abort, wakesta->timer_out, spm_26m_sta);
86*ab453050SEdward-JW Yang 	} else if (wakesta->r12 == SPM_WAKEUP_REASON_MISSING) {
87*ab453050SEdward-JW Yang 		WARN("cannot find wake up reason, timer_out = %u, 26M(%s)\n",
88*ab453050SEdward-JW Yang 		     wakesta->timer_out, spm_26m_sta);
89859e346bSEdward-JW Yang 	} else {
90859e346bSEdward-JW Yang 		for (i = 0U; i < 32U; i++) {
91859e346bSEdward-JW Yang 			if ((wakesta->r12 & (1U << i)) != 0U) {
92*ab453050SEdward-JW Yang 				INFO("wake up by %s, timer_out = %u, 26M(%s)\n",
93*ab453050SEdward-JW Yang 				     wakeup_src_str[i], wakesta->timer_out, spm_26m_sta);
94859e346bSEdward-JW Yang 				wr = WR_WAKE_SRC;
95859e346bSEdward-JW Yang 				break;
96859e346bSEdward-JW Yang 			}
97859e346bSEdward-JW Yang 		}
98859e346bSEdward-JW Yang 	}
99859e346bSEdward-JW Yang 
100859e346bSEdward-JW Yang 	INFO("r12 = 0x%x, r12_ext = 0x%x, r13 = 0x%x, debug_flag = 0x%x 0x%x\n",
101859e346bSEdward-JW Yang 	     wakesta->r12, wakesta->r12_ext, wakesta->r13, wakesta->debug_flag,
102859e346bSEdward-JW Yang 	     wakesta->debug_flag1);
103859e346bSEdward-JW Yang 	INFO("raw_sta = 0x%x 0x%x 0x%x, idle_sta = 0x%x, cg_check_sta = 0x%x\n",
104859e346bSEdward-JW Yang 	     wakesta->raw_sta, wakesta->md32pcm_wakeup_sta,
105859e346bSEdward-JW Yang 	     wakesta->md32pcm_event_sta, wakesta->idle_sta,
106859e346bSEdward-JW Yang 	     wakesta->cg_check_sta);
107859e346bSEdward-JW Yang 	INFO("req_sta = 0x%x 0x%x 0x%x 0x%x 0x%x, isr = 0x%x\n",
108859e346bSEdward-JW Yang 	     wakesta->req_sta0, wakesta->req_sta1, wakesta->req_sta2,
109859e346bSEdward-JW Yang 	     wakesta->req_sta3, wakesta->req_sta4, wakesta->isr);
110859e346bSEdward-JW Yang 	INFO("rt_req_sta0 = 0x%x, rt_req_sta1 = 0x%x, rt_req_sta2 = 0x%x\n",
111859e346bSEdward-JW Yang 	     wakesta->rt_req_sta0, wakesta->rt_req_sta1, wakesta->rt_req_sta2);
112859e346bSEdward-JW Yang 	INFO("rt_req_sta3 = 0x%x, dram_sw_con_3 = 0x%x, raw_ext_sta = 0x%x\n",
113859e346bSEdward-JW Yang 	     wakesta->rt_req_sta3, wakesta->rt_req_sta4, wakesta->raw_ext_sta);
114859e346bSEdward-JW Yang 	INFO("wake_misc = 0x%x, pcm_flag = 0x%x 0x%x 0x%x 0x%x, req = 0x%x\n",
115859e346bSEdward-JW Yang 	     wakesta->wake_misc, wakesta->sw_flag0, wakesta->sw_flag1,
116859e346bSEdward-JW Yang 	     wakesta->b_sw_flag0, wakesta->b_sw_flag1, wakesta->src_req);
117859e346bSEdward-JW Yang 	INFO("clk_settle = 0x%x, wlk_cntcv_l = 0x%x, wlk_cntcv_h = 0x%x\n",
118859e346bSEdward-JW Yang 	     wakesta->clk_settle, mmio_read_32(SYS_TIMER_VALUE_L),
119859e346bSEdward-JW Yang 	     mmio_read_32(SYS_TIMER_VALUE_H));
120859e346bSEdward-JW Yang 
121859e346bSEdward-JW Yang 	if (wakesta->timer_out != 0U) {
122859e346bSEdward-JW Yang 		bk_vtcxo_dur = mmio_read_32(SPM_BK_VTCXO_DUR);
123859e346bSEdward-JW Yang 		spm_26m_off_pct = (100 * bk_vtcxo_dur) / wakesta->timer_out;
124859e346bSEdward-JW Yang 		INFO("spm_26m_off_pct = %u\n", spm_26m_off_pct);
125859e346bSEdward-JW Yang 	}
126859e346bSEdward-JW Yang 
127859e346bSEdward-JW Yang 	return wr;
128859e346bSEdward-JW Yang }
129859e346bSEdward-JW Yang 
__spm_set_cpu_status(unsigned int cpu)130859e346bSEdward-JW Yang void __spm_set_cpu_status(unsigned int cpu)
131859e346bSEdward-JW Yang {
132859e346bSEdward-JW Yang 	uint32_t root_core_addr;
133859e346bSEdward-JW Yang 
134859e346bSEdward-JW Yang 	if (cpu < 8U) {
135859e346bSEdward-JW Yang 		mmio_write_32(ROOT_CPUTOP_ADDR, (1U << cpu));
136859e346bSEdward-JW Yang 		root_core_addr = SPM_CPU0_PWR_CON + (cpu * 0x4);
137859e346bSEdward-JW Yang 		root_core_addr += ROOT_CORE_ADDR_OFFSET;
138859e346bSEdward-JW Yang 		mmio_write_32(ROOT_CORE_ADDR, root_core_addr);
139859e346bSEdward-JW Yang 		/* Notify MCUPM that preferred cpu wakeup */
140859e346bSEdward-JW Yang 		mmio_write_32(MCUPM_MBOX_WAKEUP_CPU, cpu);
141859e346bSEdward-JW Yang 	} else {
142859e346bSEdward-JW Yang 		ERROR("%s: error cpu number %d\n", __func__, cpu);
143859e346bSEdward-JW Yang 	}
144859e346bSEdward-JW Yang }
145859e346bSEdward-JW Yang 
__spm_src_req_update(const struct pwr_ctrl * pwrctrl,unsigned int resource_usage)146859e346bSEdward-JW Yang void __spm_src_req_update(const struct pwr_ctrl *pwrctrl,
147859e346bSEdward-JW Yang 			  unsigned int resource_usage)
148859e346bSEdward-JW Yang {
149859e346bSEdward-JW Yang 	uint8_t apsrc_req = ((resource_usage & MT_SPM_DRAM_S0) != 0U) ?
150859e346bSEdward-JW Yang 			    1 : pwrctrl->reg_spm_apsrc_req;
151859e346bSEdward-JW Yang 	uint8_t ddr_en_req = ((resource_usage & MT_SPM_DRAM_S1) != 0U) ?
152859e346bSEdward-JW Yang 			     1 : pwrctrl->reg_spm_ddr_en_req;
153859e346bSEdward-JW Yang 	uint8_t vrf18_req = ((resource_usage & MT_SPM_SYSPLL) != 0U) ?
154859e346bSEdward-JW Yang 			    1 : pwrctrl->reg_spm_vrf18_req;
155859e346bSEdward-JW Yang 	uint8_t infra_req = ((resource_usage & MT_SPM_INFRA) != 0U) ?
156859e346bSEdward-JW Yang 			    1 : pwrctrl->reg_spm_infra_req;
157859e346bSEdward-JW Yang 	uint8_t f26m_req  = ((resource_usage &
158859e346bSEdward-JW Yang 			      (MT_SPM_26M | MT_SPM_XO_FPM)) != 0U) ?
159859e346bSEdward-JW Yang 			    1 : pwrctrl->reg_spm_f26m_req;
160859e346bSEdward-JW Yang 
161859e346bSEdward-JW Yang 	mmio_write_32(SPM_SRC_REQ,
162859e346bSEdward-JW Yang 		      ((apsrc_req & 0x1) << 0) |
163859e346bSEdward-JW Yang 		      ((f26m_req & 0x1) << 1) |
164859e346bSEdward-JW Yang 		      ((infra_req & 0x1) << 3) |
165859e346bSEdward-JW Yang 		      ((vrf18_req & 0x1) << 4) |
166859e346bSEdward-JW Yang 		      ((ddr_en_req & 0x1) << 7) |
167859e346bSEdward-JW Yang 		      ((pwrctrl->reg_spm_dvfs_req & 0x1) << 8) |
168859e346bSEdward-JW Yang 		      ((pwrctrl->reg_spm_sw_mailbox_req & 0x1) << 9) |
169859e346bSEdward-JW Yang 		      ((pwrctrl->reg_spm_sspm_mailbox_req & 0x1) << 10) |
170859e346bSEdward-JW Yang 		      ((pwrctrl->reg_spm_adsp_mailbox_req & 0x1) << 11) |
171859e346bSEdward-JW Yang 		      ((pwrctrl->reg_spm_scp_mailbox_req & 0x1) << 12));
172859e346bSEdward-JW Yang }
173859e346bSEdward-JW Yang 
__spm_set_power_control(const struct pwr_ctrl * pwrctrl)174859e346bSEdward-JW Yang void __spm_set_power_control(const struct pwr_ctrl *pwrctrl)
175859e346bSEdward-JW Yang {
176859e346bSEdward-JW Yang 	/* Auto-gen Start */
177859e346bSEdward-JW Yang 
178859e346bSEdward-JW Yang 	/* SPM_AP_STANDBY_CON */
179859e346bSEdward-JW Yang 	mmio_write_32(SPM_AP_STANDBY_CON,
180859e346bSEdward-JW Yang 		((pwrctrl->reg_wfi_op & 0x1) << 0) |
181859e346bSEdward-JW Yang 		((pwrctrl->reg_wfi_type & 0x1) << 1) |
182859e346bSEdward-JW Yang 		((pwrctrl->reg_mp0_cputop_idle_mask & 0x1) << 2) |
183859e346bSEdward-JW Yang 		((pwrctrl->reg_mp1_cputop_idle_mask & 0x1) << 3) |
184859e346bSEdward-JW Yang 		((pwrctrl->reg_mcusys_idle_mask & 0x1) << 4) |
185859e346bSEdward-JW Yang 		((pwrctrl->reg_md_apsrc_1_sel & 0x1) << 25) |
186859e346bSEdward-JW Yang 		((pwrctrl->reg_md_apsrc_0_sel & 0x1) << 26) |
187859e346bSEdward-JW Yang 		((pwrctrl->reg_conn_apsrc_sel & 0x1) << 29));
188859e346bSEdward-JW Yang 
189859e346bSEdward-JW Yang 	/* SPM_SRC_REQ */
190859e346bSEdward-JW Yang 	mmio_write_32(SPM_SRC_REQ,
191859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_apsrc_req & 0x1) << 0) |
192859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_f26m_req & 0x1) << 1) |
193859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_infra_req & 0x1) << 3) |
194859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_vrf18_req & 0x1) << 4) |
195859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_ddr_en_req & 0x1) << 7) |
196859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_dvfs_req & 0x1) << 8) |
197859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_sw_mailbox_req & 0x1) << 9) |
198859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_sspm_mailbox_req & 0x1) << 10) |
199859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_adsp_mailbox_req & 0x1) << 11) |
200859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_scp_mailbox_req & 0x1) << 12));
201859e346bSEdward-JW Yang 
202859e346bSEdward-JW Yang 	/* SPM_SRC_MASK */
203859e346bSEdward-JW Yang 	mmio_write_32(SPM_SRC_MASK,
204859e346bSEdward-JW Yang 		((pwrctrl->reg_sspm_srcclkena_0_mask_b & 0x1) << 0) |
205859e346bSEdward-JW Yang 		((pwrctrl->reg_sspm_infra_req_0_mask_b & 0x1) << 1) |
206859e346bSEdward-JW Yang 		((pwrctrl->reg_sspm_apsrc_req_0_mask_b & 0x1) << 2) |
207859e346bSEdward-JW Yang 		((pwrctrl->reg_sspm_vrf18_req_0_mask_b & 0x1) << 3) |
208859e346bSEdward-JW Yang 		((pwrctrl->reg_sspm_ddr_en_0_mask_b & 0x1) << 4) |
209859e346bSEdward-JW Yang 		((pwrctrl->reg_scp_srcclkena_mask_b & 0x1) << 5) |
210859e346bSEdward-JW Yang 		((pwrctrl->reg_scp_infra_req_mask_b & 0x1) << 6) |
211859e346bSEdward-JW Yang 		((pwrctrl->reg_scp_apsrc_req_mask_b & 0x1) << 7) |
212859e346bSEdward-JW Yang 		((pwrctrl->reg_scp_vrf18_req_mask_b & 0x1) << 8) |
213859e346bSEdward-JW Yang 		((pwrctrl->reg_scp_ddr_en_mask_b & 0x1) << 9) |
214859e346bSEdward-JW Yang 		((pwrctrl->reg_audio_dsp_srcclkena_mask_b & 0x1) << 10) |
215859e346bSEdward-JW Yang 		((pwrctrl->reg_audio_dsp_infra_req_mask_b & 0x1) << 11) |
216859e346bSEdward-JW Yang 		((pwrctrl->reg_audio_dsp_apsrc_req_mask_b & 0x1) << 12) |
217859e346bSEdward-JW Yang 		((pwrctrl->reg_audio_dsp_vrf18_req_mask_b & 0x1) << 13) |
218859e346bSEdward-JW Yang 		((pwrctrl->reg_audio_dsp_ddr_en_mask_b & 0x1) << 14) |
219859e346bSEdward-JW Yang 		((pwrctrl->reg_apu_srcclkena_mask_b & 0x1) << 15) |
220859e346bSEdward-JW Yang 		((pwrctrl->reg_apu_infra_req_mask_b & 0x1) << 16) |
221859e346bSEdward-JW Yang 		((pwrctrl->reg_apu_apsrc_req_mask_b & 0x1) << 17) |
222859e346bSEdward-JW Yang 		((pwrctrl->reg_apu_vrf18_req_mask_b & 0x1) << 18) |
223859e346bSEdward-JW Yang 		((pwrctrl->reg_apu_ddr_en_mask_b & 0x1) << 19) |
224859e346bSEdward-JW Yang 		((pwrctrl->reg_cpueb_srcclkena_mask_b & 0x1) << 20) |
225859e346bSEdward-JW Yang 		((pwrctrl->reg_cpueb_infra_req_mask_b & 0x1) << 21) |
226859e346bSEdward-JW Yang 		((pwrctrl->reg_cpueb_apsrc_req_mask_b & 0x1) << 22) |
227859e346bSEdward-JW Yang 		((pwrctrl->reg_cpueb_vrf18_req_mask_b & 0x1) << 23) |
228859e346bSEdward-JW Yang 		((pwrctrl->reg_cpueb_ddr_en_mask_b & 0x1) << 24) |
229859e346bSEdward-JW Yang 		((pwrctrl->reg_bak_psri_srcclkena_mask_b & 0x1) << 25) |
230859e346bSEdward-JW Yang 		((pwrctrl->reg_bak_psri_infra_req_mask_b & 0x1) << 26) |
231859e346bSEdward-JW Yang 		((pwrctrl->reg_bak_psri_apsrc_req_mask_b & 0x1) << 27) |
232859e346bSEdward-JW Yang 		((pwrctrl->reg_bak_psri_vrf18_req_mask_b & 0x1) << 28) |
233859e346bSEdward-JW Yang 		((pwrctrl->reg_bak_psri_ddr_en_mask_b & 0x1) << 29));
234859e346bSEdward-JW Yang 
235859e346bSEdward-JW Yang 	/* SPM_SRC2_MASK */
236859e346bSEdward-JW Yang 	mmio_write_32(SPM_SRC2_MASK,
237859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc0_srcclkena_mask_b & 0x1) << 0) |
238859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc0_infra_req_mask_b & 0x1) << 1) |
239859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc0_apsrc_req_mask_b & 0x1) << 2) |
240859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc0_vrf18_req_mask_b & 0x1) << 3) |
241859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc0_ddr_en_mask_b & 0x1) << 4) |
242859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc1_srcclkena_mask_b & 0x1) << 5) |
243859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc1_infra_req_mask_b & 0x1) << 6) |
244859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc1_apsrc_req_mask_b & 0x1) << 7) |
245859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc1_vrf18_req_mask_b & 0x1) << 8) |
246859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc1_ddr_en_mask_b & 0x1) << 9) |
247859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc2_srcclkena_mask_b & 0x1) << 10) |
248859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc2_infra_req_mask_b & 0x1) << 11) |
249859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc2_apsrc_req_mask_b & 0x1) << 12) |
250859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc2_vrf18_req_mask_b & 0x1) << 13) |
251859e346bSEdward-JW Yang 		((pwrctrl->reg_msdc2_ddr_en_mask_b & 0x1) << 14) |
252859e346bSEdward-JW Yang 		((pwrctrl->reg_ufs_srcclkena_mask_b & 0x1) << 15) |
253859e346bSEdward-JW Yang 		((pwrctrl->reg_ufs_infra_req_mask_b & 0x1) << 16) |
254859e346bSEdward-JW Yang 		((pwrctrl->reg_ufs_apsrc_req_mask_b & 0x1) << 17) |
255859e346bSEdward-JW Yang 		((pwrctrl->reg_ufs_vrf18_req_mask_b & 0x1) << 18) |
256859e346bSEdward-JW Yang 		((pwrctrl->reg_ufs_ddr_en_mask_b & 0x1) << 19) |
257859e346bSEdward-JW Yang 		((pwrctrl->reg_usb_srcclkena_mask_b & 0x1) << 20) |
258859e346bSEdward-JW Yang 		((pwrctrl->reg_usb_infra_req_mask_b & 0x1) << 21) |
259859e346bSEdward-JW Yang 		((pwrctrl->reg_usb_apsrc_req_mask_b & 0x1) << 22) |
260859e346bSEdward-JW Yang 		((pwrctrl->reg_usb_vrf18_req_mask_b & 0x1) << 23) |
261859e346bSEdward-JW Yang 		((pwrctrl->reg_usb_ddr_en_mask_b & 0x1) << 24) |
262859e346bSEdward-JW Yang 		((pwrctrl->reg_pextp_p0_srcclkena_mask_b & 0x1) << 25) |
263859e346bSEdward-JW Yang 		((pwrctrl->reg_pextp_p0_infra_req_mask_b & 0x1) << 26) |
264859e346bSEdward-JW Yang 		((pwrctrl->reg_pextp_p0_apsrc_req_mask_b & 0x1) << 27) |
265859e346bSEdward-JW Yang 		((pwrctrl->reg_pextp_p0_vrf18_req_mask_b & 0x1) << 28) |
266859e346bSEdward-JW Yang 		((pwrctrl->reg_pextp_p0_ddr_en_mask_b & 0x1) << 29));
267859e346bSEdward-JW Yang 
268859e346bSEdward-JW Yang 	/* SPM_SRC3_MASK */
269859e346bSEdward-JW Yang 	mmio_write_32(SPM_SRC3_MASK,
270859e346bSEdward-JW Yang 		((pwrctrl->reg_pextp_p1_srcclkena_mask_b & 0x1) << 0) |
271859e346bSEdward-JW Yang 		((pwrctrl->reg_pextp_p1_infra_req_mask_b & 0x1) << 1) |
272859e346bSEdward-JW Yang 		((pwrctrl->reg_pextp_p1_apsrc_req_mask_b & 0x1) << 2) |
273859e346bSEdward-JW Yang 		((pwrctrl->reg_pextp_p1_vrf18_req_mask_b & 0x1) << 3) |
274859e346bSEdward-JW Yang 		((pwrctrl->reg_pextp_p1_ddr_en_mask_b & 0x1) << 4) |
275859e346bSEdward-JW Yang 		((pwrctrl->reg_gce0_infra_req_mask_b & 0x1) << 5) |
276859e346bSEdward-JW Yang 		((pwrctrl->reg_gce0_apsrc_req_mask_b & 0x1) << 6) |
277859e346bSEdward-JW Yang 		((pwrctrl->reg_gce0_vrf18_req_mask_b & 0x1) << 7) |
278859e346bSEdward-JW Yang 		((pwrctrl->reg_gce0_ddr_en_mask_b & 0x1) << 8) |
279859e346bSEdward-JW Yang 		((pwrctrl->reg_gce1_infra_req_mask_b & 0x1) << 9) |
280859e346bSEdward-JW Yang 		((pwrctrl->reg_gce1_apsrc_req_mask_b & 0x1) << 10) |
281859e346bSEdward-JW Yang 		((pwrctrl->reg_gce1_vrf18_req_mask_b & 0x1) << 11) |
282859e346bSEdward-JW Yang 		((pwrctrl->reg_gce1_ddr_en_mask_b & 0x1) << 12) |
283859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_srcclkena_reserved_mask_b & 0x1) << 13) |
284859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_infra_req_reserved_mask_b & 0x1) << 14) |
285859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_apsrc_req_reserved_mask_b & 0x1) << 15) |
286859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_vrf18_req_reserved_mask_b & 0x1) << 16) |
287859e346bSEdward-JW Yang 		((pwrctrl->reg_spm_ddr_en_reserved_mask_b & 0x1) << 17) |
288859e346bSEdward-JW Yang 		((pwrctrl->reg_disp0_ddr_en_mask_b & 0x1) << 18) |
289859e346bSEdward-JW Yang 		((pwrctrl->reg_disp0_ddr_en_mask_b & 0x1) << 19) |
290859e346bSEdward-JW Yang 		((pwrctrl->reg_disp1_apsrc_req_mask_b & 0x1) << 20) |
291859e346bSEdward-JW Yang 		((pwrctrl->reg_disp1_ddr_en_mask_b & 0x1) << 21) |
292859e346bSEdward-JW Yang 		((pwrctrl->reg_disp2_apsrc_req_mask_b & 0x1) << 22) |
293859e346bSEdward-JW Yang 		((pwrctrl->reg_disp2_ddr_en_mask_b & 0x1) << 23) |
294859e346bSEdward-JW Yang 		((pwrctrl->reg_disp3_apsrc_req_mask_b & 0x1) << 24) |
295859e346bSEdward-JW Yang 		((pwrctrl->reg_disp3_ddr_en_mask_b & 0x1) << 25) |
296859e346bSEdward-JW Yang 		((pwrctrl->reg_infrasys_apsrc_req_mask_b & 0x1) << 26) |
297859e346bSEdward-JW Yang 		((pwrctrl->reg_infrasys_ddr_en_mask_b & 0x1) << 27));
298859e346bSEdward-JW Yang 
299859e346bSEdward-JW Yang 	/* Mask MCUSYS request since SOC HW would check it */
300859e346bSEdward-JW Yang 	mmio_write_32(SPM_SRC4_MASK, 0x1fc0000);
301859e346bSEdward-JW Yang 
302859e346bSEdward-JW Yang 	/* SPM_WAKEUP_EVENT_MASK */
303859e346bSEdward-JW Yang 	mmio_write_32(SPM_WAKEUP_EVENT_MASK,
304859e346bSEdward-JW Yang 		((pwrctrl->reg_wakeup_event_mask & 0xffffffff) << 0));
305859e346bSEdward-JW Yang 
306859e346bSEdward-JW Yang 	/* SPM_WAKEUP_EVENT_EXT_MASK */
307859e346bSEdward-JW Yang 	mmio_write_32(SPM_WAKEUP_EVENT_EXT_MASK,
308859e346bSEdward-JW Yang 		((pwrctrl->reg_ext_wakeup_event_mask & 0xffffffff) << 0));
309859e346bSEdward-JW Yang 
310859e346bSEdward-JW Yang 	/* Auto-gen End */
311859e346bSEdward-JW Yang }
312859e346bSEdward-JW Yang 
__spm_disable_pcm_timer(void)313859e346bSEdward-JW Yang void __spm_disable_pcm_timer(void)
314859e346bSEdward-JW Yang {
315859e346bSEdward-JW Yang 	mmio_clrsetbits_32(PCM_CON1, RG_PCM_TIMER_EN_LSB, SPM_REGWR_CFG_KEY);
316859e346bSEdward-JW Yang }
317859e346bSEdward-JW Yang 
__spm_set_wakeup_event(const struct pwr_ctrl * pwrctrl)318859e346bSEdward-JW Yang void __spm_set_wakeup_event(const struct pwr_ctrl *pwrctrl)
319859e346bSEdward-JW Yang {
320859e346bSEdward-JW Yang 	uint32_t val, mask;
321859e346bSEdward-JW Yang 
322859e346bSEdward-JW Yang 	/* toggle event counter clear */
323859e346bSEdward-JW Yang 	mmio_setbits_32(PCM_CON1,
324859e346bSEdward-JW Yang 			SPM_REGWR_CFG_KEY | SPM_EVENT_COUNTER_CLR_LSB);
325859e346bSEdward-JW Yang 
326859e346bSEdward-JW Yang 	/* toggle for reset SYS TIMER start point */
327859e346bSEdward-JW Yang 	mmio_setbits_32(SYS_TIMER_CON, SYS_TIMER_START_EN_LSB);
328859e346bSEdward-JW Yang 
329859e346bSEdward-JW Yang 	if (pwrctrl->timer_val_cust == 0U) {
330859e346bSEdward-JW Yang 		val = pwrctrl->timer_val;
331859e346bSEdward-JW Yang 	} else {
332859e346bSEdward-JW Yang 		val = pwrctrl->timer_val_cust;
333859e346bSEdward-JW Yang 	}
334859e346bSEdward-JW Yang 
335859e346bSEdward-JW Yang 	mmio_write_32(PCM_TIMER_VAL, val);
336859e346bSEdward-JW Yang 	mmio_setbits_32(PCM_CON1, SPM_REGWR_CFG_KEY | RG_PCM_TIMER_EN_LSB);
337859e346bSEdward-JW Yang 
338859e346bSEdward-JW Yang 	/* unmask AP wakeup source */
339859e346bSEdward-JW Yang 	if (pwrctrl->wake_src_cust == 0U) {
340859e346bSEdward-JW Yang 		mask = pwrctrl->wake_src;
341859e346bSEdward-JW Yang 	} else {
342859e346bSEdward-JW Yang 		mask = pwrctrl->wake_src_cust;
343859e346bSEdward-JW Yang 	}
344859e346bSEdward-JW Yang 
345859e346bSEdward-JW Yang 	mmio_write_32(SPM_WAKEUP_EVENT_MASK, ~mask);
346859e346bSEdward-JW Yang 
347859e346bSEdward-JW Yang 	/* unmask SPM ISR (keep TWAM setting) */
348859e346bSEdward-JW Yang 	mmio_setbits_32(SPM_IRQ_MASK, ISRM_RET_IRQ_AUX);
349859e346bSEdward-JW Yang 
350859e346bSEdward-JW Yang 	/* toggle event counter clear */
351859e346bSEdward-JW Yang 	mmio_clrsetbits_32(PCM_CON1, SPM_EVENT_COUNTER_CLR_LSB,
352859e346bSEdward-JW Yang 			   SPM_REGWR_CFG_KEY);
353859e346bSEdward-JW Yang 	/* toggle for reset SYS TIMER start point */
354859e346bSEdward-JW Yang 	mmio_clrbits_32(SYS_TIMER_CON, SYS_TIMER_START_EN_LSB);
355859e346bSEdward-JW Yang }
356859e346bSEdward-JW Yang 
__spm_set_pcm_flags(struct pwr_ctrl * pwrctrl)357859e346bSEdward-JW Yang void __spm_set_pcm_flags(struct pwr_ctrl *pwrctrl)
358859e346bSEdward-JW Yang {
359859e346bSEdward-JW Yang 	/* set PCM flags and data */
360859e346bSEdward-JW Yang 	if (pwrctrl->pcm_flags_cust_clr != 0U) {
361859e346bSEdward-JW Yang 		pwrctrl->pcm_flags &= ~pwrctrl->pcm_flags_cust_clr;
362859e346bSEdward-JW Yang 	}
363859e346bSEdward-JW Yang 
364859e346bSEdward-JW Yang 	if (pwrctrl->pcm_flags_cust_set != 0U) {
365859e346bSEdward-JW Yang 		pwrctrl->pcm_flags |= pwrctrl->pcm_flags_cust_set;
366859e346bSEdward-JW Yang 	}
367859e346bSEdward-JW Yang 
368859e346bSEdward-JW Yang 	if (pwrctrl->pcm_flags1_cust_clr != 0U) {
369859e346bSEdward-JW Yang 		pwrctrl->pcm_flags1 &= ~pwrctrl->pcm_flags1_cust_clr;
370859e346bSEdward-JW Yang 	}
371859e346bSEdward-JW Yang 
372859e346bSEdward-JW Yang 	if (pwrctrl->pcm_flags1_cust_set != 0U) {
373859e346bSEdward-JW Yang 		pwrctrl->pcm_flags1 |= pwrctrl->pcm_flags1_cust_set;
374859e346bSEdward-JW Yang 	}
375859e346bSEdward-JW Yang 
376859e346bSEdward-JW Yang 	mmio_write_32(SPM_SW_FLAG_0, pwrctrl->pcm_flags);
377859e346bSEdward-JW Yang 	mmio_write_32(SPM_SW_FLAG_1, pwrctrl->pcm_flags1);
378859e346bSEdward-JW Yang 	mmio_write_32(SPM_SW_RSV_7, pwrctrl->pcm_flags);
379859e346bSEdward-JW Yang 	mmio_write_32(SPM_SW_RSV_8, pwrctrl->pcm_flags1);
380859e346bSEdward-JW Yang }
381859e346bSEdward-JW Yang 
__spm_get_wakeup_status(struct wake_status * wakesta,unsigned int ext_status)382859e346bSEdward-JW Yang void __spm_get_wakeup_status(struct wake_status *wakesta,
383859e346bSEdward-JW Yang 			     unsigned int ext_status)
384859e346bSEdward-JW Yang {
385859e346bSEdward-JW Yang 	wakesta->tr.comm.r12 = mmio_read_32(SPM_BK_WAKE_EVENT);
386859e346bSEdward-JW Yang 	wakesta->tr.comm.timer_out = mmio_read_32(SPM_BK_PCM_TIMER);
387859e346bSEdward-JW Yang 	wakesta->tr.comm.r13 = mmio_read_32(PCM_REG13_DATA);
388859e346bSEdward-JW Yang 	wakesta->tr.comm.req_sta0 = mmio_read_32(SRC_REQ_STA_0);
389859e346bSEdward-JW Yang 	wakesta->tr.comm.req_sta1 = mmio_read_32(SRC_REQ_STA_1);
390859e346bSEdward-JW Yang 	wakesta->tr.comm.req_sta2 = mmio_read_32(SRC_REQ_STA_2);
391859e346bSEdward-JW Yang 	wakesta->tr.comm.req_sta3 = mmio_read_32(SRC_REQ_STA_3);
392859e346bSEdward-JW Yang 	wakesta->tr.comm.req_sta4 = mmio_read_32(SRC_REQ_STA_4);
393859e346bSEdward-JW Yang 	wakesta->tr.comm.debug_flag = mmio_read_32(PCM_WDT_LATCH_SPARE_0);
394859e346bSEdward-JW Yang 	wakesta->tr.comm.debug_flag1 = mmio_read_32(PCM_WDT_LATCH_SPARE_1);
395859e346bSEdward-JW Yang 
396859e346bSEdward-JW Yang 	if ((ext_status & SPM_INTERNAL_STATUS_HW_S1) != 0U) {
397859e346bSEdward-JW Yang 		wakesta->tr.comm.debug_flag |= (SPM_DBG_DEBUG_IDX_DDREN_WAKE |
398859e346bSEdward-JW Yang 						SPM_DBG_DEBUG_IDX_DDREN_SLEEP);
399859e346bSEdward-JW Yang 		mmio_write_32(PCM_WDT_LATCH_SPARE_0,
400859e346bSEdward-JW Yang 			      wakesta->tr.comm.debug_flag);
401859e346bSEdward-JW Yang 	}
402859e346bSEdward-JW Yang 
403859e346bSEdward-JW Yang 	wakesta->tr.comm.b_sw_flag0 = mmio_read_32(SPM_SW_RSV_7);
404859e346bSEdward-JW Yang 	wakesta->tr.comm.b_sw_flag1 = mmio_read_32(SPM_SW_RSV_8);
405859e346bSEdward-JW Yang 
406859e346bSEdward-JW Yang 	/* record below spm info for debug */
407859e346bSEdward-JW Yang 	wakesta->r12 = mmio_read_32(SPM_BK_WAKE_EVENT);
408859e346bSEdward-JW Yang 	wakesta->r12_ext = mmio_read_32(SPM_WAKEUP_STA);
409859e346bSEdward-JW Yang 	wakesta->raw_sta = mmio_read_32(SPM_WAKEUP_STA);
410859e346bSEdward-JW Yang 	wakesta->raw_ext_sta = mmio_read_32(SPM_WAKEUP_EXT_STA);
411859e346bSEdward-JW Yang 	wakesta->md32pcm_wakeup_sta = mmio_read_32(MD32PCM_WAKEUP_STA);
412859e346bSEdward-JW Yang 	wakesta->md32pcm_event_sta = mmio_read_32(MD32PCM_EVENT_STA);
413859e346bSEdward-JW Yang 	wakesta->src_req = mmio_read_32(SPM_SRC_REQ);
414859e346bSEdward-JW Yang 
415859e346bSEdward-JW Yang 	/* backup of SPM_WAKEUP_MISC */
416859e346bSEdward-JW Yang 	wakesta->wake_misc = mmio_read_32(SPM_BK_WAKE_MISC);
417859e346bSEdward-JW Yang 
418859e346bSEdward-JW Yang 	/* get sleep time, backup of PCM_TIMER_OUT */
419859e346bSEdward-JW Yang 	wakesta->timer_out = mmio_read_32(SPM_BK_PCM_TIMER);
420859e346bSEdward-JW Yang 
421859e346bSEdward-JW Yang 	/* get other SYS and co-clock status */
422859e346bSEdward-JW Yang 	wakesta->r13 = mmio_read_32(PCM_REG13_DATA);
423859e346bSEdward-JW Yang 	wakesta->idle_sta = mmio_read_32(SUBSYS_IDLE_STA);
424859e346bSEdward-JW Yang 	wakesta->req_sta0 = mmio_read_32(SRC_REQ_STA_0);
425859e346bSEdward-JW Yang 	wakesta->req_sta1 = mmio_read_32(SRC_REQ_STA_1);
426859e346bSEdward-JW Yang 	wakesta->req_sta2 = mmio_read_32(SRC_REQ_STA_2);
427859e346bSEdward-JW Yang 	wakesta->req_sta3 = mmio_read_32(SRC_REQ_STA_3);
428859e346bSEdward-JW Yang 	wakesta->req_sta4 = mmio_read_32(SRC_REQ_STA_4);
429859e346bSEdward-JW Yang 
430859e346bSEdward-JW Yang 	/* get HW CG check status */
431859e346bSEdward-JW Yang 	wakesta->cg_check_sta = mmio_read_32(SPM_CG_CHECK_STA);
432859e346bSEdward-JW Yang 
433859e346bSEdward-JW Yang 	/* get debug flag for PCM execution check */
434859e346bSEdward-JW Yang 	wakesta->debug_flag = mmio_read_32(PCM_WDT_LATCH_SPARE_0);
435859e346bSEdward-JW Yang 	wakesta->debug_flag1 = mmio_read_32(PCM_WDT_LATCH_SPARE_1);
436859e346bSEdward-JW Yang 
437859e346bSEdward-JW Yang 	/* get backup SW flag status */
438859e346bSEdward-JW Yang 	wakesta->b_sw_flag0 = mmio_read_32(SPM_SW_RSV_7);
439859e346bSEdward-JW Yang 	wakesta->b_sw_flag1 = mmio_read_32(SPM_SW_RSV_8);
440859e346bSEdward-JW Yang 
441859e346bSEdward-JW Yang 	wakesta->rt_req_sta0 = mmio_read_32(SPM_SW_RSV_2);
442859e346bSEdward-JW Yang 	wakesta->rt_req_sta1 = mmio_read_32(SPM_SW_RSV_3);
443859e346bSEdward-JW Yang 	wakesta->rt_req_sta2 = mmio_read_32(SPM_SW_RSV_4);
444859e346bSEdward-JW Yang 	wakesta->rt_req_sta3 = mmio_read_32(SPM_SW_RSV_5);
445859e346bSEdward-JW Yang 	wakesta->rt_req_sta4 = mmio_read_32(SPM_SW_RSV_6);
446859e346bSEdward-JW Yang 
447859e346bSEdward-JW Yang 	/* get ISR status */
448859e346bSEdward-JW Yang 	wakesta->isr = mmio_read_32(SPM_IRQ_STA);
449859e346bSEdward-JW Yang 
450859e346bSEdward-JW Yang 	/* get SW flag status */
451859e346bSEdward-JW Yang 	wakesta->sw_flag0 = mmio_read_32(SPM_SW_FLAG_0);
452859e346bSEdward-JW Yang 	wakesta->sw_flag1 = mmio_read_32(SPM_SW_FLAG_1);
453859e346bSEdward-JW Yang 
454859e346bSEdward-JW Yang 	/* get CLK SETTLE */
455859e346bSEdward-JW Yang 	wakesta->clk_settle = mmio_read_32(SPM_CLK_SETTLE);
456859e346bSEdward-JW Yang 
457859e346bSEdward-JW Yang 	/* check abort */
458859e346bSEdward-JW Yang 	wakesta->abort = (wakesta->debug_flag & DEBUG_ABORT_MASK) |
459859e346bSEdward-JW Yang 			 (wakesta->debug_flag1 & DEBUG_ABORT_MASK_1);
460859e346bSEdward-JW Yang }
461859e346bSEdward-JW Yang 
__spm_clean_after_wakeup(void)462859e346bSEdward-JW Yang void __spm_clean_after_wakeup(void)
463859e346bSEdward-JW Yang {
464859e346bSEdward-JW Yang 	mmio_write_32(SPM_BK_WAKE_EVENT,
465859e346bSEdward-JW Yang 		      mmio_read_32(SPM_WAKEUP_STA) |
466859e346bSEdward-JW Yang 		      mmio_read_32(SPM_BK_WAKE_EVENT));
467859e346bSEdward-JW Yang 	mmio_write_32(SPM_CPU_WAKEUP_EVENT, 0);
468859e346bSEdward-JW Yang 
469859e346bSEdward-JW Yang 	/*
470859e346bSEdward-JW Yang 	 * clean wakeup event raw status (for edge trigger event)
471859e346bSEdward-JW Yang 	 * bit[28] for cpu wake up event
472859e346bSEdward-JW Yang 	 */
473859e346bSEdward-JW Yang 	mmio_write_32(SPM_WAKEUP_EVENT_MASK, SPM_WAKEUP_EVENT_MASK_CLEAN_MASK);
474859e346bSEdward-JW Yang 
475859e346bSEdward-JW Yang 	/* clean ISR status (except TWAM) */
476859e346bSEdward-JW Yang 	mmio_setbits_32(SPM_IRQ_MASK, ISRM_ALL_EXC_TWAM);
477859e346bSEdward-JW Yang 	mmio_write_32(SPM_IRQ_STA, ISRC_ALL_EXC_TWAM);
478859e346bSEdward-JW Yang 	mmio_write_32(SPM_SWINT_CLR, PCM_SW_INT_ALL);
479859e346bSEdward-JW Yang }
480859e346bSEdward-JW Yang 
__spm_set_pcm_wdt(int en)481859e346bSEdward-JW Yang void __spm_set_pcm_wdt(int en)
482859e346bSEdward-JW Yang {
483859e346bSEdward-JW Yang 	mmio_clrsetbits_32(PCM_CON1, RG_PCM_WDT_EN_LSB,
484859e346bSEdward-JW Yang 			   SPM_REGWR_CFG_KEY);
485859e346bSEdward-JW Yang 
486859e346bSEdward-JW Yang 	if (en == 1) {
487859e346bSEdward-JW Yang 		mmio_clrsetbits_32(PCM_CON1, RG_PCM_WDT_WAKE_LSB,
488859e346bSEdward-JW Yang 				   SPM_REGWR_CFG_KEY);
489859e346bSEdward-JW Yang 
490859e346bSEdward-JW Yang 		if (mmio_read_32(PCM_TIMER_VAL) > PCM_TIMER_MAX) {
491859e346bSEdward-JW Yang 			mmio_write_32(PCM_TIMER_VAL, PCM_TIMER_MAX);
492859e346bSEdward-JW Yang 		}
493859e346bSEdward-JW Yang 
494859e346bSEdward-JW Yang 		mmio_write_32(PCM_WDT_VAL,
495859e346bSEdward-JW Yang 			      mmio_read_32(PCM_TIMER_VAL) + PCM_WDT_TIMEOUT);
496859e346bSEdward-JW Yang 		mmio_setbits_32(PCM_CON1,
497859e346bSEdward-JW Yang 				SPM_REGWR_CFG_KEY | RG_PCM_WDT_EN_LSB);
498859e346bSEdward-JW Yang 	}
499859e346bSEdward-JW Yang }
500859e346bSEdward-JW Yang 
__spm_send_cpu_wakeup_event(void)501859e346bSEdward-JW Yang void __spm_send_cpu_wakeup_event(void)
502859e346bSEdward-JW Yang {
503859e346bSEdward-JW Yang 	/* SPM will clear SPM_CPU_WAKEUP_EVENT */
504859e346bSEdward-JW Yang 	mmio_write_32(SPM_CPU_WAKEUP_EVENT, 1);
505859e346bSEdward-JW Yang }
506859e346bSEdward-JW Yang 
__spm_ext_int_wakeup_req_clr(void)507859e346bSEdward-JW Yang void __spm_ext_int_wakeup_req_clr(void)
508859e346bSEdward-JW Yang {
509859e346bSEdward-JW Yang 	mmio_write_32(EXT_INT_WAKEUP_REQ_CLR, mmio_read_32(ROOT_CPUTOP_ADDR));
510859e346bSEdward-JW Yang 
511859e346bSEdward-JW Yang 	/* Clear spm2mcupm wakeup interrupt status */
512859e346bSEdward-JW Yang 	mmio_write_32(SPM2CPUEB_CON, 0);
513859e346bSEdward-JW Yang }
514859e346bSEdward-JW Yang 
__spm_xo_soc_bblpm(int en)515859e346bSEdward-JW Yang void __spm_xo_soc_bblpm(int en)
516859e346bSEdward-JW Yang {
517859e346bSEdward-JW Yang 	if (en == 1) {
518859e346bSEdward-JW Yang 		mmio_clrsetbits_32(RC_M00_SRCLKEN_CFG,
519859e346bSEdward-JW Yang 				   RC_SW_SRCLKEN_FPM, RC_SW_SRCLKEN_RC);
520859e346bSEdward-JW Yang 		assert(mt_spm_bblpm_cnt == 0);
521859e346bSEdward-JW Yang 		mt_spm_bblpm_cnt += 1;
522859e346bSEdward-JW Yang 	} else {
523859e346bSEdward-JW Yang 		mmio_clrsetbits_32(RC_M00_SRCLKEN_CFG,
524859e346bSEdward-JW Yang 				   RC_SW_SRCLKEN_RC, RC_SW_SRCLKEN_FPM);
525859e346bSEdward-JW Yang 		mt_spm_bblpm_cnt -= 1;
526859e346bSEdward-JW Yang 	}
527859e346bSEdward-JW Yang }
528859e346bSEdward-JW Yang 
__spm_hw_s1_state_monitor(int en,unsigned int * status)529859e346bSEdward-JW Yang void __spm_hw_s1_state_monitor(int en, unsigned int *status)
530859e346bSEdward-JW Yang {
531859e346bSEdward-JW Yang 	unsigned int reg;
532859e346bSEdward-JW Yang 
533859e346bSEdward-JW Yang 	reg = mmio_read_32(SPM_ACK_CHK_CON_3);
534859e346bSEdward-JW Yang 
535859e346bSEdward-JW Yang 	if (en == 1) {
536859e346bSEdward-JW Yang 		reg &= ~SPM_ACK_CHK_3_CON_CLR_ALL;
537859e346bSEdward-JW Yang 		mmio_write_32(SPM_ACK_CHK_CON_3, reg);
538859e346bSEdward-JW Yang 		reg |= SPM_ACK_CHK_3_CON_EN;
539859e346bSEdward-JW Yang 		mmio_write_32(SPM_ACK_CHK_CON_3, reg);
540859e346bSEdward-JW Yang 	} else {
541859e346bSEdward-JW Yang 		if (((reg & SPM_ACK_CHK_3_CON_RESULT) != 0U) &&
542859e346bSEdward-JW Yang 		    (status != NULL)) {
543859e346bSEdward-JW Yang 			*status |= SPM_INTERNAL_STATUS_HW_S1;
544859e346bSEdward-JW Yang 		}
545859e346bSEdward-JW Yang 
546859e346bSEdward-JW Yang 		mmio_clrsetbits_32(SPM_ACK_CHK_CON_3, SPM_ACK_CHK_3_CON_EN,
547859e346bSEdward-JW Yang 				   SPM_ACK_CHK_3_CON_HW_MODE_TRIG |
548859e346bSEdward-JW Yang 				   SPM_ACK_CHK_3_CON_CLR_ALL);
549859e346bSEdward-JW Yang 	}
550859e346bSEdward-JW Yang }
551