1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- /*
- * Dynamic IRQ management
- *
- * Copyright (C) 2010 Paul Mundt
- *
- * Modelled after arch/x86/kernel/apic/io_apic.c
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
- #define pr_fmt(fmt) "intc: " fmt
- #include <linux/irq.h>
- #include <linux/bitmap.h>
- #include <linux/spinlock.h>
- #include "internals.h" /* only for activate_irq() damage.. */
- /*
- * The IRQ bitmap provides a global map of bound IRQ vectors for a
- * given platform. Allocation of IRQs are either static through the CPU
- * vector map, or dynamic in the case of board mux vectors or MSI.
- *
- * As this is a central point for all IRQ controllers on the system,
- * each of the available sources are mapped out here. This combined with
- * sparseirq makes it quite trivial to keep the vector map tightly packed
- * when dynamically creating IRQs, as well as tying in to otherwise
- * unused irq_desc positions in the sparse array.
- */
- /*
- * Dynamic IRQ allocation and deallocation
- */
- unsigned int create_irq_nr(unsigned int irq_want, int node)
- {
- int irq = irq_alloc_desc_at(irq_want, node);
- if (irq < 0)
- return 0;
- activate_irq(irq);
- return irq;
- }
- int create_irq(void)
- {
- int irq = irq_alloc_desc(numa_node_id());
- if (irq >= 0)
- activate_irq(irq);
- return irq;
- }
- void destroy_irq(unsigned int irq)
- {
- irq_free_desc(irq);
- }
- void reserve_intc_vectors(struct intc_vect *vectors, unsigned int nr_vecs)
- {
- int i;
- for (i = 0; i < nr_vecs; i++)
- irq_reserve_irq(evt2irq(vectors[i].vect));
- }
|