[PATCH v2] arm: zynq: Fix system clock with multi_v7_defconfig

Michal Simek michal.simek at xilinx.com
Mon Mar 23 00:05:45 PDT 2015


Hi,

On 03/23/2015 02:39 AM, Ola Jeppsson wrote:
> As mentioned in this commit:
> arm: zynq: Don't use arm_global_timer with cpufreq
> 61f1fc7e9258a169ac8afb5ddf657a181e60d052
> 
> arm_global_timer depends on the CPU frequency. With cpufreq altering the
> CPU frequency arm_global_timer will not maintain a stable time base. So
> arm_global_timer must not be the clocksource when cpufreq is enabled.
> 
> The above commit tries to solve this at build time by only selecting
> CONFIG_ARM_GLOBAL_TIMER if CONFIG_CPU_FREQ is disabled. This is not
> always sufficient because other machs can also enable
> CONFIG_ARM_GLOBAL_TIMER.
> 
> Therefore: If built with CONFIG_CPU_FREQ and CONFIG_ARM_GLOBAL_TIMER,
> disable (on Zynq) the arm_global_timer devicetree node at boot before
> clock sources are initialized. This ensures that arm_global_timer will
> not be selected clocksource.
> 
> Signed-off-by: Ola Jeppsson <ola at adapteva.com>
> ---
>  arch/arm/mach-zynq/common.c | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c
> index c887196..a4666d4 100644
> --- a/arch/arm/mach-zynq/common.c
> +++ b/arch/arm/mach-zynq/common.c
> @@ -148,10 +148,36 @@ out:
>  	platform_device_register_full(&devinfo);
>  }
>  
> +#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_ARM_GLOBAL_TIMER)
> +static struct property zynq_disable_arm_global_timer_prop = {
> +	.name = "status",
> +	.length = sizeof("disabled"),
> +	.value = "disabled"
> +};
> +
> +static void __init zynq_disable_arm_global_timer(void)
> +{
> +	struct device_node *np;
> +
> +	np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-global-timer");
> +	if (!np)
> +		return;
> +
> +	pr_info("%s: disabling arm_global_timer node\n", __func__);
> +
> +	if (of_update_property(np, &zynq_disable_arm_global_timer_prop))
> +		pr_warn("%s: could not disable arm_global_timer node\n",
> +			__func__);
> +}
> +#endif
> +
>  static void __init zynq_timer_init(void)
>  {
>  	zynq_early_slcr_init();
>  
> +#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_ARM_GLOBAL_TIMER)
> +	zynq_disable_arm_global_timer();
> +#endif
>  	zynq_clock_init();
>  	of_clk_init(NULL);
>  	clocksource_of_init();
> 

Arnd: Waiting for your thoughts on this one?
It is some sort of arch/arm/mach-mvebu/board-v7.c quirk code.

I don't think it can be done via Kconfig because it will affect others.

Thanks,
Michal





More information about the linux-arm-kernel mailing list