1 /*
2 * Copyright (c) 2025 Andrew Featherstone
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #define DT_DRV_COMPAT hazard3_hazard3_intc
8
9 #include <zephyr/kernel.h>
10 #include <zephyr/arch/cpu.h>
11 #include <zephyr/irq.h>
12 #include <zephyr/device.h>
13 #include <zephyr/types.h>
14 #include <zephyr/arch/riscv/csr.h>
15 #include <zephyr/arch/riscv/irq.h>
16
17 #include <pico/runtime_init.h>
18 #include <hardware/irq.h>
19
20 #define CSR_WINDOW_SIZE 16
21
arch_irq_enable(unsigned int irq)22 void arch_irq_enable(unsigned int irq)
23 {
24 irq_set_enabled(irq, true);
25 }
26
arch_irq_disable(unsigned int irq)27 void arch_irq_disable(unsigned int irq)
28 {
29 irq_set_enabled(irq, false);
30 }
31
arch_irq_is_enabled(unsigned int irq)32 int arch_irq_is_enabled(unsigned int irq)
33 {
34 return pico_irq_is_enabled(irq);
35 }
36
hazard3_irq_init(const struct device * dev)37 static int hazard3_irq_init(const struct device *dev)
38 {
39 /* Clear all IRQ force array bits. */
40 for (int i = 0; (i * CSR_WINDOW_SIZE) < CONFIG_NUM_IRQS; i++) {
41 hazard3_irqarray_clear(RVCSR_MEIFA_OFFSET, i, -1);
42 }
43
44 /* Global external IRQ enable. */
45 csr_write(mie, RVCSR_MIE_MEIE_BITS);
46
47 csr_set(mstatus, MSTATUS_IEN);
48
49 return 0;
50 }
51
52 DEVICE_DT_INST_DEFINE(0, hazard3_irq_init, NULL, NULL, NULL,
53 PRE_KERNEL_1, CONFIG_INTC_INIT_PRIORITY, NULL);
54