[PATCH 2/6] clk: stm32mp1: gets root clocks from fdt
Patrice CHOTARD
patrice.chotard at foss.st.com
Tue Mar 9 14:02:28 CET 2021
Hi Patrick
On 2/24/21 11:19 AM, Patrick Delaunay wrote:
> From: Etienne Carriere <etienne.carriere at 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.carriere at st.com>
> Signed-off-by: Patrick Delaunay <patrick.delaunay at 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.chotard at foss.st.com>
Thanks
Patrice
More information about the U-Boot
mailing list