Skip to content

Commit

Permalink
sh: Tie sparseirq in to Kconfig.
Browse files Browse the repository at this point in the history
Now that the dependent patches are merged, we are ready to enable
sparseirq support. This simply adds the Kconfig option, and then converts
from the _cpu to the _node allocation routines to follow the upstream
sparseirq API changes.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed Jun 11, 2009
1 parent 6a1555f commit 54ff328
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 11 deletions.
12 changes: 12 additions & 0 deletions arch/sh/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -678,6 +678,18 @@ config GUSA_RB
LLSC, this should be more efficient than the other alternative of
disabling interrupts around the atomic sequence.

config SPARSE_IRQ
bool "Support sparse irq numbering"
depends on EXPERIMENTAL
help
This enables support for sparse irqs. This is useful in general
as most CPUs have a fairly sparse array of IRQ vectors, which
the irq_desc then maps directly on to. Systems with a high
number of off-chip IRQs will want to treat this as
experimental until they have been independently verified.

If you don't know what to do here, say N.

endmenu

menu "Boot options"
Expand Down
7 changes: 2 additions & 5 deletions arch/sh/kernel/cpu/irq/ipr.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <linux/module.h>
#include <linux/io.h>
#include <linux/interrupt.h>
#include <linux/topology.h>

static inline struct ipr_desc *get_ipr_desc(unsigned int irq)
{
Expand Down Expand Up @@ -59,21 +60,17 @@ void register_ipr_controller(struct ipr_desc *desc)

for (i = 0; i < desc->nr_irqs; i++) {
struct ipr_data *p = desc->ipr_data + i;
#ifdef CONFIG_SPARSE_IRQ
struct irq_desc *irq_desc;
#endif

BUG_ON(p->ipr_idx >= desc->nr_offsets);
BUG_ON(!desc->ipr_offsets[p->ipr_idx]);

#ifdef CONFIG_SPARSE_IRQ
irq_desc = irq_to_desc_alloc_cpu(p->irq, smp_processor_id());
irq_desc = irq_to_desc_alloc_node(p->irq, numa_node_id());
if (unlikely(!irq_desc)) {
printk(KERN_INFO "can not get irq_desc for %d\n",
p->irq);
continue;
}
#endif

disable_irq_nosync(p->irq);
set_irq_chip_and_handler_name(p->irq, &desc->chip,
Expand Down
10 changes: 4 additions & 6 deletions drivers/sh/intc.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <linux/sh_intc.h>
#include <linux/sysdev.h>
#include <linux/list.h>
#include <linux/topology.h>

#define _INTC_MK(fn, mode, addr_e, addr_d, width, shift) \
((shift) | ((width) << 5) | ((fn) << 9) | ((mode) << 13) | \
Expand Down Expand Up @@ -671,7 +672,7 @@ unsigned int intc_evt2irq(unsigned int vector)

void __init register_intc_controller(struct intc_desc *desc)
{
unsigned int i, k, smp, cpu = smp_processor_id();
unsigned int i, k, smp;
struct intc_desc_int *d;

d = alloc_bootmem(sizeof(*d));
Expand Down Expand Up @@ -771,19 +772,16 @@ void __init register_intc_controller(struct intc_desc *desc)
for (i = 0; i < desc->nr_vectors; i++) {
struct intc_vect *vect = desc->vectors + i;
unsigned int irq = evt2irq(vect->vect);
#ifdef CONFIG_SPARSE_IRQ
struct irq_desc *irq_desc;
#endif

if (!vect->enum_id)
continue;

#ifdef CONFIG_SPARSE_IRQ
irq_desc = irq_to_desc_alloc_cpu(irq, cpu);
irq_desc = irq_to_desc_alloc_node(irq, numa_node_id());
if (unlikely(!irq_desc)) {
printk(KERN_INFO "can not get irq_desc for %d\n", irq);
continue;
}
#endif

intc_register_irq(desc, d, vect->enum_id, irq);
}
Expand Down

0 comments on commit 54ff328

Please sign in to comment.