clk: mediatek: mt8195: Implement error handling in probe functions
authorChen-Yu Tsai <wenst@chromium.org>
Tue, 8 Feb 2022 12:40:32 +0000 (20:40 +0800)
committerStephen Boyd <sboyd@kernel.org>
Thu, 17 Feb 2022 20:12:25 +0000 (12:12 -0800)
Until now the mediatek clk driver library did not have any way to
unregister clks, and so all drivers did not do proper cleanup in
their error paths.

Now that the library does have APIs to unregister clks, use them
in the error path of the probe functions for the mt8195 clk drivers
to do proper cleanup.

Signed-off-by: Chen-Yu Tsai <wenst@chromium.org>
Link: https://lore.kernel.org/r/20220208124034.414635-30-wenst@chromium.org
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/mediatek/clk-mt8195-apmixedsys.c
drivers/clk/mediatek/clk-mt8195-apusys_pll.c
drivers/clk/mediatek/clk-mt8195-topckgen.c
drivers/clk/mediatek/clk-mt8195-vdo0.c
drivers/clk/mediatek/clk-mt8195-vdo1.c

index 5b1b7dc447eb83e6086bca5a108d7aab928803aa..d0fdb5a4a921e086a6ea69f93d53811c29f2167d 100644 (file)
@@ -120,17 +120,24 @@ static int clk_mt8195_apmixed_probe(struct platform_device *pdev)
        if (!clk_data)
                return -ENOMEM;
 
-       mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
-       r = mtk_clk_register_gates(node, apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
+       r = mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
        if (r)
                goto free_apmixed_data;
 
+       r = mtk_clk_register_gates(node, apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
+       if (r)
+               goto unregister_plls;
+
        r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
        if (r)
-               goto free_apmixed_data;
+               goto unregister_gates;
 
        return r;
 
+unregister_gates:
+       mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
+unregister_plls:
+       mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
 free_apmixed_data:
        mtk_free_clk_data(clk_data);
        return r;
index db449ff877d779de47b3041a9afe054f32962aa8..f489b57e325e45662b8e9ea8538c64158ba1c58e 100644 (file)
@@ -66,13 +66,18 @@ static int clk_mt8195_apusys_pll_probe(struct platform_device *pdev)
        if (!clk_data)
                return -ENOMEM;
 
-       mtk_clk_register_plls(node, apusys_plls, ARRAY_SIZE(apusys_plls), clk_data);
-       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       r = mtk_clk_register_plls(node, apusys_plls, ARRAY_SIZE(apusys_plls), clk_data);
        if (r)
                goto free_apusys_pll_data;
 
+       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       if (r)
+               goto unregister_plls;
+
        return r;
 
+unregister_plls:
+       mtk_clk_unregister_plls(apusys_plls, ARRAY_SIZE(apusys_plls), clk_data);
 free_apusys_pll_data:
        mtk_free_clk_data(clk_data);
        return r;
index 3e2aba9c40bb78351ddd60005f28f8b452c0cd8c..3631f49a5e5af40256efdaf7fdd96704bbe52d36 100644 (file)
@@ -1239,25 +1239,52 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)
                goto free_top_data;
        }
 
-       mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
-                                   top_clk_data);
-       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
-       mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
-                              &mt8195_clk_lock, top_clk_data);
-       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
-                                   &mt8195_clk_lock, top_clk_data);
-       mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
-                                   &mt8195_clk_lock, top_clk_data);
-       r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
+       r = mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
+                                       top_clk_data);
        if (r)
                goto free_top_data;
 
+       r = mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
+       if (r)
+               goto unregister_fixed_clks;
+
+       r = mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
+                                  &mt8195_clk_lock, top_clk_data);
+       if (r)
+               goto unregister_factors;
+
+       r = mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+                                       &mt8195_clk_lock, top_clk_data);
+       if (r)
+               goto unregister_muxes;
+
+       r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
+                                       &mt8195_clk_lock, top_clk_data);
+       if (r)
+               goto unregister_composite_muxes;
+
+       r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
+       if (r)
+               goto unregister_composite_divs;
+
        r = of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
        if (r)
-               goto free_top_data;
+               goto unregister_gates;
 
        return r;
 
+unregister_gates:
+       mtk_clk_unregister_gates(top_clks, ARRAY_SIZE(top_clks), top_clk_data);
+unregister_composite_divs:
+       mtk_clk_unregister_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), top_clk_data);
+unregister_composite_muxes:
+       mtk_clk_unregister_composites(top_muxes, ARRAY_SIZE(top_muxes), top_clk_data);
+unregister_muxes:
+       mtk_clk_unregister_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), top_clk_data);
+unregister_factors:
+       mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
+unregister_fixed_clks:
+       mtk_clk_unregister_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), top_clk_data);
 free_top_data:
        mtk_free_clk_data(top_clk_data);
        return r;
index f7ff7618c714a1b2769ed2346079c563de427bd7..af34eb564b1da04f1b5ccfaebbd95228142af73b 100644 (file)
@@ -105,10 +105,12 @@ static int clk_mt8195_vdo0_probe(struct platform_device *pdev)
 
        r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
        if (r)
-               goto free_vdo0_data;
+               goto unregister_gates;
 
        return r;
 
+unregister_gates:
+       mtk_clk_unregister_gates(vdo0_clks, ARRAY_SIZE(vdo0_clks), clk_data);
 free_vdo0_data:
        mtk_free_clk_data(clk_data);
        return r;
index 03df8eae88382abdd41afdd5d924bd316720054f..6b502bbc730c02c8258509705df84ff4eb136338 100644 (file)
@@ -122,10 +122,12 @@ static int clk_mt8195_vdo1_probe(struct platform_device *pdev)
 
        r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
        if (r)
-               goto free_vdo1_data;
+               goto unregister_gates;
 
        return r;
 
+unregister_gates:
+       mtk_clk_unregister_gates(vdo1_clks, ARRAY_SIZE(vdo1_clks), clk_data);
 free_vdo1_data:
        mtk_free_clk_data(clk_data);
        return r;