diff mbox series

[2/2] clk: qcom: fix domains cleanup in gdsc_unregister

Message ID 20210629203919.2956918-2-dmitry.baryshkov@linaro.org
State New
Headers show
Series [1/2] clk: qcom: fix error_path in gdsc_register | expand

Commit Message

Dmitry Baryshkov June 29, 2021, 8:39 p.m. UTC
Properly remove registered genpds. Also remove the provider before
breaking parent/child links, so that the system is consistent at remove
time.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

---
 drivers/clk/qcom/gdsc.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

-- 
2.30.2

Comments

Stephen Boyd June 29, 2021, 10:34 p.m. UTC | #1
Quoting Dmitry Baryshkov (2021-06-29 13:39:19)
> Properly remove registered genpds. Also remove the provider before

> breaking parent/child links, so that the system is consistent at remove

> time.

> 

> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

> ---

>  drivers/clk/qcom/gdsc.c | 11 ++++++++++-

>  1 file changed, 10 insertions(+), 1 deletion(-)

> 

> diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c

> index 241186d9d08c..4b211dd1764d 100644

> --- a/drivers/clk/qcom/gdsc.c

> +++ b/drivers/clk/qcom/gdsc.c

> @@ -475,6 +475,9 @@ void gdsc_unregister(struct gdsc_desc *desc)

>         struct gdsc **scs = desc->scs;

>         size_t num = desc->num;

>  

> +       /* Remove provider first */


but why? A better comment would be

	/*
	 * Remove provider first so that we can remove the genpds
	 * without worrying about consumers getting them during the
	 * removal process.
	 */

> +       of_genpd_del_provider(dev->of_node);

> +

>         /* Remove subdomains */

>         for (i = 0; i < num; i++) {

>                 if (!scs[i])

> @@ -482,7 +485,13 @@ void gdsc_unregister(struct gdsc_desc *desc)

>                 if (scs[i]->parent)

>                         pm_genpd_remove_subdomain(scs[i]->parent, &scs[i]->pd);

>         }

> -       of_genpd_del_provider(dev->of_node);

> +

> +       /* Remove domains themselves */

> +       for (i = 0; i < num; i++) {

> +               if (!scs[i])

> +                       continue;

> +               pm_genpd_remove(&scs[i]->pd);

> +       }

>  }
diff mbox series

Patch

diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c
index 241186d9d08c..4b211dd1764d 100644
--- a/drivers/clk/qcom/gdsc.c
+++ b/drivers/clk/qcom/gdsc.c
@@ -475,6 +475,9 @@  void gdsc_unregister(struct gdsc_desc *desc)
 	struct gdsc **scs = desc->scs;
 	size_t num = desc->num;
 
+	/* Remove provider first */
+	of_genpd_del_provider(dev->of_node);
+
 	/* Remove subdomains */
 	for (i = 0; i < num; i++) {
 		if (!scs[i])
@@ -482,7 +485,13 @@  void gdsc_unregister(struct gdsc_desc *desc)
 		if (scs[i]->parent)
 			pm_genpd_remove_subdomain(scs[i]->parent, &scs[i]->pd);
 	}
-	of_genpd_del_provider(dev->of_node);
+
+	/* Remove domains themselves */
+	for (i = 0; i < num; i++) {
+		if (!scs[i])
+			continue;
+		pm_genpd_remove(&scs[i]->pd);
+	}
 }
 
 /*