1 /*
2  * Copyright (c) 2021-2022, MediaTek Inc. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <mt_cirq.h>
8 #include <mt_lp_irqremain.h>
9 #include <mt_lp_rm.h>
10 #include <plat_mtk_lpm.h>
11 
12 #define KEYPAD_IRQ_ID		U(138)
13 
14 #define KEYPAD_WAKESRC		0x4
15 
16 static struct mt_irqremain remain_irqs;
17 
mt_lp_irqremain_submit(void)18 int mt_lp_irqremain_submit(void)
19 {
20 	if (remain_irqs.count == 0) {
21 		return -1;
22 	}
23 
24 	set_wakeup_sources(remain_irqs.irqs, remain_irqs.count);
25 	mt_lp_rm_do_update(-1, PLAT_RC_UPDATE_REMAIN_IRQS, &remain_irqs);
26 
27 	return 0;
28 }
29 
mt_lp_irqremain_aquire(void)30 int mt_lp_irqremain_aquire(void)
31 {
32 	if (remain_irqs.count == 0) {
33 		return -1;
34 	}
35 
36 	mt_cirq_sw_reset();
37 	mt_cirq_clone_gic();
38 	mt_cirq_enable();
39 
40 	return 0;
41 }
42 
mt_lp_irqremain_release(void)43 int mt_lp_irqremain_release(void)
44 {
45 	if (remain_irqs.count == 0) {
46 		return -1;
47 	}
48 
49 	mt_cirq_flush();
50 	mt_cirq_disable();
51 
52 	return 0;
53 }
54 
mt_lp_irqremain_init(void)55 void mt_lp_irqremain_init(void)
56 {
57 	uint32_t idx;
58 
59 	remain_irqs.count = 0;
60 
61 	/*edge keypad*/
62 	idx = remain_irqs.count;
63 	remain_irqs.irqs[idx] = KEYPAD_IRQ_ID;
64 	remain_irqs.wakeupsrc_cat[idx] = 0;
65 	remain_irqs.wakeupsrc[idx] = KEYPAD_WAKESRC;
66 	remain_irqs.count++;
67 
68 	mt_lp_irqremain_submit();
69 }
70