• Mike Turquette's avatar
    ARM: 7535/1: Reprogram smp_twd based on new common clk framework notifiers · 2b25d9f6
    Mike Turquette authored
    Running cpufreq driver on imx6q, the following warning is seen.
    
    $ BUG: sleeping function called from invalid context at kernel/mutex.c:269
    
    <snip>
    
    stack backtrace:
    Backtrace:
    [<80011d64>] (dump_backtrace+0x0/0x10c) from [<803fc164>] (dump_stack+0x18/0x1c)
     r6:bf8142e0 r5:bf814000 r4:806ac794 r3:bf814000
    [<803fc14c>] (dump_stack+0x0/0x1c) from [<803fd444>] (print_usage_bug+0x250/0x2b
    8)
    [<803fd1f4>] (print_usage_bug+0x0/0x2b8) from [<80060f90>] (mark_lock+0x56c/0x67
    0)
    [<80060a24>] (mark_lock+0x0/0x670) from [<80061a20>] (__lock_acquire+0x98c/0x19b
    4)
    [<80061094>] (__lock_acquire+0x0/0x19b4) from [<80062f14>] (lock_acquire+0x68/0x
    7c)
    [<80062eac>] (lock_acquire+0x0/0x7c) from [<80400f28>] (mutex_lock_nested+0x78/0
    x344)
     r7:00000000 r6:bf872000 r5:805cc858 r4:805c2a04
    [<80400eb0>] (mutex_lock_nested+0x0/0x344) from [<803089ac>] (clk_get_rate+0x1c/
    0x58)
    [<80308990>] (clk_get_rate+0x0/0x58) from [<80013c48>] (twd_update_frequency+0x1
    8/0x50)
     r5:bf253d04 r4:805cadf4
    [<80013c30>] (twd_update_frequency+0x0/0x50) from [<80068e20>] (generic_smp_call
    _function_single_interrupt+0xd4/0x13c)
     r4:bf873ee0 r3:80013c30
    [<80068d4c>] (generic_smp_call_function_single_interrupt+0x0/0x13c) from [<80013
    34c>] (handle_IPI+0xc0/0x194)
     r8:00000001 r7:00000000 r6:80574e48 r5:bf872000 r4:80593958
    [<8001328c>] (handle_IPI+0x0/0x194) from [<800084e8>] (gic_handle_irq+0x58/0x60)
     r8:00000000 r7:bf873f8c r6:bf873f58 r5:80593070 r4:f4000100
    r3:00000005
    [<80008490>] (gic_handle_irq+0x0/0x60) from [<8000e124>] (__irq_svc+0x44/0x60)
    Exception stack(0xbf873f58 to 0xbf873fa0)
    3f40:                                                       00000001 00000001
    3f60: 00000000 bf814000 bf872000 805cab48 80405aa4 80597648 00000000 412fc09a
    3f80: bf872000 bf873fac bf873f70 bf873fa0 80063844 8000f1f8 20000013 ffffffff
     r6:ffffffff r5:20000013 r4:8000f1f8 r3:bf814000
    [<8000f1b8>] (default_idle+0x0/0x4c) from [<8000f428>] (cpu_idle+0x98/0x114)
    [<8000f390>] (cpu_idle+0x0/0x114) from [<803f9834>] (secondary_start_kernel+0x11
    c/0x140)
    [<803f9718>] (secondary_start_kernel+0x0/0x140) from [<103f9234>] (0x103f9234)
     r6:10c03c7d r5:0000001f r4:4f86806a r3:803f921c
    
    It looks that the warning is caused by that twd_update_frequency() gets
    called from an atomic context while it calls clk_get_rate() where a
    mutex gets held.
    
    To fix the warning, let's convert common clk users over to clk notifiers
    in place of CPUfreq notifiers.  This works out nicely for Cortex-A9
    MPcore designs that scale all CPUs at the same frequency.
    
    Platforms that have not been converted to the common clk framework and
    support CPUfreq will rely on the old mechanism.  Once these platforms
    are converted over fully then we can remove the CPUfreq-specific bits
    for good.
    Signed-off-by: default avatarMike Turquette <mturquette@linaro.org>
    Signed-off-by: default avatarShawn Guo <shawn.guo@linaro.org>
    Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    2b25d9f6
smp_twd.c 8.47 KB