Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a4cf779 authored by Ralf Baechle's avatar Ralf Baechle
Browse files

[MIPS] Make irq number allocator generally available for fixing EV64120.

parent 325d08d1
Loading
Loading
Loading
Loading
+42 −0
Original line number Original line Diff line number Diff line
@@ -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.
+0 −23
Original line number Original line Diff line number Diff line
@@ -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;
+0 −2
Original line number Original line Diff line number Diff line
@@ -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();
+4 −0
Original line number Original line Diff line number Diff line
@@ -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 */