Re: [PATCH v3 4/5] clk: mediatek: Switch to clk_hw provider APIs

From: Stephen Boyd
Date: Thu May 19 2022 - 20:37:44 EST


Quoting Chen-Yu Tsai (2022-05-19 00:16:09)
> As part of the effort to improve the MediaTek clk drivers, the next step
> is to switch from the old 'struct clk' clk prodivder APIs to the new
> 'struct clk_hw' ones.
>
> In a previous patch, 'struct clk_onecell_data' was replaced with
> 'struct clk_hw_onecell_data', with (struct clk_hw *)->clk and
> __clk_get_hw() bridging the new data structures and old code.
>
> Now switch from the old 'clk_(un)?register*()' APIs to the new
> 'clk_hw_(un)?register*()' ones. This is done with the coccinelle script
> below.
>
> Unfortunately this also leaves clk-mt8173.c with a compile error that
> would need a coccinelle script longer than the actual diff to fix. This
> last part is fixed up by hand.
>
> // Fix prototypes
> @@
> identifier F =~ "^mtk_clk_register_";
> @@
> - struct clk *
> + struct clk_hw *
> F(...);
>
> // Fix calls to mtk_clk_register_<singular>
> @ reg @
> identifier F =~ "^mtk_clk_register_";
> identifier FS =~ "^mtk_clk_register_[a-z_]*s";
> identifier I;
> expression clk_data;
> expression E;
> @@
> FS(...) {
> ...
> - struct clk *I;
> + struct clk_hw *hw;
> ...
> for (...;...;...) {
> ...
> (
> - I
> + hw
> =
> - clk_register_fixed_rate(
> + clk_hw_register_fixed_rate(
> ...
> );
> |
> - I
> + hw
> =
> - clk_register_fixed_factor(
> + clk_hw_register_fixed_factor(
> ...
> );
> |
> - I
> + hw
> =
> - clk_register_divider(
> + clk_hw_register_divider(
> ...
> );
> |
> - I
> + hw
> =
> F(...);
> )
> ...
> if (
> - IS_ERR(I)
> + IS_ERR(hw)
> ) {
> pr_err(...,
> - I
> + hw
> ,...);
> ...
> }
>
> - clk_data->hws[E] = __clk_get_hw(I);
> + clk_data->hws[E] = hw;
> }
> ...
> }
>
> @ depends on reg @
> identifier reg.I;
> @@
> return PTR_ERR(
> - I
> + hw
> );
>
> // Fix mtk_clk_register_composite to return clk_hw instead of clk
> @@
> identifier I, R;
> expression E;
> @@
> - struct clk *
> + struct clk_hw *
> mtk_clk_register_composite(...) {
> ...
> - struct clk *I;
> + struct clk_hw *hw;
> ...
> - I = clk_register_composite(
> + hw = clk_hw_register_composite(
> ...);
> if (IS_ERR(
> - I
> + hw
> )) {
> ...
> R = PTR_ERR(
> - I
> + hw
> );
> ...
> }
>
> return
> - I
> + hw
> ;
> ...
> }
>
> // Fix other mtk_clk_register_<singular> to return clk_hw instead of clk
> @@
> identifier F =~ "^mtk_clk_register_";
> identifier I, D, C;
> expression E;
> @@
> - struct clk *
> + struct clk_hw *
> F(...) {
> ...
> - struct clk *I;
> + int ret;
> ...
> - I = clk_register(D, E);
> + ret = clk_hw_register(D, E);
> ...
> (
> - if (IS_ERR(I))
> + if (ret) {
> kfree(C);
> + return ERR_PTR(ret);
> + }
> |
> - if (IS_ERR(I))
> + if (ret)
> {
> kfree(C);
> - return I;
> + return ERR_PTR(ret);
> }
> )
>
> - return I;
> + return E;
> }
>
> // Fix mtk_clk_unregister_<singular> to take clk_hw instead of clk
> @@
> identifier F =~ "^mtk_clk_unregister_";
> identifier I, I2;
> @@
> static void F(
> - struct clk *I
> + struct clk_hw *I2
> )
> {
> ...
> - struct clk_hw *I2;
> ...
> - I2 = __clk_get_hw(I);
> ...
> (
> - clk_unregister(I);
> + clk_hw_unregister(I2);
> |
> - clk_unregister_composite(I);
> + clk_hw_unregister_composite(I2);
> )
> ...
> }
>
> // Fix calls to mtk_clk_unregister_*()
> @@
> identifier F =~ "^mtk_clk_unregister_";
> expression I;
> expression E;
> @@
> - F(I->hws[E]->clk);
> + F(I->hws[E]);
>
> Signed-off-by: Chen-Yu Tsai <wenst@xxxxxxxxxxxx>
> Reviewed-by: Miles Chen <miles.chen@xxxxxxxxxxxx>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@xxxxxxxxxxxxx>
> Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@xxxxxxxxxxxxx>
> Tested-by: Miles Chen <miles.chen@xxxxxxxxxxxx>
> ---

Applied to clk-next