summaryrefslogtreecommitdiffstats
path: root/include/target
diff options
context:
space:
mode:
authorRobert Jarzmik <robert.jarzmik@free.fr>2016-09-04 20:59:45 +0200
committerRobert Jarzmik <robert.jarzmik@free.fr>2016-09-09 18:09:53 +0200
commit9ba63e3cc849cdaf3b675c47cc51fe35419e5117 (patch)
tree0b62ca6ff48dc74f1f790f935088cd5573f8614b /include/target
parent32f17997c1307c44f9365ed5ff4cf2b5c1e22301 (diff)
downloadlinux-9ba63e3cc849cdaf3b675c47cc51fe35419e5117.tar.gz
linux-9ba63e3cc849cdaf3b675c47cc51fe35419e5117.tar.bz2
linux-9ba63e3cc849cdaf3b675c47cc51fe35419e5117.zip
ARM: pxa: pxa_cplds: fix interrupt handling
Since its initial commit, the driver is buggy for multiple interrupts handling. The translation from the former lubbock.c file was not complete, and might stall all interrupt handling when multiple interrupts occur. This is especially true when inside the interrupt handler and if a new interrupt comes and is not handled, leaving the output line still held, and not creating a transition as the GPIO block behind would expect to trigger another cplds_irq_handler() call. For the record, the hardware is working as follows. The interrupt mechanism relies on : - one status register - one mask register Let's suppose the input irq lines are called : - i_sa1111 - i_lan91x - i_mmc_cd Let's suppose the status register for each irq line is called : - status_sa1111 - status_lan91x - status_mmc_cd Let's suppose the interrupt mask for each irq line is called : - irqen_sa1111 - irqen_lan91x - irqen_mmc_cd Let's suppose the output irq line, connected to GPIO0 is called : - o_gpio0 The behavior is as follows : - o_gpio0 = not((status_sa1111 & irqen_sa1111) | (status_lan91x & irqen_lan91x) | (status_mmc_cd & irqen_mmc_cd)) => this is a N-to-1 NOR gate and multiple AND gates - irqen_* is exactly as programmed by a write to the FPGA - status_* behavior is governed by a bi-stable D flip-flop => on next FPGA clock : - if i_xxx is high, status_xxx becomes 1 - if i_xxx is low, status_xxx remains as it is - if software sets status_xxx to 0, the D flip-flop is reset => status_xxx becomes 0 => on next FPGA clock cycle, if i_xxx is high, status_xxx becomes 1 again Fixes: fc9e38c0f4d3 ("ARM: pxa: lubbock: use new pxa_cplds driver") Reported-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Diffstat (limited to 'include/target')
0 files changed, 0 insertions, 0 deletions