Message ID | 20220208124034.414635-7-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 cpumux clk type within the MediaTek clk driver library only has > a register function, and no corresponding unregister function. This > means there is no way for its users to properly implement cleanup > and removal. > > Add a matching unregister function for the cpumux type clk. > > 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-cpumux.c | 31 > +++++++++++++++++++++++++++++++ > drivers/clk/mediatek/clk-cpumux.h | 3 +++ > 2 files changed, 34 insertions(+) > > diff --git a/drivers/clk/mediatek/clk-cpumux.c > b/drivers/clk/mediatek/clk-cpumux.c > index cab5095416b6..99a819e3673f 100644 > --- a/drivers/clk/mediatek/clk-cpumux.c > +++ b/drivers/clk/mediatek/clk-cpumux.c > @@ -77,6 +77,21 @@ mtk_clk_register_cpumux(const struct mtk_composite > *mux, > return clk; > } > > +static void mtk_clk_unregister_cpumux(struct clk *clk) > +{ > + struct mtk_clk_cpumux *cpumux; > + struct clk_hw *hw; > + > + hw = __clk_get_hw(clk); > + if (!hw) > + return; > + > + cpumux = to_mtk_clk_cpumux(hw); > + > + clk_unregister(clk); > + kfree(cpumux); > +} > + > int mtk_clk_register_cpumuxes(struct device_node *node, > const struct mtk_composite *clks, int > num, > struct clk_onecell_data *clk_data) > @@ -106,4 +121,20 @@ int mtk_clk_register_cpumuxes(struct device_node > *node, > return 0; > } > > +void mtk_clk_unregister_cpumuxes(const struct mtk_composite *clks, > int num, > + struct clk_onecell_data *clk_data) > +{ > + int i; > + > + for (i = num; i > 0; i--) { > + const struct mtk_composite *mux = &clks[i - 1]; > + > + if (IS_ERR_OR_NULL(clk_data->clks[mux->id])) > + continue; > + > + mtk_clk_unregister_cpumux(clk_data->clks[mux->id]); > + clk_data->clks[mux->id] = ERR_PTR(-ENOENT); > + } > +} > + > MODULE_LICENSE("GPL"); > diff --git a/drivers/clk/mediatek/clk-cpumux.h > b/drivers/clk/mediatek/clk-cpumux.h > index 2aaf1afd4e5f..fda7770fd803 100644 > --- a/drivers/clk/mediatek/clk-cpumux.h > +++ b/drivers/clk/mediatek/clk-cpumux.h > @@ -19,4 +19,7 @@ int mtk_clk_register_cpumuxes(struct device_node > *node, > const struct mtk_composite *clks, int > num, > struct clk_onecell_data *clk_data); > > +void mtk_clk_unregister_cpumuxes(const struct mtk_composite *clks, > int num, > + struct clk_onecell_data *clk_data); > + > #endif /* __DRV_CLK_CPUMUX_H */
Quoting Chen-Yu Tsai (2022-02-08 04:40:09) > The cpumux clk type within the MediaTek clk driver library only has > a register function, and no corresponding unregister function. This > means there is no way for its users to properly implement cleanup > and removal. > > Add a matching unregister function for the cpumux type clk. > > 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-cpumux.c b/drivers/clk/mediatek/clk-cpumux.c index cab5095416b6..99a819e3673f 100644 --- a/drivers/clk/mediatek/clk-cpumux.c +++ b/drivers/clk/mediatek/clk-cpumux.c @@ -77,6 +77,21 @@ mtk_clk_register_cpumux(const struct mtk_composite *mux, return clk; } +static void mtk_clk_unregister_cpumux(struct clk *clk) +{ + struct mtk_clk_cpumux *cpumux; + struct clk_hw *hw; + + hw = __clk_get_hw(clk); + if (!hw) + return; + + cpumux = to_mtk_clk_cpumux(hw); + + clk_unregister(clk); + kfree(cpumux); +} + int mtk_clk_register_cpumuxes(struct device_node *node, const struct mtk_composite *clks, int num, struct clk_onecell_data *clk_data) @@ -106,4 +121,20 @@ int mtk_clk_register_cpumuxes(struct device_node *node, return 0; } +void mtk_clk_unregister_cpumuxes(const struct mtk_composite *clks, int num, + struct clk_onecell_data *clk_data) +{ + int i; + + for (i = num; i > 0; i--) { + const struct mtk_composite *mux = &clks[i - 1]; + + if (IS_ERR_OR_NULL(clk_data->clks[mux->id])) + continue; + + mtk_clk_unregister_cpumux(clk_data->clks[mux->id]); + clk_data->clks[mux->id] = ERR_PTR(-ENOENT); + } +} + MODULE_LICENSE("GPL"); diff --git a/drivers/clk/mediatek/clk-cpumux.h b/drivers/clk/mediatek/clk-cpumux.h index 2aaf1afd4e5f..fda7770fd803 100644 --- a/drivers/clk/mediatek/clk-cpumux.h +++ b/drivers/clk/mediatek/clk-cpumux.h @@ -19,4 +19,7 @@ int mtk_clk_register_cpumuxes(struct device_node *node, const struct mtk_composite *clks, int num, struct clk_onecell_data *clk_data); +void mtk_clk_unregister_cpumuxes(const struct mtk_composite *clks, int num, + struct clk_onecell_data *clk_data); + #endif /* __DRV_CLK_CPUMUX_H */