xref: /rk3399_ARM-atf/plat/mediatek/mt8186/drivers/mcdi/mt_lp_irqremain.c (revision 04f28f895f1dc8683838a1382c8f92881f4cf21d)
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 chen int 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 chen int 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 chen int 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 chen void 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