1df60025fSRoger Lu /* 2*cc76896dSRex-BC Chen * Copyright (c) 2020-2022, MediaTek Inc. All rights reserved. 3df60025fSRoger Lu * 4df60025fSRoger Lu * SPDX-License-Identifier: BSD-3-Clause 5df60025fSRoger Lu */ 6df60025fSRoger Lu 7*cc76896dSRex-BC Chen #include <mt_cirq.h> 8df60025fSRoger Lu #include <mt_lp_irqremain.h> 9*cc76896dSRex-BC Chen #include <mt_lp_rm.h> 10df60025fSRoger Lu #include <plat_mtk_lpm.h> 11df60025fSRoger Lu 12df60025fSRoger Lu #define EDMA0_IRQ_ID U(448) 13df60025fSRoger Lu #define MDLA_IRQ_ID U(446) 14df60025fSRoger Lu #define MALI4_IRQ_ID U(399) 15df60025fSRoger Lu #define MALI3_IRQ_ID U(398) 16df60025fSRoger Lu #define MALI2_IRQ_ID U(397) 17df60025fSRoger Lu #define MALI1_IRQ_ID U(396) 18df60025fSRoger Lu #define MALI0_IRQ_ID U(395) 19df60025fSRoger Lu #define VPU_CORE1_IRQ_ID U(453) 20df60025fSRoger Lu #define VPU_CORE0_IRQ_ID U(452) 21df60025fSRoger Lu #define MD_WDT_IRQ_ID U(110) 22df60025fSRoger Lu #define KEYPAD_IRQ_ID U(106) 23df60025fSRoger Lu 24df60025fSRoger Lu #define MD_WDT_WAKESRC 0x2000000 25df60025fSRoger Lu #define KEYPAD_WAKESRC 0x4 26df60025fSRoger Lu 27df60025fSRoger Lu static struct mt_irqremain remain_irqs; 28df60025fSRoger Lu mt_lp_irqremain_submit(void)29df60025fSRoger Luint mt_lp_irqremain_submit(void) 30df60025fSRoger Lu { 31df60025fSRoger Lu if (remain_irqs.count == 0) { 32df60025fSRoger Lu return -1; 33df60025fSRoger Lu } 34df60025fSRoger Lu 35df60025fSRoger Lu set_wakeup_sources(remain_irqs.irqs, remain_irqs.count); 36df60025fSRoger Lu mt_lp_rm_do_update(-1, PLAT_RC_UPDATE_REMAIN_IRQS, &remain_irqs); 37df60025fSRoger Lu 38df60025fSRoger Lu return 0; 39df60025fSRoger Lu } 40df60025fSRoger Lu mt_lp_irqremain_aquire(void)41df60025fSRoger Luint mt_lp_irqremain_aquire(void) 42df60025fSRoger Lu { 43df60025fSRoger Lu if (remain_irqs.count == 0) { 44df60025fSRoger Lu return -1; 45df60025fSRoger Lu } 46df60025fSRoger Lu 47df60025fSRoger Lu mt_cirq_sw_reset(); 48df60025fSRoger Lu mt_cirq_clone_gic(); 49df60025fSRoger Lu mt_cirq_enable(); 50df60025fSRoger Lu 51df60025fSRoger Lu return 0; 52df60025fSRoger Lu } 53df60025fSRoger Lu mt_lp_irqremain_release(void)54df60025fSRoger Luint mt_lp_irqremain_release(void) 55df60025fSRoger Lu { 56df60025fSRoger Lu if (remain_irqs.count == 0) { 57df60025fSRoger Lu return -1; 58df60025fSRoger Lu } 59df60025fSRoger Lu 60df60025fSRoger Lu mt_cirq_flush(); 61df60025fSRoger Lu mt_cirq_disable(); 62df60025fSRoger Lu 63df60025fSRoger Lu return 0; 64df60025fSRoger Lu } 65df60025fSRoger Lu mt_lp_irqremain_init(void)66df60025fSRoger Luvoid mt_lp_irqremain_init(void) 67df60025fSRoger Lu { 68df60025fSRoger Lu uint32_t idx; 69df60025fSRoger Lu 70df60025fSRoger Lu remain_irqs.count = 0; 71df60025fSRoger Lu 72df60025fSRoger Lu /* level edma0 */ 73df60025fSRoger Lu idx = remain_irqs.count; 74df60025fSRoger Lu remain_irqs.irqs[idx] = EDMA0_IRQ_ID; 75df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 76df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = 0; 77df60025fSRoger Lu remain_irqs.count++; 78df60025fSRoger Lu 79df60025fSRoger Lu /* level mdla */ 80df60025fSRoger Lu idx = remain_irqs.count; 81df60025fSRoger Lu remain_irqs.irqs[idx] = MDLA_IRQ_ID; 82df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 83df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = 0; 84df60025fSRoger Lu remain_irqs.count++; 85df60025fSRoger Lu 86df60025fSRoger Lu /* level mali4 */ 87df60025fSRoger Lu idx = remain_irqs.count; 88df60025fSRoger Lu remain_irqs.irqs[idx] = MALI4_IRQ_ID; 89df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 90df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = 0; 91df60025fSRoger Lu remain_irqs.count++; 92df60025fSRoger Lu 93df60025fSRoger Lu /* level mali3 */ 94df60025fSRoger Lu idx = remain_irqs.count; 95df60025fSRoger Lu remain_irqs.irqs[idx] = MALI3_IRQ_ID; 96df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 97df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = 0; 98df60025fSRoger Lu remain_irqs.count++; 99df60025fSRoger Lu 100df60025fSRoger Lu /* level mali2 */ 101df60025fSRoger Lu idx = remain_irqs.count; 102df60025fSRoger Lu remain_irqs.irqs[idx] = MALI2_IRQ_ID; 103df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 104df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = 0; 105df60025fSRoger Lu remain_irqs.count++; 106df60025fSRoger Lu 107df60025fSRoger Lu /* level mali1 */ 108df60025fSRoger Lu idx = remain_irqs.count; 109df60025fSRoger Lu remain_irqs.irqs[idx] = MALI1_IRQ_ID; 110df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 111df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = 0; 112df60025fSRoger Lu remain_irqs.count++; 113df60025fSRoger Lu 114df60025fSRoger Lu /* level mali0 */ 115df60025fSRoger Lu idx = remain_irqs.count; 116df60025fSRoger Lu remain_irqs.irqs[idx] = MALI0_IRQ_ID; 117df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 118df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = 0; 119df60025fSRoger Lu remain_irqs.count++; 120df60025fSRoger Lu 121df60025fSRoger Lu /* level vpu core1 */ 122df60025fSRoger Lu idx = remain_irqs.count; 123df60025fSRoger Lu remain_irqs.irqs[idx] = VPU_CORE1_IRQ_ID; 124df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 125df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = 0; 126df60025fSRoger Lu remain_irqs.count++; 127df60025fSRoger Lu 128df60025fSRoger Lu /* level vpu core0 */ 129df60025fSRoger Lu idx = remain_irqs.count; 130df60025fSRoger Lu remain_irqs.irqs[idx] = VPU_CORE0_IRQ_ID; 131df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 132df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = 0; 133df60025fSRoger Lu remain_irqs.count++; 134df60025fSRoger Lu 135df60025fSRoger Lu /* edge mdwdt */ 136df60025fSRoger Lu idx = remain_irqs.count; 137df60025fSRoger Lu remain_irqs.irqs[idx] = MD_WDT_IRQ_ID; 138df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 139df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = MD_WDT_WAKESRC; 140df60025fSRoger Lu remain_irqs.count++; 141df60025fSRoger Lu 142df60025fSRoger Lu /* edge keypad */ 143df60025fSRoger Lu idx = remain_irqs.count; 144df60025fSRoger Lu remain_irqs.irqs[idx] = KEYPAD_IRQ_ID; 145df60025fSRoger Lu remain_irqs.wakeupsrc_cat[idx] = 0; 146df60025fSRoger Lu remain_irqs.wakeupsrc[idx] = KEYPAD_WAKESRC; 147df60025fSRoger Lu remain_irqs.count++; 148df60025fSRoger Lu 149df60025fSRoger Lu mt_lp_irqremain_submit(); 150df60025fSRoger Lu } 151