arm: omap: timer cleanups
cover arm: omap: timer cleanups
Hi Tony,
Here's the a series of timer cleanups (and a new 32k clocksource driver which is safe to apply during v4.3 merge window. We're only missing, now, two changes to enable TWD timer for AM437x.
All patches are also available in a branch which you can pull should you choose. Pull request below.
The following changes since commit 049e6dde7e57f0054fdc49102e7ef4830c698b46:
Linux 4.3-rc4 (2015-10-04 16:57:17 +0100)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git for-tony
for you to fetch changes up to bf4c94490aa4491cca758d633c0e641a4419c920:
arm: omap2: timer: limit hwmod usage to non-DT boots (2015-10-16 11:06:24 -0500)
----------------------------------------------------------------
Felipe Balbi (11):
arm: omap2: timer: always define omap4_local_timer_init
arm: omap2: timer: get rid of obfuscating macros
arm: omap2: timer: add a gptimer argument to sync32k_timer_init()
arm: omap2: timer: remove __omap_gptimer_init()
arm: omap2: timer: provide generic sync32k_timer_init function
arm: omap2: timer: move realtime_counter_init() around
arm: omap2: timer: always call clocksource_of_init() when DT
arm: omap2: timer: rename omap_sync32k_timer_init()
clocksource: add TI 32.768 Hz counter driver
arm: omap2+: select 32k clocksource driver
arm: omap2: timer: limit hwmod usage to non-DT boots
arch/arm/mach-omap2/Kconfig | 1 + arch/arm/mach-omap2/board-generic.c | 10 +-- arch/arm/mach-omap2/board-ldp.c | 2 +- arch/arm/mach-omap2/board-rx51.c | 2 +- arch/arm/mach-omap2/common.h | 3 +- arch/arm/mach-omap2/timer.c | 162 ++++++++++++++++-------------------- drivers/clocksource/Kconfig | 7 ++ drivers/clocksource/Makefile | 1 + drivers/clocksource/timer-ti-32k.c | 126 ++++++++++++++++++++++++++++ 9 files changed, 215 insertions(+), 99 deletions(-) create mode 100644 drivers/clocksource/timer-ti-32k.c
Signature · 1 line
2.5.3
PATCH 1/11 arm: omap2: timer: always define omap4_local_timer_init
omap4_local_timer_init() can be used by other platforms as is. At least AM437x wants to use it. Instead of making omap4-only and providing a stub for builds without OMAP4, we can just make sure that function is always available for all SoCs that need it.
--- arch/arm/mach-omap2/timer.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-)
arch/arm/mach-omap2/timer.c +3 -13
@@ -630,32 +630,22 @@ OMAP_SYS_32K_TIMER_INIT(3_secure, 12, "secure_32k_fck", "ti,timer-secure", 2, "timer_sys_ck", NULL);#endif /* CONFIG_ARCH_OMAP3 */ -#if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM33XX ) || \ - defined(CONFIG_SOC_AM43XX ) +#if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM33XX )OMAP_SYS_GP_TIMER_INIT (3 ,2 ,"timer_sys_ck" ,NULL ,1 ,"timer_sys_ck" ,"ti,timer-alwon" );#endif #if defined(CONFIG_ARCH_OMAP4 ) || defined(CONFIG_SOC_OMAP5 ) || \ - defined(CONFIG_SOC_DRA7XX ) + defined(CONFIG_SOC_DRA7XX ) || defined(CONFIG_SOC_AM43XX ) static OMAP_SYS_32K_TIMER_INIT(4, 1, "timer_32k_ck", "ti,timer-alwon", 2, "sys_clkin_ck", NULL); -#endif -#ifdef CONFIG_ARCH_OMAP4 -#ifdef CONFIG_HAVE_ARM_TWD void __init omap4_local_timer_init (void ) {omap4_sync32k_timer_init ();clocksource_of_init (); } -#else -void __init omap4_local_timer_init (void ) -{ -omap4_sync32k_timer_init (); -} -#endif /* CONFIG_HAVE_ARM_TWD */ -#endif /* CONFIG_ARCH_OMAP4 */ +#endif #if defined(CONFIG_SOC_OMAP5 ) || defined(CONFIG_SOC_DRA7XX )void __init omap5_realtime_timer_init (void )
Signature · 1 line
2.5.3
PATCH 2/11 arm: omap2: timer: get rid of obfuscating macros
In reply to Felipe Balbithose macros just make it a lot more difficult to grep around and actually find similarities.
In this patch, we will simply remove them and replace with actual functions and later commits will come to further clean this up.
--- arch/arm/mach-omap2/timer.c | 70 ++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 27 deletions(-)
arch/arm/mach-omap2/timer.c +43 -27
@@ -592,53 +592,69 @@ static inline void __init realtime_counter_init(void) {}#endif -#define OMAP_SYS_GP_TIMER_INIT (name, clkev_nr, clkev_src, clkev_prop, \ - clksrc_nr, clksrc_src, clksrc_prop) \ -void __init omap##name##_gptimer_timer_init(void) \ -{ \ - omap_clk_init(); \ - omap_dmtimer_init(); \ - omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ - omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src, \ - clksrc_prop); \ +static void __init __omap_gptimer_init (int clkev_nr,const char *clkev_src, +const char *clkev_prop,int clksrc_nr,const char *clksrc_src, +const char *clksrc_prop) +{ +omap_clk_init (); +omap_dmtimer_init (); +omap2_gp_clockevent_init (clkev_nr, clkev_src, clkev_prop); +omap2_gptimer_clocksource_init (clksrc_nr, clksrc_src, clksrc_prop); } -#define OMAP_SYS_32K_TIMER_INIT (name, clkev_nr, clkev_src, clkev_prop, \ - clksrc_nr, clksrc_src, clksrc_prop) \ -void __init omap##name##_sync32k_timer_init(void) \ -{ \ - omap_clk_init(); \ - omap_dmtimer_init(); \ - omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ -/* Enable the use of clocksource="gp_timer" kernel parameter */ \ -if (use_gptimer_clksrc) \ -omap2_gptimer_clocksource_init ((clksrc_nr), clksrc_src, \ - clksrc_prop); \ -else \ -omap2_sync32k_clocksource_init (); \ +static void __init __omap_sync32k_timer_init (int clkev_nr,const char *clkev_src, +const char *clkev_prop,int clksrc_nr,const char *clksrc_src, +const char *clksrc_prop) +{ +omap_clk_init (); +omap_dmtimer_init (); +omap2_gp_clockevent_init (clkev_nr, clkev_src, clkev_prop); + +/* Enable the use of clocksource="gp_timer" kernel parameter */ +if (use_gptimer_clksrc) +omap2_gptimer_clocksource_init (clksrc_nr, clksrc_src, + clksrc_prop); +else +omap2_sync32k_clocksource_init (); }#ifdef CONFIG_ARCH_OMAP2 -OMAP_SYS_32K_TIMER_INIT (2 ,1 ,"timer_32k_ck" ,"ti,timer-alwon" , +void __init omap2_sync32k_timer_init (void ) +{ +__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" ,2 ,"timer_sys_ck" ,NULL ); +}#endif /* CONFIG_ARCH_OMAP2 */ #if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM43XX ) -OMAP_SYS_32K_TIMER_INIT (3 ,1 ,"timer_32k_ck" ,"ti,timer-alwon" , +void __init omap3_sync32k_timer_init (void ) +{ +__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" ,2 ,"timer_sys_ck" ,NULL ); -OMAP_SYS_32K_TIMER_INIT(3_secure, 12, "secure_32k_fck", "ti,timer-secure", +} + +void __init omap3_secure_sync32k_timer_init (void ) +{ +__omap_sync32k_timer_init (12 ,"secure_32k_fck" ,"ti,timer-secure" ,2 ,"timer_sys_ck" ,NULL ); +}#endif /* CONFIG_ARCH_OMAP3 */ #if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM33XX ) -OMAP_SYS_GP_TIMER_INIT (3 ,2 ,"timer_sys_ck" ,NULL , +void __init omap3_gptimer_timer_init (void ) +{ +__omap_gptimer_init (2 ,"timer_sys_ck" ,NULL ,1 ,"timer_sys_ck" ,"ti,timer-alwon" ); +}#endif #if defined(CONFIG_ARCH_OMAP4 ) || defined(CONFIG_SOC_OMAP5 ) || \ defined(CONFIG_SOC_DRA7XX ) || defined(CONFIG_SOC_AM43XX ) -static OMAP_SYS_32K_TIMER_INIT(4, 1, "timer_32k_ck", "ti,timer-alwon", +static void __init omap4_sync32k_timer_init (void ) +{ +__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" ,2 ,"sys_clkin_ck" ,NULL ); +}void __init omap4_local_timer_init (void ) {
Signature · 1 line
2.5.3
PATCH 3/11 arm: omap2: timer: add a gptimer argument to sync32k_timer_init()
In reply to Felipe Balbias it turns out, __omap_gptimer_init() and __omap_sync32k_timer_init() are essentially the same thing, but __omap_gptimer_init() wants to always use gptimer.
Instead of forcing all those devices to pass a use_gptimer cmdline argument, we add a new function argument to __omap_sync32k_timer_init() in preparation to deleting __omap_gptimer_init().
On a follow-up patch, we will remove uses of __omap_gptimer_init() and replace them with __omap_sync32k_timer_init() and pass the last argument as true.
--- arch/arm/mach-omap2/timer.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
arch/arm/mach-omap2/timer.c +6 -6
@@ -604,14 +604,14 @@ static void __init __omap_gptimer_init(int clkev_nr, const char *clkev_src,static void __init __omap_sync32k_timer_init (int clkev_nr,const char *clkev_src,const char *clkev_prop,int clksrc_nr,const char *clksrc_src, -const char *clksrc_prop) +const char *clksrc_prop,bool gptimer) {omap_clk_init ();omap_dmtimer_init ();omap2_gp_clockevent_init (clkev_nr, clkev_src, clkev_prop);/* Enable the use of clocksource="gp_timer" kernel parameter */ -if (use_gptimer_clksrc) +if (use_gptimer_clksrc || gptimer)omap2_gptimer_clocksource_init (clksrc_nr, clksrc_src, clksrc_prop);else
@@ -622,7 +622,7 @@ static void __init __omap_sync32k_timer_init(int clkev_nr, const char *clkev_srcvoid __init omap2_sync32k_timer_init (void ) {__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" , -2 ,"timer_sys_ck" ,NULL ); +2 ,"timer_sys_ck" ,NULL , false); }#endif /* CONFIG_ARCH_OMAP2 */
@@ -630,13 +630,13 @@ void __init omap2_sync32k_timer_init(void)void __init omap3_sync32k_timer_init (void ) {__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" , -2 ,"timer_sys_ck" ,NULL ); +2 ,"timer_sys_ck" ,NULL , false); }void __init omap3_secure_sync32k_timer_init (void ) {__omap_sync32k_timer_init (12 ,"secure_32k_fck" ,"ti,timer-secure" , -2 ,"timer_sys_ck" ,NULL ); +2 ,"timer_sys_ck" ,NULL , false); }#endif /* CONFIG_ARCH_OMAP3 */
@@ -653,7 +653,7 @@ void __init omap3_gptimer_timer_init(void)static void __init omap4_sync32k_timer_init (void ) {__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" , -2 ,"sys_clkin_ck" ,NULL ); +2 ,"sys_clkin_ck" ,NULL , false); }void __init omap4_local_timer_init (void )
Signature · 1 line
2.5.3
PATCH 4/11 arm: omap2: timer: remove __omap_gptimer_init()
In reply to Felipe Balbi__omap_sync32k_timer_init(), now takes the clock source as a parameter. This means we no longer need __omap_gptimer_init().
Note that __omap_sync32k_timer_init() will be renamed in a follow-up patch as it's not longer 32k source specific.
--- arch/arm/mach-omap2/timer.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-)
arch/arm/mach-omap2/timer.c +2 -12
@@ -592,16 +592,6 @@ static inline void __init realtime_counter_init(void) {}#endif -static void __init __omap_gptimer_init (int clkev_nr,const char *clkev_src, -const char *clkev_prop,int clksrc_nr,const char *clksrc_src, -const char *clksrc_prop) -{ -omap_clk_init (); -omap_dmtimer_init (); -omap2_gp_clockevent_init (clkev_nr, clkev_src, clkev_prop); -omap2_gptimer_clocksource_init (clksrc_nr, clksrc_src, clksrc_prop); -} -static void __init __omap_sync32k_timer_init (int clkev_nr,const char *clkev_src,const char *clkev_prop,int clksrc_nr,const char *clksrc_src,const char *clksrc_prop,bool gptimer)
@@ -643,8 +633,8 @@ void __init omap3_secure_sync32k_timer_init(void)#if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM33XX )void __init omap3_gptimer_timer_init (void ) { -__omap_gptimer_init (2 ,"timer_sys_ck" ,NULL , -1 ,"timer_sys_ck" ,"ti,timer-alwon" ); +__omap_sync32k_timer_init (2 ,"timer_sys_ck" ,NULL , +1 ,"timer_sys_ck" ,"ti,timer-alwon" , true); }#endif
Signature · 1 line
2.5.3
PATCH 5/11 arm: omap2: timer: provide generic sync32k_timer_init function
In reply to Felipe Balbiinstead of constantly defining a small wrapper
around __omap_sync32k_timer_init(), let's define
a generic one which can be used by all OMAPs.
--- arch/arm/mach-omap2/board-generic.c | 10 +++++----- arch/arm/mach-omap2/board-ldp.c | 2 +- arch/arm/mach-omap2/board-rx51.c | 2 +- arch/arm/mach-omap2/common.h | 3 +-- arch/arm/mach-omap2/timer.c | 10 +--------- 5 files changed, 9 insertions(+), 18 deletions(-)
arch/arm/mach-omap2/board-generic.c +5 -5
@@ -46,7 +46,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)") .map_io = omap242x_map_io, .init_early = omap2420_init_early, .init_machine = omap_generic_init, - .init_time = omap2_sync32k_timer_init, + .init_time = omap_sync32k_timer_init, .dt_compat = omap242x_boards_compat, .restart = omap2xxx_restart,MACHINE_END
@@ -63,7 +63,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)") .map_io = omap243x_map_io, .init_early = omap2430_init_early, .init_machine = omap_generic_init, - .init_time = omap2_sync32k_timer_init, + .init_time = omap_sync32k_timer_init, .dt_compat = omap243x_boards_compat, .restart = omap2xxx_restart,MACHINE_END
@@ -82,7 +82,7 @@ DT_MACHINE_START(OMAP3_N900_DT, "Nokia RX-51 board") .init_early = omap3430_init_early, .init_machine = omap_generic_init, .init_late = omap3_init_late, - .init_time = omap3_sync32k_timer_init, + .init_time = omap_sync32k_timer_init, .dt_compat = n900_boards_compat, .restart = omap3xxx_restart,MACHINE_END
@@ -100,7 +100,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)") .init_early = omap3430_init_early, .init_machine = omap_generic_init, .init_late = omap3_init_late, - .init_time = omap3_sync32k_timer_init, + .init_time = omap_sync32k_timer_init, .dt_compat = omap3_boards_compat, .restart = omap3xxx_restart,MACHINE_END
@@ -116,7 +116,7 @@ DT_MACHINE_START(OMAP36XX_DT, "Generic OMAP36xx (Flattened Device Tree)") .init_early = omap3630_init_early, .init_machine = omap_generic_init, .init_late = omap3_init_late, - .init_time = omap3_sync32k_timer_init, + .init_time = omap_sync32k_timer_init, .dt_compat = omap36xx_boards_compat, .restart = omap3xxx_restart,MACHINE_END
arch/arm/mach-omap2/board-ldp.c +1 -1
@@ -424,6 +424,6 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board") .init_irq = omap3_init_irq, .init_machine = omap_ldp_init, .init_late = omap3430_init_late, - .init_time = omap3_sync32k_timer_init, + .init_time = omap_sync32k_timer_init, .restart = omap3xxx_restart,MACHINE_END
arch/arm/mach-omap2/board-rx51.c +1 -1
@@ -136,6 +136,6 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") .init_irq = omap3_init_irq, .init_machine = rx51_init, .init_late = omap3430_init_late, - .init_time = omap3_sync32k_timer_init, + .init_time = omap_sync32k_timer_init, .restart = omap3xxx_restart,MACHINE_END
arch/arm/mach-omap2/common.h +1 -2
@@ -88,8 +88,7 @@ static inline int omap_mux_late_init(void)extern void omap2_init_common_infrastructure (void ); -extern void omap2_sync32k_timer_init (void ); -extern void omap3_sync32k_timer_init (void ); +extern void omap_sync32k_timer_init (void );extern void omap3_secure_sync32k_timer_init (void );extern void omap3_gptimer_timer_init (void );extern void omap4_local_timer_init (void );
arch/arm/mach-omap2/timer.c +1 -9
@@ -608,21 +608,13 @@ static void __init __omap_sync32k_timer_init(int clkev_nr, const char *clkev_srcomap2_sync32k_clocksource_init (); } -#ifdef CONFIG_ARCH_OMAP2 -void __init omap2_sync32k_timer_init (void ) +void __init omap_sync32k_timer_init (void ) {__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" ,2 ,"timer_sys_ck" ,NULL , false); } -#endif /* CONFIG_ARCH_OMAP2 */ #if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM43XX ) -void __init omap3_sync32k_timer_init (void ) -{ -__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" , -2 ,"timer_sys_ck" ,NULL , false); -} -void __init omap3_secure_sync32k_timer_init (void ) { __omap_sync32k_timer_init(12, "secure_32k_fck", "ti,timer-secure",
Signature · 1 line
2.5.3
PATCH 6/11 arm: omap2: timer: move realtime_counter_init() around
In reply to Felipe Balbino functional changes, just moving that function
closer to its calling location.
--- arch/arm/mach-omap2/timer.c | 114 ++++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 58 deletions(-)
arch/arm/mach-omap2/timer.c +56 -58
@@ -476,7 +476,61 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id, clocksource_gpt.name, clksrc.rate); } -#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER +static void __init __omap_sync32k_timer_init (int clkev_nr,const char *clkev_src, +const char *clkev_prop,int clksrc_nr,const char *clksrc_src, +const char *clksrc_prop,bool gptimer) +{ +omap_clk_init (); +omap_dmtimer_init (); +omap2_gp_clockevent_init (clkev_nr, clkev_src, clkev_prop); + +/* Enable the use of clocksource="gp_timer" kernel parameter */ +if (use_gptimer_clksrc || gptimer) +omap2_gptimer_clocksource_init (clksrc_nr, clksrc_src, + clksrc_prop); +else +omap2_sync32k_clocksource_init (); +} + +void __init omap_sync32k_timer_init (void ) +{ +__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" , +2 ,"timer_sys_ck" ,NULL , false); +} + +#if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM43XX ) +void __init omap3_secure_sync32k_timer_init (void ) +{ +__omap_sync32k_timer_init (12 ,"secure_32k_fck" ,"ti,timer-secure" , +2 ,"timer_sys_ck" ,NULL , false); +} +#endif /* CONFIG_ARCH_OMAP3 */ + +#if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM33XX ) +void __init omap3_gptimer_timer_init (void ) +{ +__omap_sync32k_timer_init (2 ,"timer_sys_ck" ,NULL , +1 ,"timer_sys_ck" ,"ti,timer-alwon" , true); +} +#endif + +#if defined(CONFIG_ARCH_OMAP4 ) || defined(CONFIG_SOC_OMAP5 ) || \ + defined(CONFIG_SOC_DRA7XX ) || defined(CONFIG_SOC_AM43XX ) +static void __init omap4_sync32k_timer_init (void ) +{ +__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" , +2 ,"sys_clkin_ck" ,NULL , false); +} + +void __init omap4_local_timer_init (void ) +{ +omap4_sync32k_timer_init (); +clocksource_of_init (); +} +#endif + +#if defined(CONFIG_SOC_OMAP5 ) || defined(CONFIG_SOC_DRA7XX ) +/* * The realtime counter also called master counter, is a free-running * counter, which is related to real time. It produces the count used
@@ -488,6 +542,7 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id,*/ static void __init realtime_counter_init (void ) { +#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER void __iomem *base;static struct clk *sys_clk;unsigned long rate;
@@ -586,66 +641,9 @@ sysclk1_based:set_cntfreq ();iounmap (base); -} -#else -static inline void __init realtime_counter_init (void ) -{} -#endif - -static void __init __omap_sync32k_timer_init (int clkev_nr,const char *clkev_src, -const char *clkev_prop,int clksrc_nr,const char *clksrc_src, -const char *clksrc_prop,bool gptimer) -{ -omap_clk_init (); -omap_dmtimer_init (); -omap2_gp_clockevent_init (clkev_nr, clkev_src, clkev_prop); - -/* Enable the use of clocksource="gp_timer" kernel parameter */ -if (use_gptimer_clksrc || gptimer) -omap2_gptimer_clocksource_init (clksrc_nr, clksrc_src, - clksrc_prop); -else -omap2_sync32k_clocksource_init (); -} - -void __init omap_sync32k_timer_init (void ) -{ -__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" , -2 ,"timer_sys_ck" ,NULL , false); -} - -#if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM43XX ) -void __init omap3_secure_sync32k_timer_init (void ) -{ -__omap_sync32k_timer_init (12 ,"secure_32k_fck" ,"ti,timer-secure" , -2 ,"timer_sys_ck" ,NULL , false); -} -#endif /* CONFIG_ARCH_OMAP3 */ - -#if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM33XX ) -void __init omap3_gptimer_timer_init (void ) -{ -__omap_sync32k_timer_init (2 ,"timer_sys_ck" ,NULL , -1 ,"timer_sys_ck" ,"ti,timer-alwon" , true); -}#endif - -#if defined(CONFIG_ARCH_OMAP4 ) || defined(CONFIG_SOC_OMAP5 ) || \ - defined(CONFIG_SOC_DRA7XX ) || defined(CONFIG_SOC_AM43XX ) -static void __init omap4_sync32k_timer_init (void ) -{ -__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" , -2 ,"sys_clkin_ck" ,NULL , false); } -void __init omap4_local_timer_init (void ) -{ -omap4_sync32k_timer_init (); -clocksource_of_init (); -} -#endif - -#if defined(CONFIG_SOC_OMAP5 ) || defined(CONFIG_SOC_DRA7XX )void __init omap5_realtime_timer_init (void ) {omap4_sync32k_timer_init ();
Signature · 1 line
2.5.3
PATCH 7/11 arm: omap2: timer: always call clocksource_of_init() when DT
In reply to Felipe BalbiIf booting with DT, let's make sure to always call clocksource_of_init() as this will make it easier to move timer code to drivers/clocksource in the future.
--- arch/arm/mach-omap2/timer.c | 3 +++ 1 file changed, 3 insertions(+)
arch/arm/mach-omap2/timer.c +3 -0
@@ -496,6 +496,9 @@ void __init omap_sync32k_timer_init(void) {__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" ,2 ,"timer_sys_ck" ,NULL , false); + +if (of_have_populated_dt ()) +clocksource_of_init (); }#if defined(CONFIG_ARCH_OMAP3 ) || defined(CONFIG_SOC_AM43XX )
Signature · 1 line
2.5.3
PATCH 8/11 arm: omap2: timer: rename omap_sync32k_timer_init()
In reply to Felipe Balbithis function is not only about the 32k sync timer, it's OMAP's generic init_time implementation.
Let's rename it to make that detail easier to
notice.
--- arch/arm/mach-omap2/board-generic.c | 10 +++++----- arch/arm/mach-omap2/board-ldp.c | 2 +- arch/arm/mach-omap2/board-rx51.c | 2 +- arch/arm/mach-omap2/common.h | 2 +- arch/arm/mach-omap2/timer.c | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-)
arch/arm/mach-omap2/board-generic.c +5 -5
@@ -46,7 +46,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)") .map_io = omap242x_map_io, .init_early = omap2420_init_early, .init_machine = omap_generic_init, - .init_time = omap_sync32k_timer_init, + .init_time = omap_init_time, .dt_compat = omap242x_boards_compat, .restart = omap2xxx_restart,MACHINE_END
@@ -63,7 +63,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)") .map_io = omap243x_map_io, .init_early = omap2430_init_early, .init_machine = omap_generic_init, - .init_time = omap_sync32k_timer_init, + .init_time = omap_init_time, .dt_compat = omap243x_boards_compat, .restart = omap2xxx_restart,MACHINE_END
@@ -82,7 +82,7 @@ DT_MACHINE_START(OMAP3_N900_DT, "Nokia RX-51 board") .init_early = omap3430_init_early, .init_machine = omap_generic_init, .init_late = omap3_init_late, - .init_time = omap_sync32k_timer_init, + .init_time = omap_init_time, .dt_compat = n900_boards_compat, .restart = omap3xxx_restart,MACHINE_END
@@ -100,7 +100,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)") .init_early = omap3430_init_early, .init_machine = omap_generic_init, .init_late = omap3_init_late, - .init_time = omap_sync32k_timer_init, + .init_time = omap_init_time, .dt_compat = omap3_boards_compat, .restart = omap3xxx_restart,MACHINE_END
@@ -116,7 +116,7 @@ DT_MACHINE_START(OMAP36XX_DT, "Generic OMAP36xx (Flattened Device Tree)") .init_early = omap3630_init_early, .init_machine = omap_generic_init, .init_late = omap3_init_late, - .init_time = omap_sync32k_timer_init, + .init_time = omap_init_time, .dt_compat = omap36xx_boards_compat, .restart = omap3xxx_restart,MACHINE_END
arch/arm/mach-omap2/board-ldp.c +1 -1
@@ -424,6 +424,6 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board") .init_irq = omap3_init_irq, .init_machine = omap_ldp_init, .init_late = omap3430_init_late, - .init_time = omap_sync32k_timer_init, + .init_time = omap_init_time, .restart = omap3xxx_restart,MACHINE_END
arch/arm/mach-omap2/board-rx51.c +1 -1
@@ -136,6 +136,6 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") .init_irq = omap3_init_irq, .init_machine = rx51_init, .init_late = omap3430_init_late, - .init_time = omap_sync32k_timer_init, + .init_time = omap_init_time, .restart = omap3xxx_restart,MACHINE_END
arch/arm/mach-omap2/common.h +1 -1
@@ -88,7 +88,7 @@ static inline int omap_mux_late_init(void)extern void omap2_init_common_infrastructure (void ); -extern void omap_sync32k_timer_init (void ); +extern void omap_init_time (void );extern void omap3_secure_sync32k_timer_init (void );extern void omap3_gptimer_timer_init (void );extern void omap4_local_timer_init (void );
arch/arm/mach-omap2/timer.c +1 -1
@@ -492,7 +492,7 @@ static void __init __omap_sync32k_timer_init(int clkev_nr, const char *clkev_srcomap2_sync32k_clocksource_init (); } -void __init omap_sync32k_timer_init (void ) +void __init omap_init_time (void ) {__omap_sync32k_timer_init (1 ,"timer_32k_ck" ,"ti,timer-alwon" ,2 ,"timer_sys_ck" ,NULL , false);
Signature · 1 line
2.5.3
PATCH 9/11 clocksource: add TI 32.768 Hz counter driver
In reply to Felipe BalbiIntroduce a new clocksource driver for Texas
Instruments 32.768 Hz device which is available
on most OMAP-like devices.
--- drivers/clocksource/Kconfig | 7 +++ drivers/clocksource/Makefile | 1 + drivers/clocksource/timer-ti-32k.c | 126 +++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 drivers/clocksource/timer-ti-32k.c
drivers/clocksource/Kconfig +7 -0
@@ -115,6 +115,13 @@ config CLKSRC_PISTACHIO bool select CLKSRC_OF +config CLKSRC_TI_32K + bool "Texas Instruments 32.768 Hz Clocksource" if COMPILE_TEST + select CLKSRC_OF if OF + help + This option enables support for Texas Instruments 32.768 Hz clocksource + available on many OMAP-like platforms. + config CLKSRC_STM32 bool "Clocksource for STM32 SoCs" if !ARCH_STM32 depends on OF && ARM && (ARCH_STM32 || COMPILE_TEST)
drivers/clocksource/Makefile +1 -0
@@ -45,6 +45,7 @@ obj-$(CONFIG_VF_PIT_TIMER) += vf_pit_timer.o obj-$(CONFIG_CLKSRC_QCOM) += qcom-timer.o obj-$(CONFIG_MTK_TIMER) += mtk_timer.o obj-$(CONFIG_CLKSRC_PISTACHIO) += time-pistachio.o +obj-$(CONFIG_CLKSRC_TI_32K) += timer-ti-32k.o obj-$(CONFIG_ARM_ARCH_TIMER) += arm_arch_timer.o obj-$(CONFIG_ARM_GLOBAL_TIMER) += arm_global_timer.o
drivers/clocksource/timer-ti-32k.c new file +126 -0
126 lines not on this page · raw message
Signature · 1 line
2.5.3
kbuild test robot
build botRe: [PATCH 09/11] clocksource: add TI 32.768 Hz counter driver
reproduce:
Hi Felipe,
[auto build test ERROR on omap/for-next -- if it's inappropriate base, please suggest rules for selecting the more suitable base]
url: https://github.com/0day-ci/linux/commits/Felipe-Balbi/arm-omap-timer-cleanups/20151017-002649 config: i386-allmodconfig (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=i386
All errors (new ones prefixed by >>):
drivers/built-in.o: In function `ti_32k_timer_init':
>> timer-ti-32k.c:(.init.text+0x213a6): undefined reference to `sched_clock_register'
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
PATCH 1/1 clocksource: ti-32k: make it depend on GENERIC_CLOCKSOURCE
the new ti 32k clocksource driver should depend on GENERIC_CLOCKSOURCE because of its reliance on sched_clock_register().
Let's enable that to avoid any possible build errors and/or warnings on randbuilds.
--- drivers/clocksource/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/clocksource/Kconfig +1 -0
@@ -117,6 +117,7 @@ config CLKSRC_PISTACHIO config CLKSRC_TI_32K bool "Texas Instruments 32.768 Hz Clocksource" if COMPILE_TEST + depends on GENERIC_SCHED_CLOCK select CLKSRC_OF if OF help This option enables support for Texas Instruments 32.768 Hz clocksource
Signature · 1 line
2.5.3
Tony Lindgren
maintainerPATCH 1/1 clocksource: ti-32k: make it depend on GENERIC_CLOCKSOURCE
Quoted 6 lines · Felipe Balbi
the new ti 32k clocksource driver should depend on
GENERIC_CLOCKSOURCEbecause of its reliance onsched_clock_register().Let's enable that to avoid any possible build errors and/or warnings on randbuilds.
Thanks applying this on omap-for-v4.4/soc.
Tony
PATCH 10/11 arm: omap2+: select 32k clocksource driver
In reply to Felipe BalbiNow that we have a 32k clocksource driver, let's
select it for OMAP2PLUS builds.
--- arch/arm/mach-omap2/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/arm/mach-omap2/Kconfig +1 -0
@@ -96,6 +96,7 @@ config ARCH_OMAP2PLUS select SOC_BUS select TI_PRIV_EDMA select OMAP_IRQCHIP + select CLKSRC_TI_32K help Systems based on OMAP2, OMAP3, OMAP4 or OMAP5
Signature · 1 line
2.5.3
PATCH 11/11 arm: omap2: timer: limit hwmod usage to non-DT boots
In reply to Felipe Balbinow that we have a working 32k clocksource driver, we can limit HWMOD usage to non-DT boots and rely on clocksource_of_init() every time we boot with DT.
While at that, also make sure that we don't disable the 32-counter device so it gets probed by its driver.
--- arch/arm/mach-omap2/timer.c | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-)
arch/arm/mach-omap2/timer.c +13 -20
@@ -183,7 +183,8 @@ static struct device_node * __init omap_get_timer_dt(const struct of_device_id * of_get_property(np, "ti,timer-secure", NULL))) continue; -of_add_property (np, &device_disabled); +if (!of_device_is_compatible (np,"ti,omap-counter32k" )) +of_add_property (np, &device_disabled);return np; }
@@ -394,7 +395,6 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void)int ret;struct device_node *np =NULL ;struct omap_hwmod *oh; -void __iomem *vbase;const char *oh_name ="counter_32k" ;/*
@@ -420,18 +420,6 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void)omap_hwmod_setup_one (oh_name); -if (np) { - vbase =of_iomap (np,0 ); -of_node_put (np); - }else { - vbase =omap_hwmod_get_mpu_rt_va (oh); - } - -if (!vbase) { -pr_warn ("%s: failed to get counter_32k resource\n" , __func__); -return -ENXIO ; - } - ret =omap_hwmod_enable (oh);if (ret) { pr_warn("%s: failed to enable counter_32k module (%d)\n",
@@ -439,13 +427,18 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void)return ret; } - ret =omap_init_clocksource_32k (vbase); -if (ret) { -pr_warn ("%s: failed to initialize counter_32k as a clocksource (%d)\n" , - __func__, ret); -omap_hwmod_idle (oh); - } +if (!of_have_populated_dt ()) { +void __iomem *vbase; + vbase =omap_hwmod_get_mpu_rt_va (oh); + + ret =omap_init_clocksource_32k (vbase); +if (ret) { +pr_warn ("%s: failed to initialize counter_32k as a clocksource (%d)\n" , + __func__, ret); +omap_hwmod_idle (oh); + } + }return ret; }
Signature · 1 line
2.5.3
Tony Lindgren
maintainercover arm: omap: timer cleanups
In reply to Felipe BalbiQuoted 13 lines · Felipe Balbi
Hi Tony,
Here's the a series of timer cleanups (and a new 32k clocksource driver which is safe to apply during v4.3 merge window. We're only missing, now, two changes to enable TWD timer for AM437x.
All patches are also available in a branch which you can pull should you choose. Pull request below.
The following changes since commit
049e6dde7e57f0054fdc49102e7ef4830c698b46:Linux 4.3-rc4 (2015-10-04 16:57:17 +0100)
Quoted 7 lines
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.gitfor-tonyfor you to fetch changes up to
bf4c94490aa4491cca758d633c0e641a4419c920:arm: omap2: timer: limit hwmod usage to non-DT boots (2015-10-16 11:06:24 -0500)
Great! I'm pulling this into omap-for-v4.4/soc and then assuming no issues in Linux next we'll hopefully have it in for v4.4.
Regards,
Tony
Quoted 35 lines
----------------------------------------------------------------
Felipe Balbi (11):
arm: omap2: timer: always defineomap4_local_timer_init
arm: omap2: timer: get rid of obfuscating macros
arm: omap2: timer: add a gptimer argument tosync32k_timer_init()
arm: omap2: timer: remove__omap_gptimer_init()
arm: omap2: timer: provide genericsync32k_timer_initfunction
arm: omap2: timer: moverealtime_counter_init()around
arm: omap2: timer: always callclocksource_of_init()when DT
arm: omap2: timer: renameomap_sync32k_timer_init()
clocksource: add TI 32.768 Hz counter driver
arm: omap2+: select 32k clocksource driver
arm: omap2: timer: limit hwmod usage to non-DT bootsarch/arm/mach-omap2/Kconfig | 1 + arch/arm/mach-omap2/board-generic.c | 10 +-- arch/arm/mach-omap2/board-ldp.c | 2 +- arch/arm/mach-omap2/board-rx51.c | 2 +- arch/arm/mach-omap2/common.h | 3 +- arch/arm/mach-omap2/timer.c | 162 ++++++++++++++++-------------------- drivers/clocksource/Kconfig | 7 ++ drivers/clocksource/Makefile | 1 + drivers/clocksource/timer-ti-32k.c | 126 ++++++++++++++++++++++++++++ 9 files changed, 215 insertions(+), 99 deletions(-) create mode 100644 drivers/clocksource/timer-ti-32k.cSignature · 7 lines
2.5.3 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel