1/* 2 * Dynamic IRQ management 3 * 4 * Copyright (C) 2010 Paul Mundt 5 * 6 * Modelled after arch/x86/kernel/apic/io_apic.c 7 * 8 * This file is subject to the terms and conditions of the GNU General Public 9 * License. See the file "COPYING" in the main directory of this archive 10 * for more details. 11 */ 12#define pr_fmt(fmt) "intc: " fmt 13 14#include <linux/irq.h> 15#include <linux/bitmap.h> 16#include <linux/spinlock.h> 17#include <linux/module.h> 18#include "internals.h" /* only for activate_irq() damage.. */ 19 20/* 21 * The IRQ bitmap provides a global map of bound IRQ vectors for a 22 * given platform. Allocation of IRQs are either static through the CPU 23 * vector map, or dynamic in the case of board mux vectors or MSI. 24 * 25 * As this is a central point for all IRQ controllers on the system, 26 * each of the available sources are mapped out here. This combined with 27 * sparseirq makes it quite trivial to keep the vector map tightly packed 28 * when dynamically creating IRQs, as well as tying in to otherwise 29 * unused irq_desc positions in the sparse array. 30 */ 31 32/* 33 * Dynamic IRQ allocation and deallocation 34 */ 35unsigned int create_irq_nr(unsigned int irq_want, int node) 36{ 37 int irq = irq_alloc_desc_at(irq_want, node); 38 if (irq < 0) 39 return 0; 40 41 activate_irq(irq); 42 return irq; 43} 44 45int create_irq(void) 46{ 47 int irq = irq_alloc_desc(numa_node_id()); 48 if (irq >= 0) 49 activate_irq(irq); 50 51 return irq; 52} 53 54void destroy_irq(unsigned int irq) 55{ 56 irq_free_desc(irq); 57} 58 59void reserve_intc_vectors(struct intc_vect *vectors, unsigned int nr_vecs) 60{ 61 int i; 62 63 for (i = 0; i < nr_vecs; i++) 64 irq_reserve_irq(evt2irq(vectors[i].vect)); 65} 66