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