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