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)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 mt_lp_irqremain_aquire(void)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 mt_lp_irqremain_release(void)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 mt_lp_irqremain_init(void)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 } 70