Re: [PATCH] arm: imx: initialize the system counter earlier on i.MX7

Stefan Roese via U-Boot <[email protected]> Mon, 3 Aug 2026 14:27:05 +0200
Newsgroups gmane.comp.boot-loaders.u-boot
Message-ID <[email protected]>
On 7/30/26 11:35, Emanuele Ghidoli wrote:
> From: Emanuele Ghidoli <[email protected]>
> 
> imx_gpcv2_init() calls udelay(), which through schedule() reaches
> cyclic_run(). Since commit 9c1b13b3fd27 ("cyclic: reduce get_timer_us()
> calls inside hlist_for_each_entry_safe()") get_timer_us() is called even
> when no cyclic function is registered, so tick_to_time_us() divides by a
> still zero CNTFRQ and __div0() hangs the board before the console is up.
> The requested delay was a no-op as well, since us_to_tick() reads a CNTFRQ
> of zero.
> 
> Initialize the system counter before imx_gpcv2_init(), and move the
> "already initialized" guard from timer_get_boot_us() into timer_init() so
> that the later timer_init() from the generic init sequence is a no-op.
> Where the system counter timer_init() is not compiled in, the weak
> definition is empty and the calling it is harmless.
> 
> Fixes: b059837850e4 ("imx: mx7: add gpc initialization for low power mode")
> Fixes: 9c1b13b3fd27 ("cyclic: reduce get_timer_us() calls inside hlist_for_each_entry_safe()")
> Signed-off-by: Emanuele Ghidoli <[email protected]>

Reviewed-by: Stefan Roese <[email protected]>

Thanks,
Stefan

> ---
>   arch/arm/mach-imx/mx7/soc.c    | 6 ++++++
>   arch/arm/mach-imx/syscounter.c | 6 ++++--
>   2 files changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/mach-imx/mx7/soc.c b/arch/arm/mach-imx/mx7/soc.c
> index e504c1fd52a0..8a858dea5187 100644
> --- a/arch/arm/mach-imx/mx7/soc.c
> +++ b/arch/arm/mach-imx/mx7/soc.c
> @@ -331,6 +331,12 @@ int arch_cpu_init(void)
>   
>   	init_snvs();
>   
> +	/*
> +	 * imx_gpcv2_init() needs to do a delay.
> +	 * Timer must be initialized before calling a delay function.
> +	 */
> +	timer_init();
> +
>   	imx_gpcv2_init();
>   
>   	enable_ca7_smp();
> diff --git a/arch/arm/mach-imx/syscounter.c b/arch/arm/mach-imx/syscounter.c
> index 96fe2c7c17bb..86311d0cc07d 100644
> --- a/arch/arm/mach-imx/syscounter.c
> +++ b/arch/arm/mach-imx/syscounter.c
> @@ -65,6 +65,9 @@ int timer_init(void)
>   	struct sctr_regs *sctr = (struct sctr_regs *)SCTR_BASE_ADDR;
>   	unsigned long val, freq;
>   
> +	if (gd->arch.timer_rate_hz)
> +		return 0;
> +
>   	freq = CFG_SC_TIMER_CLK;
>   	asm volatile("mcr p15, 0, %0, c14, c0, 0" : : "r" (freq));
>   
> @@ -103,8 +106,7 @@ ulong get_timer(ulong base)
>   
>   ulong timer_get_boot_us(void)
>   {
> -	if (!gd->arch.timer_rate_hz)
> -		timer_init();
> +	timer_init();
>   
>   	return tick_to_time(get_ticks());
>   }