arm: omap2: AM43xx: enable ARM TWD timer
Subsystems (3)
cover arm: omap2: AM43xx: enable ARM TWD timer
Now ARM TWD timer can be enabled for AM437x devices since all prerequisite patches have been merged already [1] [2].
But before finally enable ARM TWD timer for UP AM437x devices - the Broadcast event source and infrustructure need to be enabled properly. Otherwise CPUIdle will be broken.
[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-August/363989.html
[2] http://www.spinics.net/lists/linux-omap/msg123940.html
Felipe Balbi (1):
arm: omap2: AM43xx: select ARM TWD timer
Grygorii Strashko (1):
ARM: OMAP: am43xx: enable GENERIC_CLOCKEVENTS_BROADCAST
arch/arm/mach-omap2/Kconfig | 2 ++ arch/arm/mach-omap2/timer.c | 6 ++++++ 2 files changed, 8 insertions(+)
Signature · 1 line
2.6.4
PATCH 1/2 ARM: OMAP: am43xx: enable GENERIC_CLOCKEVENTS_BROADCAST
System will misbehave in the following case:
- AM43XX only build (UP);
- CONFIG_CPU_IDLE=y
- ARM TWD timer enabled and selected as clockevent device.
In the above case, It's expected that broadcast timer will be used as backup timer when CPUIdle will put MPU in low power states where ARM TWD will stop and lose its context. But, the CONFIG_SMP might not be selected when kernel is built for AM43XX SoC only and, as result, GENERIC_CLOCKEVENTS_BROADCAST option will not be selected also. This will break CPUIdle and System will stuck in low power states.
Hence, fix it by selecting GENERIC_CLOCKEVENTS_BROADCAST option for AM43XX SoCs always and add empty tick_broadcast() function implementation - no need to send any IPI on UP. After this change timer1 will be selected as broadcast timer the same way as for SMP, and CPUIdle will work properly.
--- arch/arm/mach-omap2/Kconfig | 1 + arch/arm/mach-omap2/timer.c | 6 ++++++ 2 files changed, 7 insertions(+)
arch/arm/mach-omap2/Kconfig +1 -0
@@ -65,6 +65,7 @@ config SOC_AM43XX select MACH_OMAP_GENERIC select MIGHT_HAVE_CACHE_L2X0 select HAVE_ARM_SCU + select GENERIC_CLOCKEVENTS_BROADCAST config SOC_DRA7XX bool "TI DRA7XX"
arch/arm/mach-omap2/timer.c +6 -0
@@ -320,6 +320,12 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,return r; } +#if !defined(CONFIG_SMP ) && defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST ) +void tick_broadcast (const struct cpumask *mask) +{ +} +#endif +static void __init omap2_gp_clockevent_init (int gptimer_id,const char *fck_source,const char *property)
Signature · 1 line
2.6.4
PATCH 1/2 ARM: OMAP: am43xx: enable GENERIC_CLOCKEVENTS_BROADCAST
Quoted 12 lines · Grygorii Strashko
System will misbehave in the following case:
- AM43XX only build (UP);
-CONFIG_CPU_IDLE=y
- ARM TWD timer enabled and selected as clockevent device.In the above case, It's expected that broadcast timer will be used as backup timer when CPUIdle will put MPU in low power states where ARM TWD will stop and lose its context. But, the
CONFIG_SMPmight not be selected when kernel is built for AM43XX SoC only and, as result,GENERIC_CLOCKEVENTS_BROADCASToption will not be selected also. This will break CPUIdle and System will stuck in low power states.
Quoted 5 lines
Hence, fix it by selecting
GENERIC_CLOCKEVENTS_BROADCASToption for AM43XX SoCs always and add emptytick_broadcast()function implementation - no need to send any IPI on UP. After this change timer1 will be selected as broadcast timer the same way as for SMP, and CPUIdle will work properly.
I've applied both of these into omap-for-v4.4/fixes because of the description above.
Regards,
Tony
Quoted 39 lines
Signed-off-by Grygorii Strashko <[email protected]>--- arch/arm/mach-omap2/Kconfig | 1 + arch/arm/mach-omap2/timer.c | 6 ++++++ 2 files changed, 7 insertions(+)arch/arm/mach-omap2/Kconfig +1
-0@@ -65,6 +65,7 @@ config SOC_AM43XX select MACH_OMAP_GENERIC select MIGHT_HAVE_CACHE_L2X0 select HAVE_ARM_SCU + select GENERIC_CLOCKEVENTS_BROADCAST config SOC_DRA7XX bool "TI DRA7XX"arch/arm/mach-omap2/timer.c +6
-0@@ -320,6 +320,12 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,return r; } +#if !defined(CONFIG_SMP ) && defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST ) +void tick_broadcast (const struct cpumask *mask) +{ +} +#endif +static void __init omap2_gp_clockevent_init (int gptimer_id,const char *fck_source,const char *property)Signature · 1 line
2.6.4
PATCH v2 2/2 arm: omap2: AM43xx: select ARM TWD timer
In reply to Grygorii StrashkoFrom: Felipe Balbi <[email protected]>
Make sure to tell the kernel that AM437x devices have ARM TWD timer.
[grygorii.strashko at ti.com: drop ARM Global timer selection, because
it's incompatible with PM (cpuidle/cpufreq). So, it's unsafe to enable it unconditionally]
---
v1: http://www.spinics.net/lists/arm-kernel/msg459649.html
arch/arm/mach-omap2/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/arm/mach-omap2/Kconfig +1 -0
@@ -66,6 +66,7 @@ config SOC_AM43XX select MIGHT_HAVE_CACHE_L2X0 select HAVE_ARM_SCU select GENERIC_CLOCKEVENTS_BROADCAST + select HAVE_ARM_TWD config SOC_DRA7XX bool "TI DRA7XX"
Signature · 1 line
2.6.4