Hi Patrick On 2/24/21 11:19 AM, Patrick Delaunay wrote: > From: Etienne Carriere <etienne.carri...@st.com> > > This change makes stm32mp1 clock driver to get the root clocks > reference from the device node in the FDT rather than fetching > straight these clocks by their name. Driver now stores the > clock reference and use it to know if a root clock is present, > get its rate or gets its related udevice reference. > > Signed-off-by: Etienne Carriere <etienne.carri...@st.com> > Signed-off-by: Patrick Delaunay <patrick.delau...@foss.st.com> > --- > > drivers/clk/clk_stm32mp1.c | 62 ++++++++++++++------------------------ > 1 file changed, 23 insertions(+), 39 deletions(-) > > diff --git a/drivers/clk/clk_stm32mp1.c b/drivers/clk/clk_stm32mp1.c > index 848e33f4e8..0c0ef366a1 100644 > --- a/drivers/clk/clk_stm32mp1.c > +++ b/drivers/clk/clk_stm32mp1.c > @@ -250,7 +250,7 @@ DECLARE_GLOBAL_DATA_PTR; > enum stm32mp1_parent_id { > /* > * _HSI, _HSE, _CSI, _LSI, _LSE should not be moved > - * they are used as index in osc[] as entry point > + * they are used as index in osc_clk[] as clock reference > */ > _HSI, > _HSE, > @@ -430,8 +430,7 @@ struct stm32mp1_clk_data { > struct stm32mp1_clk_priv { > fdt_addr_t base; > const struct stm32mp1_clk_data *data; > - ulong osc[NB_OSC]; > - struct udevice *osc_dev[NB_OSC]; > + struct clk osc_clk[NB_OSC]; > }; > > #define STM32MP1_CLK(off, b, idx, s) \ > @@ -790,7 +789,7 @@ static ulong stm32mp1_clk_get_fixed(struct > stm32mp1_clk_priv *priv, int idx) > return 0; > } > > - return priv->osc[idx]; > + return clk_get_rate(&priv->osc_clk[idx]); > } > > static int stm32mp1_clk_get_id(struct stm32mp1_clk_priv *priv, unsigned long > id) > @@ -1545,7 +1544,7 @@ static int stm32mp1_hsidiv(fdt_addr_t rcc, ulong > hsifreq) > break; > > if (hsidiv == 4) { > - log_err("clk-hsi frequency invalid"); > + log_err("hsi frequency invalid"); > return -1; > } > > @@ -1952,13 +1951,13 @@ static int stm32mp1_clktree(struct udevice *dev) > * switch ON oscillator found in device-tree, > * HSI already ON after bootrom > */ > - if (priv->osc[_LSI]) > + if (clk_valid(&priv->osc_clk[_LSI])) > stm32mp1_lsi_set(rcc, 1); > > - if (priv->osc[_LSE]) { > + if (clk_valid(&priv->osc_clk[_LSE])) { > int bypass, digbyp; > u32 lsedrv; > - struct udevice *dev = priv->osc_dev[_LSE]; > + struct udevice *dev = priv->osc_clk[_LSE].dev; > > bypass = dev_read_bool(dev, "st,bypass"); > digbyp = dev_read_bool(dev, "st,digbypass"); > @@ -1969,9 +1968,9 @@ static int stm32mp1_clktree(struct udevice *dev) > stm32mp1_lse_enable(rcc, bypass, digbyp, lsedrv); > } > > - if (priv->osc[_HSE]) { > + if (clk_valid(&priv->osc_clk[_HSE])) { > int bypass, digbyp, css; > - struct udevice *dev = priv->osc_dev[_HSE]; > + struct udevice *dev = priv->osc_clk[_HSE].dev; > > bypass = dev_read_bool(dev, "st,bypass"); > digbyp = dev_read_bool(dev, "st,digbypass"); > @@ -1996,8 +1995,8 @@ static int stm32mp1_clktree(struct udevice *dev) > > /* configure HSIDIV */ > dev_dbg(dev, "configure HSIDIV\n"); > - if (priv->osc[_HSI]) { > - stm32mp1_hsidiv(rcc, priv->osc[_HSI]); > + if (clk_valid(&priv->osc_clk[_HSI])) { > + stm32mp1_hsidiv(rcc, clk_get_rate(&priv->osc_clk[_HSI])); > stgen_config(priv); > } > > @@ -2043,7 +2042,7 @@ static int stm32mp1_clktree(struct udevice *dev) > } > > /* wait LSE ready before to use it */ > - if (priv->osc[_LSE]) > + if (clk_valid(&priv->osc_clk[_LSE])) > stm32mp1_lse_wait(rcc); > > /* configure with expected clock source */ > @@ -2082,7 +2081,7 @@ static int stm32mp1_clktree(struct udevice *dev) > > dev_dbg(dev, "oscillator off\n"); > /* switch OFF HSI if not found in device-tree */ > - if (!priv->osc[_HSI]) > + if (!clk_valid(&priv->osc_clk[_HSI])) > stm32mp1_hsi_set(rcc, 0); > > /* Software Self-Refresh mode (SSR) during DDR initilialization */ > @@ -2178,40 +2177,25 @@ static ulong stm32mp1_clk_set_rate(struct clk *clk, > unsigned long clk_rate) > return -EINVAL; > } > > -static void stm32mp1_osc_clk_init(const char *name, > - struct stm32mp1_clk_priv *priv, > - int index) > -{ > - struct clk clk; > - struct udevice *dev = NULL; > - > - priv->osc[index] = 0; > - clk.id = 0; > - if (!uclass_get_device_by_name(UCLASS_CLK, name, &dev)) { > - if (clk_request(dev, &clk)) > - log_err("%s request", name); > - else > - priv->osc[index] = clk_get_rate(&clk); > - } > - priv->osc_dev[index] = dev; > -} > - > static void stm32mp1_osc_init(struct udevice *dev) > { > struct stm32mp1_clk_priv *priv = dev_get_priv(dev); > int i; > const char *name[NB_OSC] = { > - [_LSI] = "clk-lsi", > - [_LSE] = "clk-lse", > - [_HSI] = "clk-hsi", > - [_HSE] = "clk-hse", > - [_CSI] = "clk-csi", > + [_LSI] = "lsi", > + [_LSE] = "lse", > + [_HSI] = "hsi", > + [_HSE] = "hse", > + [_CSI] = "csi", > [_I2S_CKIN] = "i2s_ckin", > }; > > for (i = 0; i < NB_OSC; i++) { > - stm32mp1_osc_clk_init(name[i], priv, i); > - dev_dbg(dev, "%d: %s => %x\n", i, name[i], (u32)priv->osc[i]); > + if (clk_get_by_name(dev, name[i], &priv->osc_clk[i])) > + dev_dbg(dev, "No source clock \"%s\"", name[i]); > + else > + dev_dbg(dev, "%s clock rate: %luHz\n", > + name[i], clk_get_rate(&priv->osc_clk[i])); > } > } > >
Reviewed-by: Patrice Chotard <patrice.chot...@foss.st.com> Thanks Patrice