Skip to content

Commit

Permalink
sh: intc: Handle legacy IRQ reservation in vector map.
Browse files Browse the repository at this point in the history
Different CPUs will have different starting vectors, with varying
amounts of reserved or unusable vector space prior to the first slot.
This introduces a legacy vector reservation system that inserts itself in
between the CPU vector map registration and the platform specific IRQ
setup. This works fine in practice as the only new vectors that boards
need to establish on their own should be dynamically allocated rather
than arbitrarily assigned. As a plus, this also makes all of the
converted platforms sparseirq ready.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed Nov 2, 2009
1 parent 3d0de41 commit 45b9dea
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
6 changes: 6 additions & 0 deletions arch/sh/kernel/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,12 @@ void __init init_IRQ(void)
{
plat_irq_setup();

/*
* Pin any of the legacy IRQ vectors that haven't already been
* grabbed by the platform
*/
reserve_irq_legacy();

/* Perform the machine specific initialisation */
if (sh_mv.mv_init_irq)
sh_mv.mv_init_irq();
Expand Down
25 changes: 25 additions & 0 deletions drivers/sh/intc.c
Original file line number Diff line number Diff line change
Expand Up @@ -928,3 +928,28 @@ void destroy_irq(unsigned int irq)
__clear_bit(irq, intc_irq_map);
spin_unlock_irqrestore(&vector_lock, flags);
}

int reserve_irq_vector(unsigned int irq)
{
unsigned long flags;
int ret = 0;

spin_lock_irqsave(&vector_lock, flags);
if (test_and_set_bit(irq, intc_irq_map))
ret = -EBUSY;
spin_unlock_irqrestore(&vector_lock, flags);

return ret;
}

void reserve_irq_legacy(void)
{
unsigned long flags;
int i, j;

spin_lock_irqsave(&vector_lock, flags);
j = find_first_bit(intc_irq_map, nr_irqs);
for (i = 0; i < j; i++)
__set_bit(i, intc_irq_map);
spin_unlock_irqrestore(&vector_lock, flags);
}
3 changes: 3 additions & 0 deletions include/linux/sh_intc.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,7 @@ struct intc_desc symbol __initdata = { \
void __init register_intc_controller(struct intc_desc *desc);
int intc_set_priority(unsigned int irq, unsigned int prio);

int reserve_irq_vector(unsigned int irq);
void reserve_irq_legacy(void);

#endif /* __SH_INTC_H */

0 comments on commit 45b9dea

Please sign in to comment.