• Maxime Ripard's avatar
    clk: Stop forwarding clk_rate_requests to the parent · 262ca38f
    Maxime Ripard authored
    If the clock cannot modify its rate and has CLK_SET_RATE_PARENT,
    clk_mux_determine_rate_flags(), clk_core_round_rate_nolock() and a
    number of drivers will forward the clk_rate_request to the parent clock.
    
    clk_core_round_rate_nolock() will pass the pointer directly, which means
    that we pass a clk_rate_request to the parent that has the rate,
    min_rate and max_rate of the child, and the best_parent_rate and
    best_parent_hw fields will be relative to the child as well, so will
    point to our current clock and its rate. The most common case for
    CLK_SET_RATE_PARENT is that the child and parent clock rates will be
    equal, so the rate field isn't a worry, but the other fields are.
    
    Similarly, if the parent clock driver ever modifies the best_parent_rate
    or best_parent_hw, this will be applied to the child once the call to
    clk_core_round_rate_nolock() is done. best_parent_hw is probably not
    going to be a valid parent, and best_parent_rate might lead to a parent
    rate change different to the one that was initially computed.
    
    clk_mux_determine_rate_flags() and the affected drivers will copy the
    request before forwarding it to the parents, so they won't be affected
    by the latter issue, but the former is still going to be there and will
    lead to erroneous data and context being passed to the various clock
    drivers in the same sub-tree.
    
    Let's create two new functions, clk_core_forward_rate_req() and
    clk_hw_forward_rate_request() for the framework and the clock providers
    that will copy a request from a child clock and update the context to
    match the parent's. We also update the relevant call sites in the
    framework and drivers to use that new function.
    
    Let's also add a test to make sure we avoid regressions there.
    
    Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com> # imx8mp
    Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> # exynos4210, meson g12b
    Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
    Link: https://lore.kernel.org/r/20220816112530.1837489-22-maxime@cerno.techTested-by: default avatarLinux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: default avatarNaresh Kamboju <naresh.kamboju@linaro.org>
    Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
    262ca38f
clk_test.c 58.4 KB