[MIPS] Make irq number allocator generally available for fixing EV64120.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
@@ -26,6 +26,48 @@
|
|||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
|
static unsigned long irq_map[NR_IRQS / BITS_PER_LONG];
|
||||||
|
|
||||||
|
int __devinit allocate_irqno(void)
|
||||||
|
{
|
||||||
|
int irq;
|
||||||
|
|
||||||
|
again:
|
||||||
|
irq = find_first_zero_bit(irq_map, NR_IRQS);
|
||||||
|
|
||||||
|
if (irq >= NR_IRQS)
|
||||||
|
return -ENOSPC;
|
||||||
|
|
||||||
|
if (test_and_set_bit(irq, irq_map))
|
||||||
|
goto again;
|
||||||
|
|
||||||
|
return irq;
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL_GPL(allocate_irqno);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate the 16 legacy interrupts for i8259 devices. This happens early
|
||||||
|
* in the kernel initialization so treating allocation failure as BUG() is
|
||||||
|
* ok.
|
||||||
|
*/
|
||||||
|
void __init alloc_legacy_irqno(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i <= 16; i++)
|
||||||
|
BUG_ON(test_and_set_bit(i, irq_map));
|
||||||
|
}
|
||||||
|
|
||||||
|
void __devinit free_irqno(unsigned int irq)
|
||||||
|
{
|
||||||
|
smp_mb__before_clear_bit();
|
||||||
|
clear_bit(irq, irq_map);
|
||||||
|
smp_mb__after_clear_bit();
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL_GPL(free_irqno);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 'what should we do if we get a hw irq event on an illegal vector'.
|
* 'what should we do if we get a hw irq event on an illegal vector'.
|
||||||
* each architecture has to answer this themselves.
|
* each architecture has to answer this themselves.
|
||||||
|
@@ -354,29 +354,6 @@ static struct irq_chip bridge_irq_type = {
|
|||||||
.end = end_bridge_irq,
|
.end = end_bridge_irq,
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned long irq_map[NR_IRQS / BITS_PER_LONG];
|
|
||||||
|
|
||||||
int allocate_irqno(void)
|
|
||||||
{
|
|
||||||
int irq;
|
|
||||||
|
|
||||||
again:
|
|
||||||
irq = find_first_zero_bit(irq_map, NR_IRQS);
|
|
||||||
|
|
||||||
if (irq >= NR_IRQS)
|
|
||||||
return -ENOSPC;
|
|
||||||
|
|
||||||
if (test_and_set_bit(irq, irq_map))
|
|
||||||
goto again;
|
|
||||||
|
|
||||||
return irq;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_irqno(unsigned int irq)
|
|
||||||
{
|
|
||||||
clear_bit(irq, irq_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __devinit register_bridge_irq(unsigned int irq)
|
void __devinit register_bridge_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
irq_desc[irq].status = IRQ_DISABLED;
|
irq_desc[irq].status = IRQ_DISABLED;
|
||||||
|
@@ -214,8 +214,6 @@ static struct irqaction rt_irqaction = {
|
|||||||
.name = "timer"
|
.name = "timer"
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int allocate_irqno(void);
|
|
||||||
|
|
||||||
void __init plat_timer_setup(struct irqaction *irq)
|
void __init plat_timer_setup(struct irqaction *irq)
|
||||||
{
|
{
|
||||||
int irqno = allocate_irqno();
|
int irqno = allocate_irqno();
|
||||||
|
@@ -74,4 +74,8 @@ extern int setup_irq_smtc(unsigned int irq, struct irqaction * new,
|
|||||||
unsigned long hwmask);
|
unsigned long hwmask);
|
||||||
#endif /* CONFIG_MIPS_MT_SMTC */
|
#endif /* CONFIG_MIPS_MT_SMTC */
|
||||||
|
|
||||||
|
extern int allocate_irqno(void);
|
||||||
|
extern void alloc_legacy_irqno(void);
|
||||||
|
extern void free_irqno(unsigned int irq);
|
||||||
|
|
||||||
#endif /* _ASM_IRQ_H */
|
#endif /* _ASM_IRQ_H */
|
||||||
|
Reference in New Issue
Block a user