David Brownell <davi...@pacbell.net> writes: > From: David Brownell <dbrown...@users.sourceforge.net> > > Fix two IRQ triggering bugs affecting GPIO IRQs: > > - Make sure enabling with IRQ_TYPE_NONE ("default, unspecified") > isn't a NOP ... default to both edges, at least one must work. > > - As noted by Kevin Hilman, setting the irq trigger type for a > banked gpio interrupt shouldn't enable irqs that are disabled. > > Since GPIO IRQs haven't been used much yet, it's not clear these > bugs could have affected anything. The few current users don't > seem to have been obviously suffering from these issues. > > Signed-off-by: David Brownell <dbrown...@users.sourceforge.net> > --- > Applies also to mainline, with minor offsets. So if I get some > acks, I can submit to the ARM patch queue...
Thanks, pushing to DaVinci git, and I'll add this to my queue of davinci fixes for RMK/mainline, so you don't need to bother with ARM patch queue. Kevin > arch/arm/mach-davinci/gpio.c | 20 ++++++++++++++------ > 1 file changed, 14 insertions(+), 6 deletions(-) > > --- a/arch/arm/mach-davinci/gpio.c > +++ b/arch/arm/mach-davinci/gpio.c > @@ -179,10 +179,15 @@ static void gpio_irq_enable(unsigned irq > { > struct gpio_controller *__iomem g = get_irq_chip_data(irq); > u32 mask = __gpio_mask(irq_to_gpio(irq)); > + unsigned status = irq_desc[irq].status; > > - if (irq_desc[irq].status & IRQ_TYPE_EDGE_FALLING) > + status &= IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING; > + if (!status) > + status = IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING; > + > + if (status & IRQ_TYPE_EDGE_FALLING) > __raw_writel(mask, &g->set_falling); > - if (irq_desc[irq].status & IRQ_TYPE_EDGE_RISING) > + if (status & IRQ_TYPE_EDGE_RISING) > __raw_writel(mask, &g->set_rising); > } > > @@ -197,10 +202,13 @@ static int gpio_irq_type(unsigned irq, u > irq_desc[irq].status &= ~IRQ_TYPE_SENSE_MASK; > irq_desc[irq].status |= trigger; > > - __raw_writel(mask, (trigger & IRQ_TYPE_EDGE_FALLING) > - ? &g->set_falling : &g->clr_falling); > - __raw_writel(mask, (trigger & IRQ_TYPE_EDGE_RISING) > - ? &g->set_rising : &g->clr_rising); > + /* don't enable the IRQ if it's currently disabled */ > + if (irq_desc[irq].depth == 0) { > + __raw_writel(mask, (trigger & IRQ_TYPE_EDGE_FALLING) > + ? &g->set_falling : &g->clr_falling); > + __raw_writel(mask, (trigger & IRQ_TYPE_EDGE_RISING) > + ? &g->set_rising : &g->clr_rising); > + } > return 0; > } > > > > _______________________________________________ > Davinci-linux-open-source mailing list > Davinci-linux-open-source@linux.davincidsp.com > http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source _______________________________________________ Davinci-linux-open-source mailing list Davinci-linux-open-source@linux.davincidsp.com http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source