[Uboot-stm32] [PATCH 2/6] clk: stm32mp1: gets root clocks from fdt

Patrice CHOTARD patrice.chotard at foss.st.com
Fri Mar 12 13:24:52 CET 2021


Hi

On 3/9/21 2:02 PM, Patrice CHOTARD wrote:
> 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
> _______________________________________________
> Uboot-stm32 mailing list
> Uboot-stm32 at st-md-mailman.stormreply.com
> https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32
> 
Applied to u-boot-stm/next

Thanks

Patrice


More information about the U-Boot mailing list