Skip to content

Commit f3e690b

Browse files
wensbebarino
authored andcommitted
clk: mediatek: mt8195: Implement error handling in probe functions
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>
1 parent cd3a77a commit f3e690b

File tree

5 files changed

+61
-18
lines changed

5 files changed

+61
-18
lines changed

drivers/clk/mediatek/clk-mt8195-apmixedsys.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,17 +120,24 @@ static int clk_mt8195_apmixed_probe(struct platform_device *pdev)
120120
if (!clk_data)
121121
return -ENOMEM;
122122

123-
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
124-
r = mtk_clk_register_gates(node, apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
123+
r = mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
125124
if (r)
126125
goto free_apmixed_data;
127126

127+
r = mtk_clk_register_gates(node, apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
128+
if (r)
129+
goto unregister_plls;
130+
128131
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
129132
if (r)
130-
goto free_apmixed_data;
133+
goto unregister_gates;
131134

132135
return r;
133136

137+
unregister_gates:
138+
mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
139+
unregister_plls:
140+
mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
134141
free_apmixed_data:
135142
mtk_free_clk_data(clk_data);
136143
return r;

drivers/clk/mediatek/clk-mt8195-apusys_pll.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,18 @@ static int clk_mt8195_apusys_pll_probe(struct platform_device *pdev)
6666
if (!clk_data)
6767
return -ENOMEM;
6868

69-
mtk_clk_register_plls(node, apusys_plls, ARRAY_SIZE(apusys_plls), clk_data);
70-
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
69+
r = mtk_clk_register_plls(node, apusys_plls, ARRAY_SIZE(apusys_plls), clk_data);
7170
if (r)
7271
goto free_apusys_pll_data;
7372

73+
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
74+
if (r)
75+
goto unregister_plls;
76+
7477
return r;
7578

79+
unregister_plls:
80+
mtk_clk_unregister_plls(apusys_plls, ARRAY_SIZE(apusys_plls), clk_data);
7681
free_apusys_pll_data:
7782
mtk_free_clk_data(clk_data);
7883
return r;

drivers/clk/mediatek/clk-mt8195-topckgen.c

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,25 +1239,52 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)
12391239
goto free_top_data;
12401240
}
12411241

1242-
mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
1243-
top_clk_data);
1244-
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
1245-
mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
1246-
&mt8195_clk_lock, top_clk_data);
1247-
mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
1248-
&mt8195_clk_lock, top_clk_data);
1249-
mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
1250-
&mt8195_clk_lock, top_clk_data);
1251-
r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
1242+
r = mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
1243+
top_clk_data);
12521244
if (r)
12531245
goto free_top_data;
12541246

1247+
r = mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
1248+
if (r)
1249+
goto unregister_fixed_clks;
1250+
1251+
r = mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
1252+
&mt8195_clk_lock, top_clk_data);
1253+
if (r)
1254+
goto unregister_factors;
1255+
1256+
r = mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
1257+
&mt8195_clk_lock, top_clk_data);
1258+
if (r)
1259+
goto unregister_muxes;
1260+
1261+
r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
1262+
&mt8195_clk_lock, top_clk_data);
1263+
if (r)
1264+
goto unregister_composite_muxes;
1265+
1266+
r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
1267+
if (r)
1268+
goto unregister_composite_divs;
1269+
12551270
r = of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
12561271
if (r)
1257-
goto free_top_data;
1272+
goto unregister_gates;
12581273

12591274
return r;
12601275

1276+
unregister_gates:
1277+
mtk_clk_unregister_gates(top_clks, ARRAY_SIZE(top_clks), top_clk_data);
1278+
unregister_composite_divs:
1279+
mtk_clk_unregister_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), top_clk_data);
1280+
unregister_composite_muxes:
1281+
mtk_clk_unregister_composites(top_muxes, ARRAY_SIZE(top_muxes), top_clk_data);
1282+
unregister_muxes:
1283+
mtk_clk_unregister_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), top_clk_data);
1284+
unregister_factors:
1285+
mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
1286+
unregister_fixed_clks:
1287+
mtk_clk_unregister_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), top_clk_data);
12611288
free_top_data:
12621289
mtk_free_clk_data(top_clk_data);
12631290
return r;

drivers/clk/mediatek/clk-mt8195-vdo0.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,12 @@ static int clk_mt8195_vdo0_probe(struct platform_device *pdev)
105105

106106
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
107107
if (r)
108-
goto free_vdo0_data;
108+
goto unregister_gates;
109109

110110
return r;
111111

112+
unregister_gates:
113+
mtk_clk_unregister_gates(vdo0_clks, ARRAY_SIZE(vdo0_clks), clk_data);
112114
free_vdo0_data:
113115
mtk_free_clk_data(clk_data);
114116
return r;

drivers/clk/mediatek/clk-mt8195-vdo1.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,12 @@ static int clk_mt8195_vdo1_probe(struct platform_device *pdev)
122122

123123
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
124124
if (r)
125-
goto free_vdo1_data;
125+
goto unregister_gates;
126126

127127
return r;
128128

129+
unregister_gates:
130+
mtk_clk_unregister_gates(vdo1_clks, ARRAY_SIZE(vdo1_clks), clk_data);
129131
free_vdo1_data:
130132
mtk_free_clk_data(clk_data);
131133
return r;

0 commit comments

Comments
 (0)