• G
    gpio: pca953x: fix nested irqs rescheduling · fdd50409
    Grygorii Strashko 提交于
    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: NLothar Waßmann <LW@KARO-electronics.de>
    Tested-by: NChristian Gmeiner <christian.gmeiner@gmail.com>
    Signed-off-by: NGrygorii Strashko <grygorii.strashko@ti.com>
    Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
    fdd50409
gpio-pca953x.c 18.4 KB