]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
clk: renesas: cpg-mssr: Check return value of pm_genpd_init()
authorLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Wed, 17 Nov 2021 11:51:00 +0000 (11:51 +0000)
committerGeert Uytterhoeven <geert+renesas@glider.be>
Fri, 19 Nov 2021 10:40:02 +0000 (11:40 +0100)
Make sure we check the return value of pm_genpd_init() which might fail.
Also add a devres action to remove the power-domain in-case the probe
callback fails further down in the code flow.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Link: https://lore.kernel.org/r/20211117115101.28281-4-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
drivers/clk/renesas/renesas-cpg-mssr.c

index 21f762aa213135d474c02eed7ea7649977fcee1f..a04d9573f59ff83655269768568d2fd5c002e3fa 100644 (file)
@@ -552,6 +552,11 @@ void cpg_mssr_detach_dev(struct generic_pm_domain *unused, struct device *dev)
                pm_clk_destroy(dev);
 }
 
+static void cpg_mssr_genpd_remove(void *data)
+{
+       pm_genpd_remove(data);
+}
+
 static int __init cpg_mssr_add_clk_domain(struct device *dev,
                                          const unsigned int *core_pm_clks,
                                          unsigned int num_core_pm_clks)
@@ -560,6 +565,7 @@ static int __init cpg_mssr_add_clk_domain(struct device *dev,
        struct generic_pm_domain *genpd;
        struct cpg_mssr_clk_domain *pd;
        size_t pm_size = num_core_pm_clks * sizeof(core_pm_clks[0]);
+       int ret;
 
        pd = devm_kzalloc(dev, sizeof(*pd) + pm_size, GFP_KERNEL);
        if (!pd)
@@ -574,7 +580,14 @@ static int __init cpg_mssr_add_clk_domain(struct device *dev,
                       GENPD_FLAG_ACTIVE_WAKEUP;
        genpd->attach_dev = cpg_mssr_attach_dev;
        genpd->detach_dev = cpg_mssr_detach_dev;
-       pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
+       ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
+       if (ret)
+               return ret;
+
+       ret = devm_add_action_or_reset(dev, cpg_mssr_genpd_remove, genpd);
+       if (ret)
+               return ret;
+
        cpg_mssr_clk_domain = pd;
 
        of_genpd_add_provider_simple(np, genpd);