--- irq.c 2009-09-21 19:24:30.000000000 -0500 +++ irq.c 2009-12-04 17:52:59.000000000 -0600 @@ -45,7 +45,8 @@ #define REG(addr) ((u32 *)(KSEG1ADDR(AR7_REGS_IRQ) + addr)) -#define CHNL_OFFSET(chnl) (CHNLS_OFFSET + (chnl * 4)) +#define CHNL_OFFSET(chnl) (CHNLS_OFFSET + (chnl * 4)) /* priority for interrupt chnl */ +#define LITTLE_TO_BIG_ENDIAN(i) (24-(i)/8*8 + ((i)%8)) /* convert the bit number from little to big endin within 32 bit*/ static void ar7_unmask_irq(unsigned int irq_nr); static void ar7_mask_irq(unsigned int irq_nr); @@ -78,35 +79,35 @@ static void ar7_unmask_irq(unsigned int irq) { - writel(1 << ((irq - ar7_irq_base) % 32), + writel(1<< LITTLE_TO_BIG_ENDIAN(irq - ar7_irq_base), REG(ESR_OFFSET(irq - ar7_irq_base))); } static void ar7_mask_irq(unsigned int irq) { - writel(1 << ((irq - ar7_irq_base) % 32), + writel(1<< LITTLE_TO_BIG_ENDIAN(irq - ar7_irq_base), REG(ECR_OFFSET(irq - ar7_irq_base))); } static void ar7_ack_irq(unsigned int irq) { - writel(1 << ((irq - ar7_irq_base) % 32), + writel(1<>24; if (irq) { do_IRQ(ar7_irq_base + irq); return; } /* Secondary IRQ's are cascaded through primary '0' */ - writel(1, REG(CR_OFFSET(irq))); + writel(0x01000000, REG(CR_OFFSET(irq))); status = readl(REG(SEC_SR_OFFSET)); for (i = 0; i < 32; i++) { if (status & 1) { - do_IRQ(ar7_irq_base + i + 40); + do_IRQ(ar7_irq_base + LITTLE_TO_BIG_ENDIAN(i) + 40); return; } status >>= 1;