blob: f415cb82b07c7734300907308c27a8faee30ce1c [file] [log] [blame]
Edward-JW Yang9c783682021-06-28 11:08:10 +08001/*
developerbdeb0ba2022-07-08 14:48:56 +08002 * Copyright (c) 2021-2022, MediaTek Inc. All rights reserved.
Edward-JW Yang9c783682021-06-28 11:08:10 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
developerbdeb0ba2022-07-08 14:48:56 +08007#include <mt_cirq.h>
Edward-JW Yang9c783682021-06-28 11:08:10 +08008#include <mt_lp_irqremain.h>
developerbdeb0ba2022-07-08 14:48:56 +08009#include <mt_lp_rm.h>
Edward-JW Yang9c783682021-06-28 11:08:10 +080010#include <plat_mtk_lpm.h>
11
Edward-JW Yang9c783682021-06-28 11:08:10 +080012#define KEYPAD_IRQ_ID U(138)
13
14#define KEYPAD_WAKESRC 0x4
15
16static struct mt_irqremain remain_irqs;
17
18int 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
30int 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
43int 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
55void 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}