The newly introduced pm_genpd_remove reverts the initialization done
by pm_genpd_init and is necessary in the error path of the rockchip
power-domain driver.

Without it the driver will in the error case cleanup the devm-allocated
structures including the elements referenced in the gpd_list thus making
deactivation of unused domains (and probably later genpd accesses as
well) fail by accessing invalid pointers.

Signed-off-by: Heiko Stuebner <he...@sntech.de>
---
 drivers/soc/rockchip/pm_domains.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/soc/rockchip/pm_domains.c 
b/drivers/soc/rockchip/pm_domains.c
index 7acd151..241df213 100644
--- a/drivers/soc/rockchip/pm_domains.c
+++ b/drivers/soc/rockchip/pm_domains.c
@@ -445,7 +445,16 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu 
*pmu,
 
 static void rockchip_pm_remove_one_domain(struct rockchip_pm_domain *pd)
 {
-       int i;
+       int i, ret;
+
+       /*
+        * We're in the error cleanup already, so we only complain,
+        * but won't emit another error on top of the original one.
+        */
+       ret = pm_genpd_remove(&pd->genpd);
+       if (ret < 0)
+               dev_err(pd->pmu->dev, "failed to remove domain '%s' : %d - 
state may be inconsistent\n",
+                       pd->genpd.name, ret);
 
        for (i = 0; i < pd->num_clks; i++) {
                clk_unprepare(pd->clks[i]);
-- 
2.8.1

Reply via email to