|
@@ -54,13 +54,6 @@ static DEFINE_PER_CPU(unsigned long, irq_disable_mask)
|
|
|
*/
|
|
|
static DEFINE_PER_CPU(int, irq_depth);
|
|
|
|
|
|
-/* State for allocating IRQs on Gx. */
|
|
|
-#if CHIP_HAS_IPI()
|
|
|
-static unsigned long available_irqs = ((1UL << NR_IRQS) - 1) &
|
|
|
- (~(1UL << IRQ_RESCHEDULE));
|
|
|
-static DEFINE_SPINLOCK(available_irqs_lock);
|
|
|
-#endif
|
|
|
-
|
|
|
#if CHIP_HAS_IPI()
|
|
|
/* Use SPRs to manipulate device interrupts. */
|
|
|
#define mask_irqs(irq_mask) __insn_mtspr(SPR_IPI_MASK_SET_K, irq_mask)
|
|
@@ -278,50 +271,11 @@ int arch_show_interrupts(struct seq_file *p, int prec)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Generic, controller-independent functions:
|
|
|
- */
|
|
|
-
|
|
|
#if CHIP_HAS_IPI()
|
|
|
-int create_irq(void)
|
|
|
-{
|
|
|
- unsigned long flags;
|
|
|
- int result;
|
|
|
-
|
|
|
- spin_lock_irqsave(&available_irqs_lock, flags);
|
|
|
- if (available_irqs == 0)
|
|
|
- result = -ENOMEM;
|
|
|
- else {
|
|
|
- result = __ffs(available_irqs);
|
|
|
- available_irqs &= ~(1UL << result);
|
|
|
- dynamic_irq_init(result);
|
|
|
- }
|
|
|
- spin_unlock_irqrestore(&available_irqs_lock, flags);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(create_irq);
|
|
|
-
|
|
|
-void destroy_irq(unsigned int irq)
|
|
|
-{
|
|
|
- unsigned long flags;
|
|
|
-
|
|
|
- spin_lock_irqsave(&available_irqs_lock, flags);
|
|
|
- available_irqs |= (1UL << irq);
|
|
|
- dynamic_irq_cleanup(irq);
|
|
|
- spin_unlock_irqrestore(&available_irqs_lock, flags);
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(destroy_irq);
|
|
|
-
|
|
|
-unsigned int irq_alloc_hwirq(int node)
|
|
|
-{
|
|
|
- int ret = create_irq();
|
|
|
- return ret < 0 ? 0 : ret;
|
|
|
-}
|
|
|
-
|
|
|
-void irq_free_hwirq(unsigned int irq)
|
|
|
+int arch_setup_hwirq(unsigned int irq, int node)
|
|
|
{
|
|
|
- destroy_irq(irq);
|
|
|
+ return irq >= NR_IRQS ? -EINVAL : 0;
|
|
|
}
|
|
|
|
|
|
+void arch_teardown_hwirq(unsigned int irq) { }
|
|
|
#endif
|