Message ID | 20220208124034.414635-25-wenst@chromium.org (mailing list archive) |
---|---|
State | Mainlined, archived |
Headers | show |
Series | clk: mediatek: Cleanups and Improvements - Part 1 | expand |
On Tue, 2022-02-08 at 20:40 +0800, Chen-Yu Tsai wrote: > The mux clk type registration function does not stop or return errors > if any clk failed to be registered, nor does it implement an error > handling path. This may result in a partially working device if any > step failed. > > Make the register function return proper error codes, and bail out if > errors occur. Proper cleanup, i.e. unregister any clks that were > successfully registered, is done in the new error path. > > Signed-off-by: Chen-Yu Tsai <wenst@chromium.org> > Reviewed-by: Miles Chen <miles.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> Reviewed-by: Chun-Jie Chen <chun-jie.chen@mediatek.com> > --- > drivers/clk/mediatek/clk-mux.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/drivers/clk/mediatek/clk-mux.c > b/drivers/clk/mediatek/clk-mux.c > index 70aa42144632..f51e67650f03 100644 > --- a/drivers/clk/mediatek/clk-mux.c > +++ b/drivers/clk/mediatek/clk-mux.c > @@ -215,13 +215,26 @@ int mtk_clk_register_muxes(const struct mtk_mux > *muxes, > > if (IS_ERR(clk)) { > pr_err("Failed to register clk %s: %pe\n", mux- > >name, clk); > - continue; > + goto err; > } > > clk_data->clks[mux->id] = clk; > } > > return 0; > + > +err: > + while (--i >= 0) { > + const struct mtk_mux *mux = &muxes[i]; > + > + if (IS_ERR_OR_NULL(clk_data->clks[mux->id])) > + continue; > + > + mtk_clk_unregister_mux(clk_data->clks[mux->id]); > + clk_data->clks[mux->id] = ERR_PTR(-ENOENT); > + } > + > + return PTR_ERR(clk); > } > EXPORT_SYMBOL_GPL(mtk_clk_register_muxes); >
Quoting Chen-Yu Tsai (2022-02-08 04:40:27) > The mux clk type registration function does not stop or return errors > if any clk failed to be registered, nor does it implement an error > handling path. This may result in a partially working device if any > step failed. > > Make the register function return proper error codes, and bail out if > errors occur. Proper cleanup, i.e. unregister any clks that were > successfully registered, is done in the new error path. > > Signed-off-by: Chen-Yu Tsai <wenst@chromium.org> > Reviewed-by: Miles Chen <miles.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> > --- Applied to clk-next
diff --git a/drivers/clk/mediatek/clk-mux.c b/drivers/clk/mediatek/clk-mux.c index 70aa42144632..f51e67650f03 100644 --- a/drivers/clk/mediatek/clk-mux.c +++ b/drivers/clk/mediatek/clk-mux.c @@ -215,13 +215,26 @@ int mtk_clk_register_muxes(const struct mtk_mux *muxes, if (IS_ERR(clk)) { pr_err("Failed to register clk %s: %pe\n", mux->name, clk); - continue; + goto err; } clk_data->clks[mux->id] = clk; } return 0; + +err: + while (--i >= 0) { + const struct mtk_mux *mux = &muxes[i]; + + if (IS_ERR_OR_NULL(clk_data->clks[mux->id])) + continue; + + mtk_clk_unregister_mux(clk_data->clks[mux->id]); + clk_data->clks[mux->id] = ERR_PTR(-ENOENT); + } + + return PTR_ERR(clk); } EXPORT_SYMBOL_GPL(mtk_clk_register_muxes);