Skip to content

Commit

Permalink
[ARM] 3871/1: S3C24XX: Fix ordering of EINT4..23
Browse files Browse the repository at this point in the history
The demux code for the IRQ EINTs above 3 was
using find last set instead of finding first
set.

Also fix it so that we only check EINT4..7
when the parent EINT4t7 goes off, and the
8..23 when EINT8t23 goes off.

Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Ben Dooks authored and Russell King committed Sep 28, 2006
1 parent 1f51c10 commit 38e0533
Showing 1 changed file with 36 additions and 8 deletions.
44 changes: 36 additions & 8 deletions arch/arm/mach-s3c2410/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -569,18 +569,46 @@ s3c_irq_demux_uart2(unsigned int irq,
}

static void
s3c_irq_demux_extint(unsigned int irq,
struct irqdesc *desc,
struct pt_regs *regs)
s3c_irq_demux_extint8(unsigned int irq,
struct irqdesc *desc,
struct pt_regs *regs)
{
unsigned long eintpnd = __raw_readl(S3C24XX_EINTPEND);
unsigned long eintmsk = __raw_readl(S3C24XX_EINTMASK);

eintpnd &= ~eintmsk;
eintpnd &= ~0xff; /* ignore lower irqs */

if (eintpnd) {
irq = fls(eintpnd);
irq += (IRQ_EINT4 - (4 + 1));
/* we may as well handle all the pending IRQs here */

while (eintpnd) {
irq = __ffs(eintpnd);
eintpnd &= ~(1<<irq);

irq += (IRQ_EINT4 - 4);
desc_handle_irq(irq, irq_desc + irq, regs);
}

}

static void
s3c_irq_demux_extint4t7(unsigned int irq,
struct irqdesc *desc,
struct pt_regs *regs)
{
unsigned long eintpnd = __raw_readl(S3C24XX_EINTPEND);
unsigned long eintmsk = __raw_readl(S3C24XX_EINTMASK);

eintpnd &= ~eintmsk;
eintpnd &= 0xff; /* only lower irqs */

/* we may as well handle all the pending IRQs here */

while (eintpnd) {
irq = __ffs(eintpnd);
eintpnd &= ~(1<<irq);

irq += (IRQ_EINT4 - 4);

desc_handle_irq(irq, irq_desc + irq, regs);
}
Expand Down Expand Up @@ -727,8 +755,8 @@ void __init s3c24xx_init_irq(void)

/* setup the cascade irq handlers */

set_irq_chained_handler(IRQ_EINT4t7, s3c_irq_demux_extint);
set_irq_chained_handler(IRQ_EINT8t23, s3c_irq_demux_extint);
set_irq_chained_handler(IRQ_EINT4t7, s3c_irq_demux_extint4t7);
set_irq_chained_handler(IRQ_EINT8t23, s3c_irq_demux_extint8);

set_irq_chained_handler(IRQ_UART0, s3c_irq_demux_uart0);
set_irq_chained_handler(IRQ_UART1, s3c_irq_demux_uart1);
Expand Down

0 comments on commit 38e0533

Please sign in to comment.