• Jerome Brunet's avatar
    clk: fix determine rate error with pass-through clock · 04bf9ab3
    Jerome Brunet authored
    If we try to determine the rate of a pass-through clock (a clock which
    does not implement .round_rate() nor .determine_rate()),
    clk_core_round_rate_nolock() will directly forward the call to the
    parent clock. In the particular case where the pass-through actually
    does not have a parent, clk_core_round_rate_nolock() will directly
    return 0 with the requested rate still set to the initial request
    structure. This is interpreted as if the rate could be exactly achieved
    while it actually cannot be adjusted.
    
    This become a real problem when this particular pass-through clock is
    the parent of a mux with the flag CLK_SET_RATE_PARENT set. The
    pass-through clock will always report an exact match, get picked and
    finally error when the rate is actually getting set.
    
    This is fixed by setting the rate inside the req to 0 when core is NULL
    in clk_core_round_rate_nolock() (same as in __clk_determine_rate() when
    hw is NULL)
    
    Fixes: 0f6cc2b8 ("clk: rework calls to round and determine rate callbacks")
    Signed-off-by: default avatarJerome Brunet <jbrunet@baylibre.com>
    Signed-off-by: default avatarMichael Turquette <mturquette@baylibre.com>
    Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
    04bf9ab3
clk.c 97.8 KB