• Masahiro Yamada's avatar
    clk: avoid circular clock topology · 858d5881
    Masahiro Yamada authored
    Currently, clk_register() never checks a circular parent looping,
    but clock providers could register such an insane clock topology.
    For example, "clk_a" could have "clk_b" as a parent, and vice versa.
    In this case, clk_core_reparent() creates a circular parent list
    and __clk_recalc_accuracies() calls itself recursively forever.
    
    The core infrastructure should be kind enough to bail out, showing
    an appropriate error message in such a case.  This helps to easily
    find a bug in clock providers.  (uh, I made such a silly mistake
    when I was implementing my clock providers first.  I was upset
    because the kernel did not respond, without any error message.)
    
    This commit adds a new helper function, __clk_is_ancestor().  It
    returns true if the second argument is a possible ancestor of the
    first one.  If a clock core is a possible ancestor of itself, it
    would make a loop when it were registered.  That should be detected
    as an error.
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Reviewed-by: default avatarVladimir Zapolskiy <vz@mleia.com>
    Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
    858d5881
clk.c 77.8 KB