[PATCH] genirq: irq: add a dynamic irq creation API
[deliverable/linux.git] / kernel / irq / chip.c
index ac1f850d4937e5a020f22132a83da5a49fe9a3bf..0dc24386dd9991023174bb0c7e7e52d610c3d85c 100644 (file)
 
 #include "internals.h"
 
+/**
+ *     dynamic_irq_init - initialize a dynamically allocated irq
+ *     @irq:   irq number to initialize
+ */
+void dynamic_irq_init(unsigned int irq)
+{
+       struct irq_desc *desc;
+       unsigned long flags;
+
+       if (irq >= NR_IRQS) {
+               printk(KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
+               WARN_ON(1);
+               return;
+       }
+
+       /* Ensure we don't have left over values from a previous use of this irq */
+       desc = irq_desc + irq;
+       spin_lock_irqsave(&desc->lock, flags);
+       desc->status = IRQ_DISABLED;
+       desc->chip = &no_irq_chip;
+       desc->handle_irq = handle_bad_irq;
+       desc->depth = 1;
+       desc->handler_data = NULL;
+       desc->chip_data = NULL;
+       desc->action = NULL;
+       desc->irq_count = 0;
+       desc->irqs_unhandled = 0;
+#ifdef CONFIG_SMP
+       desc->affinity = CPU_MASK_ALL;
+#endif
+       spin_unlock_irqrestore(&desc->lock, flags);
+}
+
+/**
+ *     dynamic_irq_cleanup - cleanup a dynamically allocated irq
+ *     @irq:   irq number to initialize
+ */
+void dynamic_irq_cleanup(unsigned int irq)
+{
+       struct irq_desc *desc;
+       unsigned long flags;
+
+       if (irq >= NR_IRQS) {
+               printk(KERN_ERR "Trying to cleanup invalid IRQ%d\n", irq);
+               WARN_ON(1);
+               return;
+       }
+
+       desc = irq_desc + irq;
+       spin_lock_irqsave(&desc->lock, flags);
+       desc->handle_irq = handle_bad_irq;
+       desc->chip = &no_irq_chip;
+       spin_unlock_irqrestore(&desc->lock, flags);
+}
+
+
 /**
  *     set_irq_chip - set the irq chip for an irq
  *     @irq:   irq number
@@ -40,10 +96,6 @@ int set_irq_chip(unsigned int irq, struct irq_chip *chip)
        spin_lock_irqsave(&desc->lock, flags);
        irq_chip_set_defaults(chip);
        desc->chip = chip;
-       /*
-        * For compatibility only:
-        */
-       desc->chip = chip;
        spin_unlock_irqrestore(&desc->lock, flags);
 
        return 0;
@@ -146,7 +198,7 @@ static void default_disable(unsigned int irq)
        struct irq_desc *desc = irq_desc + irq;
 
        if (!(desc->status & IRQ_DELAYED_DISABLE))
-               irq_desc[irq].chip->mask(irq);
+               desc->chip->mask(irq);
 }
 
 /*
This page took 0.035072 seconds and 5 git commands to generate.