#include #include #include #include #include #include #if defined(__x86_64__) #include #include #endif static struct rb_node_link* irq_tree = NULL; static spin_lock_t irqs_lock = SPIN_LOCK_INIT; bool irq_attach(irq_func_t func, void* arg, uint32_t irq_num) { uint64_t fiq; struct irq* irq = malloc(sizeof(*irq)); if (irq == NULL) { return false; } irq->func = func; irq->arg = arg; irq->irq_num = irq_num; spin_lock(&irqs_lock, &fiq); rbtree_insert(struct irq, &irq_tree, &irq->irq_tree_link, irq_tree_link, irq_num); spin_unlock(&irqs_lock, fiq); return true; } void irq_detach(uint32_t irq_num) { uint64_t fiq; struct irq* irq = irq_find(irq_num); spin_lock(&irqs_lock, &fiq); rbtree_delete(&irq_tree, &irq->irq_tree_link); spin_unlock(&irqs_lock, fiq); free(irq); } struct irq* irq_find(uint32_t irq_num) { uint64_t fiq; struct irq* irq = NULL; spin_lock(&irqs_lock, &fiq); rbtree_find(struct irq, &irq_tree, irq_num, irq, irq_tree_link, irq_num); spin_unlock(&irqs_lock, fiq); return irq; }