1 /*
2  * Copyright (c) 2024 Michael Hope
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #define DT_DRV_COMPAT wch_pfic
8 
9 #include <hal_ch32fun.h>
10 
11 #include <zephyr/arch/cpu.h>
12 #include <zephyr/init.h>
13 #include <zephyr/irq.h>
14 #include <zephyr/kernel.h>
15 #include <zephyr/sys/util.h>
16 
17 #define SEVONPEND BIT(4)
18 #define WFITOWFE  BIT(3)
19 
arch_irq_enable(unsigned int irq)20 void arch_irq_enable(unsigned int irq)
21 {
22 	PFIC->IENR[irq / 32] = BIT(irq % 32);
23 }
24 
arch_irq_disable(unsigned int irq)25 void arch_irq_disable(unsigned int irq)
26 {
27 	PFIC->IRER[irq / 32] = BIT(irq % 32);
28 }
29 
arch_irq_is_enabled(unsigned int irq)30 int arch_irq_is_enabled(unsigned int irq)
31 {
32 	return ((PFIC->ISR[irq >> 5] & BIT(irq & 0x1F)) != 0);
33 }
34 
pfic_init(void)35 static int pfic_init(void)
36 {
37 	/* `wfi` is called with interrupts disabled. Configure the PFIC to wake up on any event,
38 	 * including any interrupt.
39 	 */
40 	PFIC->SCTLR = SEVONPEND | WFITOWFE;
41 	return 0;
42 }
43 
44 SYS_INIT(pfic_init, PRE_KERNEL_1, CONFIG_INTC_INIT_PRIORITY);
45