xref: /rk3399_ARM-atf/plat/mediatek/mt8192/drivers/mcdi/mt_lp_irqremain.c (revision 04f28f895f1dc8683838a1382c8f92881f4cf21d)
1df60025fSRoger Lu /*
2*cc76896dSRex-BC Chen  * Copyright (c) 2020-2022, MediaTek Inc. All rights reserved.
3df60025fSRoger Lu  *
4df60025fSRoger Lu  * SPDX-License-Identifier: BSD-3-Clause
5df60025fSRoger Lu  */
6df60025fSRoger Lu 
7*cc76896dSRex-BC Chen #include <mt_cirq.h>
8df60025fSRoger Lu #include <mt_lp_irqremain.h>
9*cc76896dSRex-BC Chen #include <mt_lp_rm.h>
10df60025fSRoger Lu #include <plat_mtk_lpm.h>
11df60025fSRoger Lu 
12df60025fSRoger Lu #define EDMA0_IRQ_ID		U(448)
13df60025fSRoger Lu #define MDLA_IRQ_ID		U(446)
14df60025fSRoger Lu #define MALI4_IRQ_ID		U(399)
15df60025fSRoger Lu #define MALI3_IRQ_ID		U(398)
16df60025fSRoger Lu #define MALI2_IRQ_ID		U(397)
17df60025fSRoger Lu #define MALI1_IRQ_ID		U(396)
18df60025fSRoger Lu #define MALI0_IRQ_ID		U(395)
19df60025fSRoger Lu #define VPU_CORE1_IRQ_ID	U(453)
20df60025fSRoger Lu #define VPU_CORE0_IRQ_ID	U(452)
21df60025fSRoger Lu #define MD_WDT_IRQ_ID		U(110)
22df60025fSRoger Lu #define KEYPAD_IRQ_ID		U(106)
23df60025fSRoger Lu 
24df60025fSRoger Lu #define MD_WDT_WAKESRC		0x2000000
25df60025fSRoger Lu #define KEYPAD_WAKESRC		0x4
26df60025fSRoger Lu 
27df60025fSRoger Lu static struct mt_irqremain remain_irqs;
28df60025fSRoger Lu 
mt_lp_irqremain_submit(void)29df60025fSRoger Lu int mt_lp_irqremain_submit(void)
30df60025fSRoger Lu {
31df60025fSRoger Lu 	if (remain_irqs.count == 0) {
32df60025fSRoger Lu 		return -1;
33df60025fSRoger Lu 	}
34df60025fSRoger Lu 
35df60025fSRoger Lu 	set_wakeup_sources(remain_irqs.irqs, remain_irqs.count);
36df60025fSRoger Lu 	mt_lp_rm_do_update(-1, PLAT_RC_UPDATE_REMAIN_IRQS, &remain_irqs);
37df60025fSRoger Lu 
38df60025fSRoger Lu 	return 0;
39df60025fSRoger Lu }
40df60025fSRoger Lu 
mt_lp_irqremain_aquire(void)41df60025fSRoger Lu int mt_lp_irqremain_aquire(void)
42df60025fSRoger Lu {
43df60025fSRoger Lu 	if (remain_irqs.count == 0) {
44df60025fSRoger Lu 		return -1;
45df60025fSRoger Lu 	}
46df60025fSRoger Lu 
47df60025fSRoger Lu 	mt_cirq_sw_reset();
48df60025fSRoger Lu 	mt_cirq_clone_gic();
49df60025fSRoger Lu 	mt_cirq_enable();
50df60025fSRoger Lu 
51df60025fSRoger Lu 	return 0;
52df60025fSRoger Lu }
53df60025fSRoger Lu 
mt_lp_irqremain_release(void)54df60025fSRoger Lu int mt_lp_irqremain_release(void)
55df60025fSRoger Lu {
56df60025fSRoger Lu 	if (remain_irqs.count == 0) {
57df60025fSRoger Lu 		return -1;
58df60025fSRoger Lu 	}
59df60025fSRoger Lu 
60df60025fSRoger Lu 	mt_cirq_flush();
61df60025fSRoger Lu 	mt_cirq_disable();
62df60025fSRoger Lu 
63df60025fSRoger Lu 	return 0;
64df60025fSRoger Lu }
65df60025fSRoger Lu 
mt_lp_irqremain_init(void)66df60025fSRoger Lu void mt_lp_irqremain_init(void)
67df60025fSRoger Lu {
68df60025fSRoger Lu 	uint32_t idx;
69df60025fSRoger Lu 
70df60025fSRoger Lu 	remain_irqs.count = 0;
71df60025fSRoger Lu 
72df60025fSRoger Lu 	/* level edma0 */
73df60025fSRoger Lu 	idx = remain_irqs.count;
74df60025fSRoger Lu 	remain_irqs.irqs[idx] = EDMA0_IRQ_ID;
75df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
76df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = 0;
77df60025fSRoger Lu 	remain_irqs.count++;
78df60025fSRoger Lu 
79df60025fSRoger Lu 	/* level mdla */
80df60025fSRoger Lu 	idx = remain_irqs.count;
81df60025fSRoger Lu 	remain_irqs.irqs[idx] = MDLA_IRQ_ID;
82df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
83df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = 0;
84df60025fSRoger Lu 	remain_irqs.count++;
85df60025fSRoger Lu 
86df60025fSRoger Lu 	/* level mali4 */
87df60025fSRoger Lu 	idx = remain_irqs.count;
88df60025fSRoger Lu 	remain_irqs.irqs[idx] = MALI4_IRQ_ID;
89df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
90df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = 0;
91df60025fSRoger Lu 	remain_irqs.count++;
92df60025fSRoger Lu 
93df60025fSRoger Lu 	/* level mali3 */
94df60025fSRoger Lu 	idx = remain_irqs.count;
95df60025fSRoger Lu 	remain_irqs.irqs[idx] = MALI3_IRQ_ID;
96df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
97df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = 0;
98df60025fSRoger Lu 	remain_irqs.count++;
99df60025fSRoger Lu 
100df60025fSRoger Lu 	/* level mali2 */
101df60025fSRoger Lu 	idx = remain_irqs.count;
102df60025fSRoger Lu 	remain_irqs.irqs[idx] = MALI2_IRQ_ID;
103df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
104df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = 0;
105df60025fSRoger Lu 	remain_irqs.count++;
106df60025fSRoger Lu 
107df60025fSRoger Lu 	/* level mali1 */
108df60025fSRoger Lu 	idx = remain_irqs.count;
109df60025fSRoger Lu 	remain_irqs.irqs[idx] = MALI1_IRQ_ID;
110df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
111df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = 0;
112df60025fSRoger Lu 	remain_irqs.count++;
113df60025fSRoger Lu 
114df60025fSRoger Lu 	/* level mali0 */
115df60025fSRoger Lu 	idx = remain_irqs.count;
116df60025fSRoger Lu 	remain_irqs.irqs[idx] = MALI0_IRQ_ID;
117df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
118df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = 0;
119df60025fSRoger Lu 	remain_irqs.count++;
120df60025fSRoger Lu 
121df60025fSRoger Lu 	/* level vpu core1 */
122df60025fSRoger Lu 	idx = remain_irqs.count;
123df60025fSRoger Lu 	remain_irqs.irqs[idx] = VPU_CORE1_IRQ_ID;
124df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
125df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = 0;
126df60025fSRoger Lu 	remain_irqs.count++;
127df60025fSRoger Lu 
128df60025fSRoger Lu 	/* level vpu core0 */
129df60025fSRoger Lu 	idx = remain_irqs.count;
130df60025fSRoger Lu 	remain_irqs.irqs[idx] = VPU_CORE0_IRQ_ID;
131df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
132df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = 0;
133df60025fSRoger Lu 	remain_irqs.count++;
134df60025fSRoger Lu 
135df60025fSRoger Lu 	/* edge mdwdt */
136df60025fSRoger Lu 	idx = remain_irqs.count;
137df60025fSRoger Lu 	remain_irqs.irqs[idx] = MD_WDT_IRQ_ID;
138df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
139df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = MD_WDT_WAKESRC;
140df60025fSRoger Lu 	remain_irqs.count++;
141df60025fSRoger Lu 
142df60025fSRoger Lu 	/* edge keypad */
143df60025fSRoger Lu 	idx = remain_irqs.count;
144df60025fSRoger Lu 	remain_irqs.irqs[idx] = KEYPAD_IRQ_ID;
145df60025fSRoger Lu 	remain_irqs.wakeupsrc_cat[idx] = 0;
146df60025fSRoger Lu 	remain_irqs.wakeupsrc[idx] = KEYPAD_WAKESRC;
147df60025fSRoger Lu 	remain_irqs.count++;
148df60025fSRoger Lu 
149df60025fSRoger Lu 	mt_lp_irqremain_submit();
150df60025fSRoger Lu }
151