• Bjorn Andersson's avatar
    clk: qcom: rcg2: Cache CFG register updates for parked RCGs · 703db1f5
    Bjorn Andersson authored
    As GDSCs are turned on and off some associated clocks are momentarily
    enabled for house keeping purposes. For this, and similar, purposes the
    "shared RCGs" will park the RCG on a source clock which is known to be
    available.
    When the RCG is parked, a safe clock source will be selected and
    committed, then the original source would be written back and upon enable
    the change back to the unparked source would be committed.
    
    But starting with SM8350 this fails, as the value in CFG is committed by
    the GDSC handshake and without a ticking parent the GDSC enablement will
    time out.
    
    This becomes a concrete problem if the runtime supended state of a
    device includes disabling such rcg's parent clock. As the device
    attempts to power up the domain again the rcg will fail to enable and
    hence the GDSC enablement will fail, preventing the device from
    returning from the suspended state.
    
    This can be seen in e.g. the display stack during probe on SM8350.
    
    To avoid this problem, the software needs to ensure that the RCG is
    configured to a active parent clock while it is disabled. This is done
    by caching the CFG register content while the shared RCG is parked on
    this safe source.
    
    Writes to M, N and D registers are committed as they are requested. New
    helpers for get_parent() and recalc_rate() are extracted from their
    previous implementations and __clk_rcg2_configure() is modified to allow
    it to operate on the cached value.
    
    Fixes: 7ef6f118 ("clk: qcom: Configure the RCGs to a safe source as needed")
    Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
    Reviewed-by: default avatarStephen Boyd <sboyd@kernel.org>
    Link: https://lore.kernel.org/r/20220426212136.1543984-1-bjorn.andersson@linaro.org
    703db1f5
clk-rcg2.c 33.1 KB