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)20void arch_irq_enable(unsigned int irq) 21 { 22 PFIC->IENR[irq / 32] = BIT(irq % 32); 23 } 24 arch_irq_disable(unsigned int irq)25void arch_irq_disable(unsigned int irq) 26 { 27 PFIC->IRER[irq / 32] = BIT(irq % 32); 28 } 29 arch_irq_is_enabled(unsigned int irq)30int arch_irq_is_enabled(unsigned int irq) 31 { 32 return ((PFIC->ISR[irq >> 5] & BIT(irq & 0x1F)) != 0); 33 } 34 pfic_init(void)35static 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