[PATCH 00/10] clk: convert drivers from deprecated round_rate() to determine_rate()

Brian Masney posted 10 patches 3 months ago
There is a newer version of this series
drivers/clk/bcm/clk-bcm2835.c        | 17 +++++++++-----
drivers/clk/qcom/clk-rpm.c           | 10 ++++-----
drivers/clk/qcom/clk-rpmh.c          |  8 +++----
drivers/clk/qcom/clk-smd-rpm.c       |  8 +++----
drivers/clk/qcom/clk-spmi-pmic-div.c | 12 +++++-----
drivers/clk/qcom/gcc-ipq4019.c       | 14 +++++++-----
drivers/clk/sunxi-ng/ccu_gate.c      | 14 +++++++-----
drivers/clk/sunxi-ng/ccu_nk.c        | 14 ++++++------
drivers/clk/sunxi-ng/ccu_nkmp.c      | 23 ++++++++++---------
drivers/clk/sunxi-ng/ccu_nm.c        | 43 ++++++++++++++++++------------------
10 files changed, 88 insertions(+), 75 deletions(-)
[PATCH 00/10] clk: convert drivers from deprecated round_rate() to determine_rate()
Posted by Brian Masney 3 months ago
The round_rate() clk ops is deprecated in the clk framework in favor
of the determine_rate() ops, so let's go ahead and convert some of the
outstanding bcm, qcom, and sunxi drivers that have a round_rate()
implementation over to determine_rate() using the Coccinelle semantic
patch posted below.

This Coccinelle semantic patch is able to automatically convert ~95% of
the clk drivers, and I can clean up the remaining ones by hand. I'll
initially post some small changes to get feedback about the approach,
and I can post some larger series by submaintainer once we get
agreement that the approach looks good.

I boot tested this on a Raspberry Pi 4 using Fedora 42, and validated
that the mmc driver still works since it uses the bcm2835 clk driver.
The other drivers were only compile tested.

There are some other cleanups improvements that can be done to some of
these drivers, however given the volume of changes, I'm only focusing
on the migration of the existing code, and making changes in a
deterministic way.

Coccinelle semantic patch:

    virtual patch

    // Look up the current name of the round_rate function
    @ has_round_rate @
    identifier round_rate_name =~ ".*_round_rate";
    identifier hw_param, rate_param, parent_rate_param;
    @@

    long round_rate_name(struct clk_hw *hw_param, unsigned long rate_param,
                  unsigned long *parent_rate_param)
    {
    	...
    }

    // Rename the route_rate function name to determine_rate()
    @ script:python generate_name depends on has_round_rate @
    round_rate_name << has_round_rate.round_rate_name;
    new_name;
    @@

    coccinelle.new_name = round_rate_name.replace("_round_rate", "_determine_rate")

    // Change rate to req->rate; also change occurrences of 'return XXX'.
    @ chg_rate depends on generate_name @
    identifier has_round_rate.round_rate_name;
    identifier has_round_rate.hw_param;
    identifier has_round_rate.rate_param;
    identifier has_round_rate.parent_rate_param;
    identifier ERR =~ "E.*";
    expression E;
    @@

    long round_rate_name(struct clk_hw *hw_param, unsigned long rate_param,
                  unsigned long *parent_rate_param)
    {
    <...
    (
    -return -ERR;
    +return -ERR;
    |
    - return rate_param;
    + return 0;
    |
    - return E;
    + req->rate = E;
    +
    + return 0;
    |
    - rate_param
    + req->rate
    )
    ...>
    }

    // Coccinelle only transforms the first occurrence of the rate parameter
    // Run a second time. FIXME: Is there a better way to do this?
    @ chg_rate2 depends on generate_name @
    identifier has_round_rate.round_rate_name;
    identifier has_round_rate.hw_param;
    identifier has_round_rate.rate_param;
    identifier has_round_rate.parent_rate_param;
    @@

    long round_rate_name(struct clk_hw *hw_param, unsigned long rate_param,
                  unsigned long *parent_rate_param)
    {
    <...
    - rate_param
    + req->rate
    ...>
    }

    // Change parent_rate to req->best_parent_rate
    @ chg_parent_rate depends on generate_name @
    identifier has_round_rate.round_rate_name;
    identifier has_round_rate.hw_param;
    identifier has_round_rate.rate_param;
    identifier has_round_rate.parent_rate_param;
    @@

    long round_rate_name(struct clk_hw *hw_param, unsigned long rate_param,
                  unsigned long *parent_rate_param)
    {
    <...
    (
    - *parent_rate_param
    + req->best_parent_rate
    |
    - parent_rate_param
    + &req->best_parent_rate
    )
    ...>
    }

    // Convert the function definition from round_rate() to determine_rate()
    @ func_definition depends on chg_rate @
    identifier has_round_rate.round_rate_name;
    identifier has_round_rate.hw_param;
    identifier has_round_rate.rate_param;
    identifier has_round_rate.parent_rate_param;
    identifier generate_name.new_name;
    @@

    - long round_rate_name(struct clk_hw *hw_param, unsigned long rate_param,
    -               unsigned long *parent_rate_param)
    + int new_name(struct clk_hw *hw, struct clk_rate_request *req)
    {
        ...
    }

    // Update the ops from round_rate() to determine_rate()
    @ ops depends on func_definition @
    identifier has_round_rate.round_rate_name;
    identifier generate_name.new_name;
    @@

    {
        ...,
    -   .round_rate = round_rate_name,
    +   .determine_rate = new_name,
        ...,
    }

Note that I used coccinelle 1.2 instead of 1.3 since the newer version
adds unnecessary braces as described in this post.
https://lore.kernel.org/cocci/67642477-5f3e-4b2a-914d-579a54f48cbd@intel.com/

Signed-off-by: Brian Masney <bmasney@redhat.com>
---
Brian Masney (10):
      clk: bcm: bcm2835: convert from round_rate() to determine_rate()
      clk: qcom: gcc-ipq4019: convert from round_rate() to determine_rate()
      clk: qcom: rpm: convert from round_rate() to determine_rate()
      clk: qcom: rpmh: convert from round_rate() to determine_rate()
      clk: qcom: smd-rpm: convert from round_rate() to determine_rate()
      clk: qcom: spmi-pmic-div: convert from round_rate() to determine_rate()
      clk: sunxi-ng: ccu_gate: convert from round_rate() to determine_rate()
      clk: sunxi-ng: ccu_nk: convert from round_rate() to determine_rate()
      clk: sunxi-ng: ccu_nkmp: convert from round_rate() to determine_rate()
      clk: sunxi-ng: ccu_nm: convert from round_rate() to determine_rate()

 drivers/clk/bcm/clk-bcm2835.c        | 17 +++++++++-----
 drivers/clk/qcom/clk-rpm.c           | 10 ++++-----
 drivers/clk/qcom/clk-rpmh.c          |  8 +++----
 drivers/clk/qcom/clk-smd-rpm.c       |  8 +++----
 drivers/clk/qcom/clk-spmi-pmic-div.c | 12 +++++-----
 drivers/clk/qcom/gcc-ipq4019.c       | 14 +++++++-----
 drivers/clk/sunxi-ng/ccu_gate.c      | 14 +++++++-----
 drivers/clk/sunxi-ng/ccu_nk.c        | 14 ++++++------
 drivers/clk/sunxi-ng/ccu_nkmp.c      | 23 ++++++++++---------
 drivers/clk/sunxi-ng/ccu_nm.c        | 43 ++++++++++++++++++------------------
 10 files changed, 88 insertions(+), 75 deletions(-)
---
base-commit: 17bbde2e1716e2ee4b997d476b48ae85c5a47671
change-id: 20250703-clk-cocci-drop-round-rate-62c89b2d4c6c

Best regards,
-- 
Brian Masney <bmasney@redhat.com>
Re: (subset) [PATCH 00/10] clk: convert drivers from deprecated round_rate() to determine_rate()
Posted by Bjorn Andersson 2 months, 3 weeks ago
On Thu, 03 Jul 2025 19:22:24 -0400, Brian Masney wrote:
> The round_rate() clk ops is deprecated in the clk framework in favor
> of the determine_rate() ops, so let's go ahead and convert some of the
> outstanding bcm, qcom, and sunxi drivers that have a round_rate()
> implementation over to determine_rate() using the Coccinelle semantic
> patch posted below.
> 
> This Coccinelle semantic patch is able to automatically convert ~95% of
> the clk drivers, and I can clean up the remaining ones by hand. I'll
> initially post some small changes to get feedback about the approach,
> and I can post some larger series by submaintainer once we get
> agreement that the approach looks good.
> 
> [...]

Applied, thanks!

[02/10] clk: qcom: gcc-ipq4019: convert from round_rate() to determine_rate()
        commit: 3ebefed3d3afbda632b5647a06598e1bad1baeb6
[03/10] clk: qcom: rpm: convert from round_rate() to determine_rate()
        commit: 120c4b7a35a2e2414fc3e35b34526b60ac54515d
[04/10] clk: qcom: rpmh: convert from round_rate() to determine_rate()
        commit: 2c0dce7392fdc0fcca1f133114c7c4295ac69233
[05/10] clk: qcom: smd-rpm: convert from round_rate() to determine_rate()
        commit: 11add2107c04bdcfb499cdb96ab156a4646ec9e1
[06/10] clk: qcom: spmi-pmic-div: convert from round_rate() to determine_rate()
        commit: ebec04773bf313280fe1cd9c0877c73660e69a10

Best regards,
-- 
Bjorn Andersson <andersson@kernel.org>
Re: (subset) [PATCH 00/10] clk: convert drivers from deprecated round_rate() to determine_rate()
Posted by Chen-Yu Tsai 2 months, 3 weeks ago
On Thu, 03 Jul 2025 19:22:24 -0400, Brian Masney wrote:
> The round_rate() clk ops is deprecated in the clk framework in favor
> of the determine_rate() ops, so let's go ahead and convert some of the
> outstanding bcm, qcom, and sunxi drivers that have a round_rate()
> implementation over to determine_rate() using the Coccinelle semantic
> patch posted below.
> 
> This Coccinelle semantic patch is able to automatically convert ~95% of
> the clk drivers, and I can clean up the remaining ones by hand. I'll
> initially post some small changes to get feedback about the approach,
> and I can post some larger series by submaintainer once we get
> agreement that the approach looks good.
> 
> [...]

Applied to sunxi/clk-for-6.17 in local tree, thanks!

[07/10] clk: sunxi-ng: ccu_gate: convert from round_rate() to determine_rate()
        commit: ee9c15ca0f628435334afef74d2ff03112d80bf0
[08/10] clk: sunxi-ng: ccu_nk: convert from round_rate() to determine_rate()
        commit: 2b0d4f1b3f8524b413208d47099c445eaf7c18f5
[09/10] clk: sunxi-ng: ccu_nkmp: convert from round_rate() to determine_rate()
        commit: 8bc614c6ac3c97cef385aebc6520ddcfa0fca8f7
[10/10] clk: sunxi-ng: ccu_nm: convert from round_rate() to determine_rate()
        commit: 80395c3b47577c12121d4e408e7b9478f7f88d02

Best regards,
-- 
Chen-Yu Tsai <wens@csie.org>