plat-orion gpio regression for mixed level and edge sensitive IRQs
Joey Oravec
joravec at drewtech.com
Tue Jul 19 15:32:21 EDT 2011
Orion maintainers,
I've found a problem on plat-orion when requesting IRQs on GPIO lines in
the linux-3.0rc. This was introduced with the change to generic IRQ chip.
Processors in this family have separate mask registers for level and
edge sensitive interrupts, but generic IRQ chip functions like
irq_gc_mask_set_bit() are designed for chips with a single mask
register. Test with the following sequence:
1. Register a level sensitive interrupt on pinA
2. Register an edge sensitive interrupt on pinB
During #2, the mask_cache (with pinA unmasked) gets written to the edge
sensitive mask register. At the end of this call pinA is unmasked for
edge sensitive interrupts. Now you can get into a state where an edge
interrupt is asserted for pinA, but that edge interrupt never gets
ack'ed since pinA is registered to handle level IRQs.
The older version of arch/arm/plat-orion/gpio.c does not have the
problem because it treats the registers separately and doesn't use a
cache. I've only tested this on MV78200 but any processor that uses
plat-orion with separate registers will experience this problem.
-joey
More information about the linux-arm-kernel
mailing list