10
#include <drivers/irqctrl.h>
11
#include <kernel/critical.h>
12
#include <kernel/irq.h>
13
#include <kernel/printk.h>
15
#include <module/embox/driver/interrupt/vic_impl.h>
20
static int vic_irqctrl_init(void) {
26
IRQCTRL_DEF(vic, vic_irqctrl_init);
28
void irqctrl_enable(unsigned int irq) {
29
assert(irq_nr_valid(irq));
31
__irqctrl_enable(irq);
34
void irqctrl_disable(unsigned int irq) {
35
assert(irq_nr_valid(irq));
39
VIC_REG_STORE(irq / VIC_IRQ_COUNT, VIC_SOFT_DISABLE,
40
1U << (irq % VIC_IRQ_COUNT));
42
__irqctrl_disable(irq);
45
void irqctrl_force(unsigned int irq) {
46
assert(irq_nr_valid(irq));
49
VIC_REG_STORE(irq / VIC_IRQ_COUNT, VIC_SOFT_ENABLE,
50
1U << (irq % VIC_IRQ_COUNT));
53
void irqctrl_eoi(unsigned int irq) {
56
assert(irq_nr_valid(irq));
60
for (i = 0; i < VIC_DEVICE_COUNT; i++) {
61
VIC_REG_STORE(i, VIC_ADDR, irq);
65
unsigned int irqctrl_get_intid(void) {
68
return VIC_REG_LOAD(0, VIC_ADDR);