17ac6a76cSjason-ch chen /* 27ac6a76cSjason-ch chen * Copyright (c) 2022, MediaTek Inc. All rights reserved. 37ac6a76cSjason-ch chen * 47ac6a76cSjason-ch chen * SPDX-License-Identifier: BSD-3-Clause 57ac6a76cSjason-ch chen */ 67ac6a76cSjason-ch chen 7*cc76896dSRex-BC Chen #include <mt_cirq.h> 87ac6a76cSjason-ch chen #include <mt_lp_irqremain.h> 97ac6a76cSjason-ch chen #include <mt_lp_rm.h> 107ac6a76cSjason-ch chen #include <plat_mtk_lpm.h> 117ac6a76cSjason-ch chen 127ac6a76cSjason-ch chen #define KEYPAD_IRQ_ID U(138) 137ac6a76cSjason-ch chen #define KEYPAD_WAKESRC (0x4U) 147ac6a76cSjason-ch chen 157ac6a76cSjason-ch chen static struct mt_irqremain remain_irqs; 167ac6a76cSjason-ch chen mt_lp_irqremain_submit(void)177ac6a76cSjason-ch chenint mt_lp_irqremain_submit(void) 187ac6a76cSjason-ch chen { 197ac6a76cSjason-ch chen int ret = 0; 207ac6a76cSjason-ch chen 217ac6a76cSjason-ch chen if (remain_irqs.count == 0) { 227ac6a76cSjason-ch chen ret = -1; 237ac6a76cSjason-ch chen } else { 247ac6a76cSjason-ch chen set_wakeup_sources(remain_irqs.irqs, remain_irqs.count); 257ac6a76cSjason-ch chen mt_lp_rm_do_update(-1, PLAT_RC_UPDATE_REMAIN_IRQS, &remain_irqs); 267ac6a76cSjason-ch chen } 277ac6a76cSjason-ch chen 287ac6a76cSjason-ch chen return ret; 297ac6a76cSjason-ch chen } 307ac6a76cSjason-ch chen mt_lp_irqremain_aquire(void)317ac6a76cSjason-ch chenint mt_lp_irqremain_aquire(void) 327ac6a76cSjason-ch chen { 337ac6a76cSjason-ch chen int ret = 0; 347ac6a76cSjason-ch chen 357ac6a76cSjason-ch chen if (remain_irqs.count == 0) { 367ac6a76cSjason-ch chen ret = -1; 377ac6a76cSjason-ch chen } else { 387ac6a76cSjason-ch chen mt_cirq_sw_reset(); 397ac6a76cSjason-ch chen mt_cirq_clone_gic(); 407ac6a76cSjason-ch chen mt_cirq_enable(); 417ac6a76cSjason-ch chen } 427ac6a76cSjason-ch chen 437ac6a76cSjason-ch chen return ret; 447ac6a76cSjason-ch chen } 457ac6a76cSjason-ch chen mt_lp_irqremain_release(void)467ac6a76cSjason-ch chenint mt_lp_irqremain_release(void) 477ac6a76cSjason-ch chen { 487ac6a76cSjason-ch chen int ret = 0; 497ac6a76cSjason-ch chen 507ac6a76cSjason-ch chen if (remain_irqs.count == 0) { 517ac6a76cSjason-ch chen ret = -1; 527ac6a76cSjason-ch chen } else { 537ac6a76cSjason-ch chen mt_cirq_flush(); 547ac6a76cSjason-ch chen mt_cirq_disable(); 557ac6a76cSjason-ch chen } 567ac6a76cSjason-ch chen 577ac6a76cSjason-ch chen return ret; 587ac6a76cSjason-ch chen } 597ac6a76cSjason-ch chen mt_lp_irqremain_init(void)607ac6a76cSjason-ch chenvoid mt_lp_irqremain_init(void) 617ac6a76cSjason-ch chen { 627ac6a76cSjason-ch chen uint32_t idx; 637ac6a76cSjason-ch chen 647ac6a76cSjason-ch chen remain_irqs.count = 0U; 657ac6a76cSjason-ch chen 667ac6a76cSjason-ch chen /*edge keypad*/ 677ac6a76cSjason-ch chen idx = remain_irqs.count; 687ac6a76cSjason-ch chen remain_irqs.irqs[idx] = KEYPAD_IRQ_ID; 697ac6a76cSjason-ch chen remain_irqs.wakeupsrc_cat[idx] = 0U; 707ac6a76cSjason-ch chen remain_irqs.wakeupsrc[idx] = KEYPAD_WAKESRC; 717ac6a76cSjason-ch chen remain_irqs.count++; 727ac6a76cSjason-ch chen 737ac6a76cSjason-ch chen mt_lp_irqremain_submit(); 747ac6a76cSjason-ch chen } 75