]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
clk: qcom: gdsc: Fix error path on registration of multiple pm subdomains
authorVladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Sat, 28 Mar 2026 01:26:19 +0000 (03:26 +0200)
committerBjorn Andersson <andersson@kernel.org>
Mon, 30 Mar 2026 13:34:10 +0000 (08:34 -0500)
Some pm subdomains may be left in added to a parent domain state, if
gdsc_add_subdomain_list() function fails in the middle and bails from
a GDSC power domain controller registration out.

Fixes: b489235b4dc0 ("clk: qcom: Support attaching GDSCs to multiple parents")
Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Reviewed-by: Bryan O'Donoghue <bod@kernel.org>
Link: https://lore.kernel.org/r/20260328012619.832770-1-vladimir.zapolskiy@linaro.org
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
drivers/clk/qcom/gdsc.c

index 7deabf8400cf664764336f2e18ce88c30241e078..95aa071202455421d818171d04f95d15e2b581fa 100644 (file)
@@ -518,10 +518,20 @@ static int gdsc_add_subdomain_list(struct dev_pm_domain_list *pd_list,
 
                ret = pm_genpd_add_subdomain(genpd, subdomain);
                if (ret)
-                       return ret;
+                       goto remove_added_subdomains;
        }
 
        return 0;
+
+remove_added_subdomains:
+       for (i--; i >= 0; i--) {
+               struct device *dev = pd_list->pd_devs[i];
+               struct generic_pm_domain *genpd = pd_to_genpd(dev->pm_domain);
+
+               pm_genpd_remove_subdomain(genpd, subdomain);
+       }
+
+       return ret;
 }
 
 static void gdsc_remove_subdomain_list(struct dev_pm_domain_list *pd_list,