Hi Sean

> From: U-Boot [mailto:u-boot-boun...@lists.denx.de] On Behalf Of Sean Anderson
> Sent: Thursday, January 16, 2020 6:48 AM
> To: U-Boot Mailing List
> Subject: [PATCH v2 01/11] clk: Always use the supplied struct clk
>
> CCF clocks should always use the struct clock passed to their methods for 
> extracting the driver-specific clock information struct. Previously, many 
> functions would use the clk->dev->priv if the device was bound. This could 
> cause problems with composite clocks. The individual clocks in a composite 
> clock did not have the ->dev field filled in. This was fine, because the 
> device-specific clock information would be used. However, since there was no 
> ->dev, there was no way to get the parent clock. This caused the recalc_rate 
> method of the CCF divider clock to fail. One option would be to use the 
> clk->priv field to get the composite clock and from there get the appropriate 
> parent device. However, this would tie the implementation to the composite 
> clock. In general, different devices should not rely on the contents of 
> ->priv from another device.
>
> The simple solution to this problem is to just always use the supplied struct 
> clock. The composite clock now fills in the ->dev pointer of its child clocks.
> This allows child clocks to make calls like clk_get_parent() without issue.
>
> imx avoided the above problem by using a custom get_rate function with 
> composite clocks.
>
> Signed-off-by: Sean Anderson <sean...@gmail.com>
> ---
>  drivers/clk/clk-composite.c    |  8 ++++++++
>  drivers/clk/clk-divider.c      |  6 ++----
>  drivers/clk/clk-fixed-factor.c |  3 +--
>  drivers/clk/clk-gate.c         |  6 ++----
>  drivers/clk/clk-mux.c          | 12 ++++--------
>  drivers/clk/imx/clk-gate2.c    |  4 ++--
>  6 files changed, 19 insertions(+), 20 deletions(-)

This patch is clock relative patch, if it is not a necessary patch for
Sipeed Maix support.
Please remove patch 1/11 and 2/11, and send them in another patch-sets.

Rick,
Thanks

>
> diff --git a/drivers/clk/clk-composite.c b/drivers/clk/clk-composite.c index 
> a5626c33d1..d0f273d47f 100644
> --- a/drivers/clk/clk-composite.c
> +++ b/drivers/clk/clk-composite.c
> @@ -145,6 +145,14 @@ struct clk *clk_register_composite(struct device *dev, 
> const char *name,
>                 goto err;
>         }
>
> +       if (composite->mux)
> +               composite->mux->dev = clk->dev;
> +       if (composite->rate)
> +               composite->rate->dev = clk->dev;
> +       if (composite->gate)
> +               composite->gate->dev = clk->dev;
> +
> +
>         return clk;
>
>  err:
> diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c index 
> 822e09b084..bfa05f24a3 100644
> --- a/drivers/clk/clk-divider.c
> +++ b/drivers/clk/clk-divider.c
> @@ -70,8 +70,7 @@ unsigned long divider_recalc_rate(struct clk *hw, unsigned 
> long parent_rate,
>
>  static ulong clk_divider_recalc_rate(struct clk *clk)  {
> -       struct clk_divider *divider = to_clk_divider(clk_dev_binded(clk) ?
> -                       dev_get_clk_ptr(clk->dev) : clk);
> +       struct clk_divider *divider = to_clk_divider(clk);
>         unsigned long parent_rate = clk_get_parent_rate(clk);
>         unsigned int val;
>
> @@ -150,8 +149,7 @@ int divider_get_val(unsigned long rate, unsigned long 
> parent_rate,
>
>  static ulong clk_divider_set_rate(struct clk *clk, unsigned long rate)  {
> -       struct clk_divider *divider = to_clk_divider(clk_dev_binded(clk) ?
> -                       dev_get_clk_ptr(clk->dev) : clk);
> +       struct clk_divider *divider = to_clk_divider(clk);
>         unsigned long parent_rate = clk_get_parent_rate(clk);
>         int value;
>         u32 val;
> diff --git a/drivers/clk/clk-fixed-factor.c b/drivers/clk/clk-fixed-factor.c 
> index 711b0588bc..d2401cf440 100644
> --- a/drivers/clk/clk-fixed-factor.c
> +++ b/drivers/clk/clk-fixed-factor.c
> @@ -18,8 +18,7 @@
>
>  static ulong clk_factor_recalc_rate(struct clk *clk)  {
> -       struct clk_fixed_factor *fix =
> -               to_clk_fixed_factor(dev_get_clk_ptr(clk->dev));
> +       struct clk_fixed_factor *fix = to_clk_fixed_factor(clk);
>         unsigned long parent_rate = clk_get_parent_rate(clk);
>         unsigned long long int rate;
>
> diff --git a/drivers/clk/clk-gate.c b/drivers/clk/clk-gate.c index 
> 70b8794554..b2933bc24a 100644
> --- a/drivers/clk/clk-gate.c
> +++ b/drivers/clk/clk-gate.c
> @@ -43,8 +43,7 @@
>   */
>  static void clk_gate_endisable(struct clk *clk, int enable)  {
> -       struct clk_gate *gate = to_clk_gate(clk_dev_binded(clk) ?
> -                       dev_get_clk_ptr(clk->dev) : clk);
> +       struct clk_gate *gate = to_clk_gate(clk);
>         int set = gate->flags & CLK_GATE_SET_TO_DISABLE ? 1 : 0;
>         u32 reg;
>
> @@ -86,8 +85,7 @@ static int clk_gate_disable(struct clk *clk)
>
>  int clk_gate_is_enabled(struct clk *clk)  {
> -       struct clk_gate *gate = to_clk_gate(clk_dev_binded(clk) ?
> -                       dev_get_clk_ptr(clk->dev) : clk);
> +       struct clk_gate *gate = to_clk_gate(clk);
>         u32 reg;
>
>  #if CONFIG_IS_ENABLED(SANDBOX_CLK_CCF)
> diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c index 
> 5acc0b8cbd..67b4afef28 100644
> --- a/drivers/clk/clk-mux.c
> +++ b/drivers/clk/clk-mux.c
> @@ -35,8 +35,7 @@
>  int clk_mux_val_to_index(struct clk *clk, u32 *table, unsigned int flags,
>                          unsigned int val)
>  {
> -       struct clk_mux *mux = to_clk_mux(clk_dev_binded(clk) ?
> -                       dev_get_clk_ptr(clk->dev) : clk);
> +       struct clk_mux *mux = to_clk_mux(clk);
>         int num_parents = mux->num_parents;
>
>         if (table) {
> @@ -79,8 +78,7 @@ unsigned int clk_mux_index_to_val(u32 *table, unsigned int 
> flags, u8 index)
>
>  u8 clk_mux_get_parent(struct clk *clk)
>  {
> -       struct clk_mux *mux = to_clk_mux(clk_dev_binded(clk) ?
> -                       dev_get_clk_ptr(clk->dev) : clk);
> +       struct clk_mux *mux = to_clk_mux(clk);
>         u32 val;
>
>  #if CONFIG_IS_ENABLED(SANDBOX_CLK_CCF)
> @@ -97,8 +95,7 @@ u8 clk_mux_get_parent(struct clk *clk)  static int 
> clk_fetch_parent_index(struct clk *clk,
>                                   struct clk *parent)
>  {
> -       struct clk_mux *mux = to_clk_mux(clk_dev_binded(clk) ?
> -                       dev_get_clk_ptr(clk->dev) : clk);
> +       struct clk_mux *mux = to_clk_mux(clk);
>
>         int i;
>
> @@ -115,8 +112,7 @@ static int clk_fetch_parent_index(struct clk *clk,
>
>  static int clk_mux_set_parent(struct clk *clk, struct clk *parent)  {
> -       struct clk_mux *mux = to_clk_mux(clk_dev_binded(clk) ?
> -                       dev_get_clk_ptr(clk->dev) : clk);
> +       struct clk_mux *mux = to_clk_mux(clk);
>         int index;
>         u32 val;
>         u32 reg;
> diff --git a/drivers/clk/imx/clk-gate2.c b/drivers/clk/imx/clk-gate2.c index 
> 1b9db6e791..e32c0cb53e 100644
> --- a/drivers/clk/imx/clk-gate2.c
> +++ b/drivers/clk/imx/clk-gate2.c
> @@ -37,7 +37,7 @@ struct clk_gate2 {
>
>  static int clk_gate2_enable(struct clk *clk)  {
> -       struct clk_gate2 *gate = to_clk_gate2(dev_get_clk_ptr(clk->dev));
> +       struct clk_gate2 *gate = to_clk_gate2(clk);
>         u32 reg;
>
>         reg = readl(gate->reg);
> @@ -50,7 +50,7 @@ static int clk_gate2_enable(struct clk *clk)
>
>  static int clk_gate2_disable(struct clk *clk)  {
> -       struct clk_gate2 *gate = to_clk_gate2(dev_get_clk_ptr(clk->dev));
> +       struct clk_gate2 *gate = to_clk_gate2(clk);
>         u32 reg;
>
>         reg = readl(gate->reg);
> --
> 2.24.1
>

Reply via email to