Re: [PATCH 3/3] clk: qcom: gdsc: tear down per-domain genpds in gdsc_unregister()
From: Dmitry Baryshkov
Date: Mon Jun 08 2026 - 02:50:40 EST
On Tue, Jun 02, 2026 at 04:09:34PM +0200, Herman van Hazendonk wrote:
> gdsc_unregister() removes the OF provider entry and tears down the
> parent/subdomain wiring, but never calls pm_genpd_remove() on the
> individual generic_pm_domain structures registered by gdsc_init():
>
> void gdsc_unregister(struct gdsc_desc *desc)
> {
> struct device *dev = desc->dev;
> size_t num = desc->num;
>
> gdsc_pm_subdomain_remove(desc, num);
> of_genpd_del_provider(dev->of_node);
> }
>
> That leaves dangling entries on the global gpd_list. After a provider
> unbind/rebind cycle (deferred-probe replay during early boot, real
> module unload of a clk driver that owns GDSCs, or an OF-overlay tear-
> down) the next gdsc_init() will end up trying to re-register a name
> that is still in the list and pm_genpd_init() returns -EEXIST.
>
> While we are here, flip the order so the consumer-facing OF provider
> entry is the first thing removed -- otherwise a fresh
> of_genpd_get_from_provider() call racing with the teardown could
> attach to a domain that is mid-removal.
>
> Iterate the scs[] array and pm_genpd_remove() each registered domain
> after the subdomain links are torn down. The regulators stay devm-
> managed (devm_regulator_get_optional() in gdsc_register()), so the
> release happens automatically when the underlying device is unbound;
> just the genpd accounting needs to be undone explicitly.
>
> Signed-off-by: Herman van Hazendonk <github.com@xxxxxxxxxx>
> ---
> drivers/clk/qcom/gdsc.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
Fixes: 45dd0e55317c ("clk: qcom: Add support for GDSCs")
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxxxxxxxx>
--
With best wishes
Dmitry