ARM: OMAP: Fix 32k clockevents for 2430
Subsystems (2)
PATCH 1/1 ARM: OMAP: Fix 32k clockevents for 2430
32k timer driver was using wrong base addr for 32k sync timer. Also fix unsupported one-shot mode in set_mode hook.
Signed-off-by Kevin Hilman <[email protected]>
--- arch/arm/plat-omap/common.c | 6 ++---- arch/arm/plat-omap/timer32k.c | 10 ++++------ 2 files changed, 6 insertions(+), 10 deletions(-)
arch/arm/plat-omap/common.c +2 -4
@@ -191,10 +191,8 @@ console_initcall(omap_add_serial_console#if defined(CONFIG_ARCH_OMAP16XX )#define TIMER_32K_SYNCHRONIZED 0xfffbc410 -#elif defined(CONFIG_ARCH_OMAP2420 ) -#define TIMER_32K_SYNCHRONIZED 0x48004010 -#elif defined(CONFIG_ARCH_OMAP2430 ) -#define TIMER_32K_SYNCHRONIZED 0x49020010 +#elif defined(CONFIG_ARCH_OMAP24XX ) +#define TIMER_32K_SYNCHRONIZED (OMAP24XX_32KSYNCT_BASE + 0x10)#endif #ifdef TIMER_32K_SYNCHRONIZED
arch/arm/plat-omap/timer32k.c +4 -6
@@ -71,7 +71,7 @@ struct sys_timer omap_timer;#if defined(CONFIG_ARCH_OMAP16XX )#define TIMER_32K_SYNCHRONIZED 0xfffbc410#elif defined(CONFIG_ARCH_OMAP24XX ) -#define TIMER_32K_SYNCHRONIZED 0x48004010 +#define TIMER_32K_SYNCHRONIZED (OMAP24XX_32KSYNCT_BASE + 0x10)#else #error OMAP 32KHz timer does not currently work on 15XX!#endif
@@ -147,14 +147,15 @@ static inline void omap_32k_timer_ack_irstatic void omap_32k_timer_set_mode (enum clock_event_mode mode,struct clock_event_device *evt) { +omap_32k_timer_stop (); +switch (mode) { -case CLOCK_EVT_MODE_ONESHOT :case CLOCK_EVT_MODE_PERIODIC :omap_32k_timer_start (OMAP_32K_TIMER_TICK_PERIOD );break ; +case CLOCK_EVT_MODE_ONESHOT :case CLOCK_EVT_MODE_UNUSED :case CLOCK_EVT_MODE_SHUTDOWN : -omap_32k_timer_stop ();break ; } }
@@ -192,8 +193,6 @@ omap_32k_ticks_to_nsecs(unsigned long tireturn (unsigned long long ) ticks_32k *1000 *5 *5 *5 *5 *5 *5 >>9 ; } -static unsigned long omap_32k_last_tick =0 ; -/* * Returns current time from boot in nsecs. It's OK for this to wrap * around for now, as it's just a relative time stamp.
@@ -223,7 +222,6 @@ static __init void omap_init_32k_timer(v {if (cpu_class_is_omap1 ())setup_irq (INT_OS_TIMER , &omap_32k_timer_irq); - omap_32k_last_tick =omap_32k_sync_timer_read ();#ifdef CONFIG_ARCH_OMAP2 /* REVISIT: Check 24xx TIOCP_CFG settings after idle works */
--
Quoted 2 lines · Kevin Hilman
32k timer driver was using wrong base addr for 32k sync timer. Also fix unsupported one-shot mode in
set_modehook.
Thanks, I've refreshed omap-fixes and and applied it to omap-fixes. Also updated the comments accordingly, see below.
Tony
From: Kevin Hilman <[email protected]>
Subject: ARM: OMAP: Fix 32k timer unsupported one-shot mode
Fix unsupported one-shot mode in set_mode hook.
Signed-off-by Kevin Hilman <[email protected]>
--- arch/arm/plat-omap/common.c | 6 ++---- arch/arm/plat-omap/timer32k.c | 10 ++++------ 2 files changed, 6 insertions(+), 10 deletions(-)
arch/arm/plat-omap/common.c +1 -1
@@ -172,7 +172,7 @@ console_initcall(omap_add_serial_console#if defined(CONFIG_ARCH_OMAP16XX )#define TIMER_32K_SYNCHRONIZED 0xfffbc410#elif defined(CONFIG_ARCH_OMAP24XX ) -#define TIMER_32K_SYNCHRONIZED 0x48004010 +#define TIMER_32K_SYNCHRONIZED (OMAP24XX_32KSYNCT_BASE + 0x10)#endif #ifdef TIMER_32K_SYNCHRONIZED
arch/arm/plat-omap/timer32k.c +4 -6
@@ -71,7 +71,7 @@ struct sys_timer omap_timer;#if defined(CONFIG_ARCH_OMAP16XX )#define TIMER_32K_SYNCHRONIZED 0xfffbc410#elif defined(CONFIG_ARCH_OMAP24XX ) -#define TIMER_32K_SYNCHRONIZED 0x48004010 +#define TIMER_32K_SYNCHRONIZED (OMAP24XX_32KSYNCT_BASE + 0x10)#else #error OMAP 32KHz timer does not currently work on 15XX!#endif
@@ -147,14 +147,15 @@ static inline void omap_32k_timer_ack_irstatic void omap_32k_timer_set_mode (enum clock_event_mode mode,struct clock_event_device *evt) { +omap_32k_timer_stop (); +switch (mode) { -case CLOCK_EVT_MODE_ONESHOT :case CLOCK_EVT_MODE_PERIODIC :omap_32k_timer_start (OMAP_32K_TIMER_TICK_PERIOD );break ; +case CLOCK_EVT_MODE_ONESHOT :case CLOCK_EVT_MODE_UNUSED :case CLOCK_EVT_MODE_SHUTDOWN : -omap_32k_timer_stop ();break ; } }
@@ -192,8 +193,6 @@ omap_32k_ticks_to_nsecs(unsigned long tireturn (unsigned long long ) ticks_32k *1000 *5 *5 *5 *5 *5 *5 >>9 ; } -static unsigned long omap_32k_last_tick =0 ; -/* * Returns current time from boot in nsecs. It's OK for this to wrap * around for now, as it's just a relative time stamp.
@@ -223,7 +222,6 @@ static __init void omap_init_32k_timer(v {if (cpu_class_is_omap1 ())setup_irq (INT_OS_TIMER , &omap_32k_timer_irq); - omap_32k_last_tick =omap_32k_sync_timer_read ();#ifdef CONFIG_ARCH_OMAP2 /* REVISIT: Check 24xx TIOCP_CFG settings after idle works */