• Linus Walleij's avatar
    ARM: 7563/1: SMP_TWD: make setup()/stop() reentrant · a68becd1
    Linus Walleij authored
    It has been brought to my knowledge that the .setup()/.stop()
    function pair in the SMP TWD is going to be called from atomic
    contexts for CPUs coming and going, and then the
    clk_prepare()/clk_unprepare() calls cannot be called
    on subsequent .setup()/.stop() iterations. This is however
    just the tip of an iceberg as the function pair is not
    designed to be reentrant at all.
    
    This change makes the SMP_TWD clock .setup()/.stop() pair reentrant
    by splitting the .setup() function in three parts:
    
    - One COMMON part that is executed the first time the first CPU
      in the TWD cluster is initialized. This will fetch the TWD
      clk for the cluster and prepare+enable it. If no clk is
      available it will calibrate the rate instead.
    
    - One part that is executed the FIRST TIME a certain CPU is
      brought on-line. This initializes and sets up the clock event
      for a certain CPU.
    
    - One part that is executed on every subsequent .setup() call.
      This will re-initialize the clock event. This is augmented
      to call the clk_enable()/clk_disable() pair properly.
    
    Cc: Shawn Guo <shawn.guo@linaro.org>
    Reported-by: default avatarPeter Chen <peter.chen@freescale.com>
    Reviewed-by: default avatarSantosh Shilimkar <santosh.shilimkar@ti.com>
    Tested-by: default avatarShawn Guo <shawn.guo@linaro.org>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    a68becd1
smp_twd.c 9.25 KB