omap1510 MPU interupt BUG

Petukhov Nikolay palmtt2 at mail.ru
Mon Dec 12 10:25:39 CST 2005


Hi All.

in file linux-2.6.14-omap2/arch/arm/plat-omap/gpio.c
in function
static void gpio_irq_handler(unsigned int irq, struct irqdesc *desc,                                                                    struct pt_regs *regs)

.......

        isr = __raw_readl(isr_reg);  
.......

Note:    __raw_readl return 32bit, but MPU have 16 bit registers

example:
MPU isr=0x0001, but __raw_readl() return isr=0x00010001 -> virtual interrupt 16
desc_handle_irq(0, d, regs) - handled ok
desc_handle_irq(16, d, regs) - interrupt handler = NULL

Here patch fix it

diff -Nru linux-2.6.14-omap2/arch/arm/plat-omap/gpio.c
linux-2.6.14-omap2-palmtt2/arch/arm/plat-omap/gpio.c  

--- linux-2.6.14-omap2/arch/arm/plat-omap/gpio.c        Sat Dec 10 21:05:46 2005                             +++ linux-2.6.14-omap2-palmtt2/arch/arm/plat-omap/gpio.c        Sat Dec 10 19:57:30 2005                     @@ -758,6 +758,10 @@
                                                                                                                                                                                     while(1) {            
isr = __raw_readl(isr_reg);
+#ifdef CONFIG_ARCH_OMAP15XX                                                                                 +       if (bank->method == METHOD_MPUIO)
+           isr&=0xffff;   
+#endif !
                                                                                                           _enable_gpio_irqbank(bank, isr, 0);
_clear_gpio_irqbank(bank, isr);            
_enable_gpio_irqbank(bank, isr, 1);



More information about the Linux-omap-open-source mailing list