There have been already a couple of tries to make the genpd "disable unused" late initcall skip the powering off of domains that might be needed until later on (i.e. until some consumer probes). The conclusion was that the provider could return -EBUSY from the power_off callback until the provider's sync state has been reached. This patch series tries to provide a proof-of-concept that is working on Qualcomm platforms. I've been doing extensive testing on SM8450, but I've also spinned this on my X13s (SC8280XP). Both patches that add the sync state callback to the SC8280XP and SM8450 are here to provide context. Once we agree on the form, I intend to add the sync state callback to all gdsc providers. Currently, some of the gdsc providers might not reach sync state due to list of consumers not probing yet (or at all). The sync state can be enforced by writing 1 to the state_synced sysfs attribute of the provider, thanks to Saravana's commit [1] which has been already merged. [1] https://lore.kernel.org/r/20230304005355.746421-3-saravanak@xxxxxxxxxx V2 (RFC) of this patchset was here: https://lore.kernel.org/all/20230320134217.1685781-1-abel.vesa@xxxxxxxxxx/ Changes since v2: * renamed genpd_queue_power_off_work to pm_genpd_queue_power_off and added comment about its purpose w.r.t. it being exported. * added the qcom_cc generic sync state callback to all providers that register GDSCs, instead of SM8450 and SC8280XP Changes since v1: * Added the qcom_cc sync state callback which calls in turn the gdsc one * dropped extra semicolon from pm_domain.h Abel Vesa (4): PM: domains: Allow power off queuing from providers soc: qcom: rpmhpd: Do proper power off when state synced clk: qcom: gdsc: Avoid actual power off until sync state clk: qcom: Add sync state callback to all providers drivers/base/power/domain.c | 18 ++++++++++-------- drivers/clk/qcom/apss-ipq6018.c | 1 + drivers/clk/qcom/camcc-sc7180.c | 1 + drivers/clk/qcom/camcc-sc7280.c | 1 + drivers/clk/qcom/camcc-sdm845.c | 1 + drivers/clk/qcom/camcc-sm6350.c | 1 + drivers/clk/qcom/camcc-sm8250.c | 1 + drivers/clk/qcom/camcc-sm8450.c | 1 + drivers/clk/qcom/common.c | 19 +++++++++++++++++++ drivers/clk/qcom/common.h | 2 ++ drivers/clk/qcom/dispcc-qcm2290.c | 1 + drivers/clk/qcom/dispcc-sc7180.c | 1 + drivers/clk/qcom/dispcc-sc7280.c | 1 + drivers/clk/qcom/dispcc-sc8280xp.c | 1 + drivers/clk/qcom/dispcc-sdm845.c | 1 + drivers/clk/qcom/dispcc-sm6115.c | 1 + drivers/clk/qcom/dispcc-sm6125.c | 1 + drivers/clk/qcom/dispcc-sm6350.c | 1 + drivers/clk/qcom/dispcc-sm6375.c | 1 + drivers/clk/qcom/dispcc-sm8250.c | 1 + drivers/clk/qcom/dispcc-sm8450.c | 1 + drivers/clk/qcom/dispcc-sm8550.c | 1 + drivers/clk/qcom/gcc-apq8084.c | 1 + drivers/clk/qcom/gcc-ipq806x.c | 1 + drivers/clk/qcom/gcc-ipq8074.c | 1 + drivers/clk/qcom/gcc-mdm9615.c | 1 + drivers/clk/qcom/gcc-msm8660.c | 1 + drivers/clk/qcom/gcc-msm8909.c | 1 + drivers/clk/qcom/gcc-msm8916.c | 1 + drivers/clk/qcom/gcc-msm8939.c | 1 + drivers/clk/qcom/gcc-msm8953.c | 1 + drivers/clk/qcom/gcc-msm8960.c | 1 + drivers/clk/qcom/gcc-msm8974.c | 1 + drivers/clk/qcom/gcc-msm8976.c | 1 + drivers/clk/qcom/gcc-msm8994.c | 1 + drivers/clk/qcom/gcc-msm8996.c | 1 + drivers/clk/qcom/gcc-msm8998.c | 1 + drivers/clk/qcom/gcc-qcm2290.c | 1 + drivers/clk/qcom/gcc-qcs404.c | 1 + drivers/clk/qcom/gcc-qdu1000.c | 1 + drivers/clk/qcom/gcc-sa8775p.c | 1 + drivers/clk/qcom/gcc-sc7180.c | 1 + drivers/clk/qcom/gcc-sc7280.c | 1 + drivers/clk/qcom/gcc-sc8180x.c | 1 + drivers/clk/qcom/gcc-sc8280xp.c | 1 + drivers/clk/qcom/gcc-sdm660.c | 1 + drivers/clk/qcom/gcc-sdm845.c | 1 + drivers/clk/qcom/gcc-sdx55.c | 1 + drivers/clk/qcom/gcc-sdx65.c | 1 + drivers/clk/qcom/gcc-sm6115.c | 1 + drivers/clk/qcom/gcc-sm6125.c | 1 + drivers/clk/qcom/gcc-sm6350.c | 1 + drivers/clk/qcom/gcc-sm6375.c | 1 + drivers/clk/qcom/gcc-sm7150.c | 1 + drivers/clk/qcom/gcc-sm8150.c | 1 + drivers/clk/qcom/gcc-sm8250.c | 1 + drivers/clk/qcom/gcc-sm8350.c | 1 + drivers/clk/qcom/gcc-sm8450.c | 1 + drivers/clk/qcom/gcc-sm8550.c | 1 + drivers/clk/qcom/gdsc.c | 26 ++++++++++++++++++++++++++ drivers/clk/qcom/gdsc.h | 6 ++++++ drivers/clk/qcom/gpucc-msm8998.c | 1 + drivers/clk/qcom/gpucc-sc7180.c | 1 + drivers/clk/qcom/gpucc-sc7280.c | 1 + drivers/clk/qcom/gpucc-sc8280xp.c | 1 + drivers/clk/qcom/gpucc-sdm660.c | 1 + drivers/clk/qcom/gpucc-sdm845.c | 1 + drivers/clk/qcom/gpucc-sm6115.c | 1 + drivers/clk/qcom/gpucc-sm6125.c | 1 + drivers/clk/qcom/gpucc-sm6350.c | 1 + drivers/clk/qcom/gpucc-sm6375.c | 1 + drivers/clk/qcom/gpucc-sm8150.c | 1 + drivers/clk/qcom/gpucc-sm8250.c | 1 + drivers/clk/qcom/gpucc-sm8350.c | 1 + drivers/clk/qcom/lcc-ipq806x.c | 1 + drivers/clk/qcom/lpassaudiocc-sc7280.c | 1 + drivers/clk/qcom/lpasscc-sc7280.c | 1 + drivers/clk/qcom/lpasscorecc-sc7180.c | 2 ++ drivers/clk/qcom/lpasscorecc-sc7280.c | 2 ++ drivers/clk/qcom/mmcc-apq8084.c | 1 + drivers/clk/qcom/mmcc-msm8974.c | 1 + drivers/clk/qcom/mmcc-msm8994.c | 1 + drivers/clk/qcom/mmcc-msm8996.c | 1 + drivers/clk/qcom/mmcc-msm8998.c | 1 + drivers/clk/qcom/mmcc-sdm660.c | 1 + drivers/clk/qcom/videocc-sc7180.c | 1 + drivers/clk/qcom/videocc-sc7280.c | 1 + drivers/clk/qcom/videocc-sdm845.c | 1 + drivers/clk/qcom/videocc-sm8150.c | 1 + drivers/clk/qcom/videocc-sm8250.c | 1 + drivers/soc/qcom/rpmhpd.c | 19 +++++++------------ include/linux/pm_domain.h | 4 ++++ 92 files changed, 161 insertions(+), 20 deletions(-) -- 2.34.1