Skip to content
  • Fabio Baltieri's avatar
    pinctrl: nomadik: return if prcm_base is NULL · 4ca075de
    Fabio Baltieri authored and Linus Walleij's avatar Linus Walleij committed
    This patch adds a check for npct->prcm_base to make sure that the
    address is not NULL before using it, as the driver was made capable of
    loading even without a proper memory resource in:
    
    f1671bf5 pinctrl/nomadik: make independent of prcmu driver
    
    Also, refuses to probe without prcm_base on anything else than nomadik.
    
    This solves the following crash, introduced during the merge window when
    booting on U8500 with device tree:
    
    pinctrl-nomadik pinctrl-db8500: No PRCM base, assume no ALT-Cx control is available
    Unable to handle kernel NULL pointer dereference at virtual address 00000138
    pgd = c0004000
    [00000138] *pgd=00000000
    Internal error: Oops: 5 [#1] PREEMPT SMP ARM
    Modules linked in:
    CPU: 0    Not tainted  (3.7.0-02892-g1ebaf4f4
    
     #631)
    PC is at nmk_pmx_enable+0x1bc/0x4d0
    LR is at clk_disable+0x40/0x44
    [snip]
    [<c01d5e50>] (nmk_pmx_enable+0x1bc/0x4d0) from [<c01d3ba8>] (pinmux_enable_setting+0x12c/0x1ec)
    [<c01d3ba8>] (pinmux_enable_setting+0x12c/0x1ec) from [<c01d1dc8>] (pinctrl_select_state_locked+0xfc/0x134)
    [<c01d1dc8>] (pinctrl_select_state_locked+0xfc/0x134) from [<c01d2814>] (pinctrl_register+0x26c/0x43c)
    [<c01d2814>] (pinctrl_register+0x26c/0x43c) from [<c01d668c>] (nmk_pinctrl_probe+0x114/0x238)
    [<c01d668c>] (nmk_pinctrl_probe+0x114/0x238) from [<c0211cc4>] (platform_drv_probe+0x28/0x2c)
    [<c0211cc4>] (platform_drv_probe+0x28/0x2c) from [<c0210738>] (driver_probe_device+0x84/0x21c)
    [<c0210738>] (driver_probe_device+0x84/0x21c) from [<c02109c0>] (__device_attach+0x50/0x54)
    [<c02109c0>] (__device_attach+0x50/0x54) from [<c020eb1c>] (bus_for_each_drv+0x54/0x9c)
    [<c020eb1c>] (bus_for_each_drv+0x54/0x9c) from [<c0210668>] (device_attach+0x84/0x9c)
    [<c0210668>] (device_attach+0x84/0x9c) from [<c020fbac>] (bus_probe_device+0x94/0xb8)
    [<c020fbac>] (bus_probe_device+0x94/0xb8) from [<c020e084>] (device_add+0x4f0/0x5bc)
    [<c020e084>] (device_add+0x4f0/0x5bc) from [<c0276400>] (of_device_add+0x40/0x48)
    [<c0276400>] (of_device_add+0x40/0x48) from [<c0276a98>] (of_platform_device_create_pdata+0x68/0x98)
    [<c0276a98>] (of_platform_device_create_pdata+0x68/0x98) from [<c0276bac>] (of_platform_bus_create+0xe4/0x260)
    [<c0276bac>] (of_platform_bus_create+0xe4/0x260) from [<c0276bf8>] (of_platform_bus_create+0x130/0x260)
    [<c0276bf8>] (of_platform_bus_create+0x130/0x260) from [<c0276d94>] (of_platform_populate+0x6c/0xac)
    [<c0276d94>] (of_platform_populate+0x6c/0xac) from [<c04a8224>] (u8500_init_machine+0x78/0x140)
    [<c04a8224>] (u8500_init_machine+0x78/0x140) from [<c04a3560>] (customize_machine+0x24/0x30)
    [<c04a3560>] (customize_machine+0x24/0x30) from [<c00087b0>] (do_one_initcall+0x130/0x1b0)
    [<c00087b0>] (do_one_initcall+0x130/0x1b0) from [<c033ff9c>] (kernel_init+0x138/0x2e8)
    [<c033ff9c>] (kernel_init+0x138/0x2e8) from [<c000eb18>] (ret_from_fork+0x14/0x20)
    Code: 0a00001b e19400b2 e59a200c e0822000 (e592c000)
    ---[ end trace 1b75b31a2719ed1c ]---
    note: swapper/0[1] exited with preempt_count 1
    Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
    
    Signed-off-by: default avatarFabio Baltieri <fabio.baltieri@linaro.org>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    4ca075de