Skip to content

Commit

Permalink
[MIPS] Make irq number allocator generally available for fixing EV64120.
Browse files Browse the repository at this point in the history
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
  • Loading branch information
Ralf Baechle committed Nov 6, 2006
1 parent 325d08d commit 4a4cf77
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 25 deletions.
42 changes: 42 additions & 0 deletions arch/mips/kernel/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,48 @@
#include <asm/system.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'.
* each architecture has to answer this themselves.
Expand Down
23 changes: 0 additions & 23 deletions arch/mips/sgi-ip27/ip27-irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,29 +354,6 @@ static struct irq_chip bridge_irq_type = {
.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)
{
irq_desc[irq].status = IRQ_DISABLED;
Expand Down
2 changes: 0 additions & 2 deletions arch/mips/sgi-ip27/ip27-timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,6 @@ static struct irqaction rt_irqaction = {
.name = "timer"
};

extern int allocate_irqno(void);

void __init plat_timer_setup(struct irqaction *irq)
{
int irqno = allocate_irqno();
Expand Down
4 changes: 4 additions & 0 deletions include/asm-mips/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,8 @@ extern int setup_irq_smtc(unsigned int irq, struct irqaction * new,
unsigned long hwmask);
#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 */

0 comments on commit 4a4cf77

Please sign in to comment.