• Rob Herring's avatar
    of/irq: do irq resolution in platform_get_irq · 9ec36caf
    Rob Herring authored
    Currently we get the following kind of errors if we try to use interrupt
    phandles to irqchips that have not yet initialized:
    
    irq: no irq domain found for /ocp/pinmux@48002030 !
    ------------[ cut here ]------------
    WARNING: CPU: 0 PID: 1 at drivers/of/platform.c:171 of_device_alloc+0x144/0x184()
    Modules linked in:
    CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.12.0-00038-g42a9708 #1012
    (show_stack+0x14/0x1c)
    (dump_stack+0x6c/0xa0)
    (warn_slowpath_common+0x64/0x84)
    (warn_slowpath_null+0x1c/0x24)
    (of_device_alloc+0x144/0x184)
    (of_platform_device_create_pdata+0x44/0x9c)
    (of_platform_bus_create+0xd0/0x170)
    (of_platform_bus_create+0x12c/0x170)
    (of_platform_populate+0x60/0x98)
    
    This is because we're wrongly trying to populate resources that are not
    yet available. It's perfectly valid to create irqchips dynamically, so
    let's fix up the issue by resolving the interrupt resources when
    platform_get_irq is called.
    
    And then we also need to accept the fact that some irqdomains do not
    exist that early on, and only get initialized later on. So we can
    make the current WARN_ON into just into a pr_debug().
    
    We still attempt to populate irq resources when we create the devices.
    This allows current drivers which don't use platform_get_irq to continue
    to function. Once all drivers are fixed, this code can be removed.
    Suggested-by: default avatarRussell King <linux@arm.linux.org.uk>
    Signed-off-by: default avatarRob Herring <robh@kernel.org>
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    Tested-by: default avatarTony Lindgren <tony@atomide.com>
    Cc: stable@vger.kernel.org # v3.10+
    Signed-off-by: default avatarGrant Likely <grant.likely@linaro.org>
    9ec36caf
platform.c 30.9 KB