gpio: pca953x: fix nested irqs rescheduling
pca953x interrupt controller functionality is implemented using
nested threaded IRQs which require parent_irq to be configured
properly otherwise below warning can be seen if IRQ core
will try re-schedule nested IRQ:
------------[ cut here ]------------
WARNING: CPU: 1 PID: 12 at kernel/irq/manage.c:696 irq_nested_primary_handler+0x30/0x38()
Primary handler called for nested irq 301
Modules linked in: uinput ipv6 smsc95xx usbnet mii imx2_wdt etnaviv(C) matrix_keypad matrix_keymap ar1021_i2c
CPU: 1 PID: 12 Comm: ksoftirqd/1 Tainted: G WC 4.1.1 #9
Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
Backtrace:
[<
c0013298>] (dump_backtrace) from [<
c0013488>] (show_stack+0x20/0x24)
[<
c0013468>] (show_stack) from [<
c05743c4>] (dump_stack+0x70/0xc0)
[<
c0574354>] (dump_stack) from [<
c002b7b8>] (warn_slowpath_common+0x88/0xc0)
[<
c002b730>] (warn_slowpath_common) from [<
c002b8ac>] (warn_slowpath_fmt+0x40/0x48)
[<
c002b870>] (warn_slowpath_fmt) from [<
c0075798>] (irq_nested_primary_handler+0x30/0x38)
[<
c0075768>] (irq_nested_primary_handler) from [<
c0075200>] (handle_irq_event_percpu+0x70/0x2d0)
[<
c0075190>] (handle_irq_event_percpu) from [<
c00754ac>] (handle_irq_event+0x4c/0x6c)
[<
c0075460>] (handle_irq_event) from [<
c0078204>] (handle_simple_irq+0xa4/0xc8)
[<
c0078160>] (handle_simple_irq) from [<
c0077cd4>] (resend_irqs+0x50/0x7c)
[<
c0077c84>] (resend_irqs) from [<
c002f99c>] (tasklet_action+0x94/0x140)
[<
c002f908>] (tasklet_action) from [<
c002eea8>] (__do_softirq+0xa0/0x3c8)
[<
c002ee08>] (__do_softirq) from [<
c002f208>] (run_ksoftirqd+0x38/0x54)
[<
c002f1d0>] (run_ksoftirqd) from [<
c004b1e4>] (smpboot_thread_fn+0x1f8/0x2f0)
[<
c004afec>] (smpboot_thread_fn) from [<
c0047744>] (kthread+0xe8/0x104)
[<
c004765c>] (kthread) from [<
c000fac8>] (ret_from_fork+0x14/0x2c)
---[ end trace
96052cda48865769 ]---
The issue was reported and described in details by Lothar Waßmann and
Christian Gmeiner in https://lkml.org/lkml/2014/9/9/123.
Fix it by adding missed call of gpiochip_set_chained_irqchip()
so GPIO IRQ chip helpers will set parent_irq for nested IRQs
properly.
Reported-by: Lothar Waßmann <LW@KARO-electronics.de>
Tested-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>