• Maxime Ripard's avatar
    clk: Initialize orphan req_rate · 5f7e2af0
    Maxime Ripard authored
    When registering a clock that doesn't have a recalc_rate implementation,
    and doesn't have its parent registered yet, we initialize the clk_core
    rate and 'req_rate' fields to 0.
    
    The rate field is later updated when the parent is registered in
    clk_core_reparent_orphans_nolock() using __clk_recalc_rates(), but the
    'req_rate' field is never updated.
    
    This leads to an issue in clk_set_rate_range() and clk_put(), since
    those functions will call clk_set_rate() with the content of 'req_rate'
    to provide drivers with the opportunity to change the rate based on the
    new boundaries. In this case, we would call clk_set_rate() with a rate
    of 0, effectively enforcing the minimum allowed for this clock whenever
    we would call one of those two functions, even though the actual rate
    might be within range.
    
    Let's fix this by setting 'req_rate' in
    clk_core_reparent_orphans_nolock() with the rate field content just
    updated by the call to __clk_recalc_rates().
    
    Fixes: 1c8e6004 ("clk: Add rate constraints to clocks")
    Reported-by: default avatarDmitry Osipenko <dmitry.osipenko@collabora.com>
    Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> # T30 Nexus7
    Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
    Link: https://lore.kernel.org/r/20220325161144.1901695-2-maxime@cerno.tech
    [sboyd@kernel.org: Reword comment]
    Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
    5f7e2af0
clk.c 131 KB