• Jerome Brunet's avatar
    clk: migrate the count of orphaned clocks at init · 99652a46
    Jerome Brunet authored
    The orphan clocks reparents should migrate any existing count from the
    orphan clock to its new acestor clocks, otherwise we may have
    inconsistent counts in the tree and end-up with gated critical clocks
    
    Assuming we have two clocks, A and B.
    * Clock A has CLK_IS_CRITICAL flag set.
    * Clock B is an ancestor of A which can gate. Clock B gate is left
      enabled by the bootloader.
    
    Step 1: Clock A is registered. Since it is a critical clock, it is
    enabled. The clock being still an orphan, no parent are enabled.
    
    Step 2: Clock B is registered and reparented to clock A (potentially
    through several other clocks). We are now in situation where the enable
    count of clock A is 1 while the enable count of its ancestors is 0, which
    is not good.
    
    Step 3: in lateinit, clk_disable_unused() is called, the enable_count of
    clock B being 0, clock B is gated and and critical clock A actually gets
    disabled.
    
    This situation was found while adding fdiv_clk gates to the meson8b
    platform.  These clocks parent clk81 critical clock, which is the mother
    of all peripheral clocks in this system. Because of the issue described
    here, the system is crashing when clk_disable_unused() is called.
    
    The situation is solved by reverting
    commit f8f8f1d0 ("clk: Don't touch hardware when reparenting during registration").
    To avoid breaking again the situation described in this commit
    description, enabling critical clock should be done before walking the
    orphan list. This way, a parent critical clock may not be accidentally
    disabled due to the CLK_OPS_PARENT_ENABLE mechanism.
    
    Fixes: f8f8f1d0 ("clk: Don't touch hardware when reparenting during registration")
    Cc: Stephen Boyd <sboyd@codeaurora.org>
    Cc: Shawn Guo <shawnguo@kernel.org>
    Cc: Dong Aisheng <aisheng.dong@nxp.com>
    Signed-off-by: default avatarJerome Brunet <jbrunet@baylibre.com>
    Tested-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
    Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
    Signed-off-by: default avatarMichael Turquette <mturquette@baylibre.com>
    99652a46
clk.c 97.8 KB