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 Yangint 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 Yangint 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 Yangint 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 Yangvoid 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