Skip to content

Commit

Permalink
parisc: convert iosapic interrupts to proper flow handlers
Browse files Browse the repository at this point in the history
Shift the ->end call (cpu eoi) from __do_IRQ into our
unmask handler. Also nuke some redundant code.

Signed-off-by: Kyle McMartin <kyle@redhat.com>
  • Loading branch information
Kyle McMartin committed Oct 14, 2010
1 parent 4d4f681 commit f3d4605
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 32 deletions.
2 changes: 1 addition & 1 deletion arch/parisc/kernel/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ int cpu_claim_irq(unsigned int irq, struct irq_chip *type, void *data)

/* for iosapic interrupts */
if (type) {
set_irq_chip_and_handler(irq, type, parisc_do_IRQ);
set_irq_chip_and_handler(irq, type, handle_level_irq);
set_irq_chip_data(irq, data);
cpu_unmask_irq(irq);
}
Expand Down
37 changes: 6 additions & 31 deletions drivers/parisc/iosapic.c
Original file line number Diff line number Diff line change
Expand Up @@ -615,7 +615,7 @@ iosapic_set_irt_data( struct vector_info *vi, u32 *dp0, u32 *dp1)
}


static void iosapic_disable_irq(unsigned int irq)
static void iosapic_mask_irq(unsigned int irq)
{
unsigned long flags;
struct vector_info *vi = get_irq_chip_data(irq);
Expand All @@ -628,7 +628,7 @@ static void iosapic_disable_irq(unsigned int irq)
spin_unlock_irqrestore(&iosapic_lock, flags);
}

static void iosapic_enable_irq(unsigned int irq)
static void iosapic_unmask_irq(unsigned int irq)
{
struct vector_info *vi = get_irq_chip_data(irq);
u32 d0, d1;
Expand Down Expand Up @@ -669,31 +669,9 @@ printk("\n");
DBG(KERN_DEBUG "enable_irq(%d): eoi(%p, 0x%x)\n", irq,
vi->eoi_addr, vi->eoi_data);
iosapic_eoi(vi->eoi_addr, vi->eoi_data);
}

/*
* PARISC only supports PCI devices below I/O SAPIC.
* PCI only supports level triggered in order to share IRQ lines.
* ergo I/O SAPIC must always issue EOI on parisc.
*
* i386/ia64 support ISA devices and have to deal with
* edge-triggered interrupts too.
*/
static void iosapic_end_irq(unsigned int irq)
{
struct vector_info *vi = get_irq_chip_data(irq);
DBG(KERN_DEBUG "end_irq(%d): eoi(%p, 0x%x)\n", irq,
vi->eoi_addr, vi->eoi_data);
iosapic_eoi(vi->eoi_addr, vi->eoi_data);
cpu_eoi_irq(irq);
}

static unsigned int iosapic_startup_irq(unsigned int irq)
{
iosapic_enable_irq(irq);
return 0;
}

#ifdef CONFIG_SMP
static int iosapic_set_affinity_irq(unsigned int irq,
const struct cpumask *dest)
Expand Down Expand Up @@ -723,13 +701,10 @@ static int iosapic_set_affinity_irq(unsigned int irq,
#endif

static struct irq_chip iosapic_interrupt_type = {
.name = "IO-SAPIC-level",
.startup = iosapic_startup_irq,
.shutdown = iosapic_disable_irq,
.enable = iosapic_enable_irq,
.disable = iosapic_disable_irq,
.ack = cpu_ack_irq,
.end = iosapic_end_irq,
.name = "IO-SAPIC-level",
.unmask = iosapic_unmask_irq,
.mask = iosapic_mask_irq,
.ack = cpu_ack_irq,
#ifdef CONFIG_SMP
.set_affinity = iosapic_set_affinity_irq,
#endif
Expand Down

0 comments on commit f3d4605

Please sign in to comment.