diff options
author | David Brownell <david-b@pacbell.net> | 2007-12-18 20:50:28 -0800 |
---|---|---|
committer | Haavard Skinnemoen <hskinnemoen@atmel.com> | 2008-01-25 08:31:44 +0100 |
commit | e4f586f280bbfa05c68f99df2db981356ee30533 (patch) | |
tree | cfe3e267be1bea797ed881582d55fd5de443a8f3 | |
parent | e7ba176b47db2ed53f258a6b4fe9d9fc6fa437a9 (diff) | |
download | op-kernel-dev-e4f586f280bbfa05c68f99df2db981356ee30533.zip op-kernel-dev-e4f586f280bbfa05c68f99df2db981356ee30533.tar.gz |
[AVR32] extint: change set_irq_type() handling
Update the AVR32 EIC code to use the new __set_irq_handler_unlocked()
call, getting rid of one more instance of this widespread problem.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
-rw-r--r-- | arch/avr32/mach-at32ap/extint.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/arch/avr32/mach-at32ap/extint.c b/arch/avr32/mach-at32ap/extint.c index e108e7b..81a4a02 100644 --- a/arch/avr32/mach-at32ap/extint.c +++ b/arch/avr32/mach-at32ap/extint.c @@ -130,8 +130,11 @@ static int eic_set_irq_type(unsigned int irq, unsigned int flow_type) eic_writel(eic, EDGE, edge); eic_writel(eic, LEVEL, level); - if (flow_type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) + if (flow_type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) { flow_type |= IRQ_LEVEL; + __set_irq_handler_unlocked(irq, handle_level_irq); + } else + __set_irq_handler_unlocked(irq, handle_edge_irq); desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL); desc->status |= flow_type; } @@ -151,9 +154,8 @@ static struct irq_chip eic_chip = { static void demux_eic_irq(unsigned int irq, struct irq_desc *desc) { struct eic *eic = desc->handler_data; - struct irq_desc *ext_desc; unsigned long status, pending; - unsigned int i, ext_irq; + unsigned int i; status = eic_readl(eic, ISR); pending = status & eic_readl(eic, IMR); @@ -162,12 +164,7 @@ static void demux_eic_irq(unsigned int irq, struct irq_desc *desc) i = fls(pending) - 1; pending &= ~(1 << i); - ext_irq = i + eic->first_irq; - ext_desc = irq_desc + ext_irq; - if (ext_desc->status & IRQ_LEVEL) - handle_level_irq(ext_irq, ext_desc); - else - handle_edge_irq(ext_irq, ext_desc); + generic_handle_irq(i + eic->first_irq); } } @@ -236,9 +233,8 @@ static int __init eic_probe(struct platform_device *pdev) eic->chip = &eic_chip; for (i = 0; i < nr_irqs; i++) { - /* NOTE the handler we set here is ignored by the demux */ set_irq_chip_and_handler(eic->first_irq + i, &eic_chip, - handle_level_irq); + handle_edge_irq); set_irq_chip_data(eic->first_irq + i, eic); } |