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 >