ARM: OMAP: timer32k: fix tick count calculation when reprogramming
Subsystems (2)
PATCH 1/1 ARM: OMAP: timer32k: fix tick count calculation when reprogramming
Reprogramming takes places before putting the CPU into idle mode if the dynamic tick option is enabled. The timer is then set to expire at the next pending timer event. Because some time has already passed since the last reported jiffy we have to wait less than the time specified in jiffies.
Also make sure we don't set a load value of 0 whose outcome is unspecified according to the TRM.
--
arch/arm/plat-omap/timer32k.c +11 -1
@@ -132,6 +132,8 @@ static inline unsigned long omap_32k_synstatic inline void omap_32k_timer_start (unsigned long load_val) {if (cpu_class_is_omap1 ()) { +if (!load_val) + load_val =1 ;omap_32k_timer_write (load_val,OMAP1_32K_TIMER_TVR );omap_32k_timer_write (0x0f ,OMAP1_32K_TIMER_CR ); }
@@ -236,7 +238,15 @@ static irqreturn_t omap_32k_timer_interr*/ void omap_32k_timer_reprogram (unsigned long next_tick) { -omap_32k_timer_start (JIFFIES_TO_HW_TICKS (next_tick,32768 ) +1 ); +unsigned long ticks =JIFFIES_TO_HW_TICKS (next_tick,32768 ) +1 ; +unsigned long now =omap_32k_sync_timer_read (); +unsigned long idled = now - omap_32k_last_tick; + +if (idled +1 < ticks) + ticks -= idled; +else + ticks =1 ; +omap_32k_timer_start (ticks); }static struct irqaction omap_32k_timer_irq;
Quoted 5 lines · * [email protected] <[email protected]> [060703 08:51]:
Reprogramming takes places before putting the CPU into idle mode if the dynamic tick option is enabled. The timer is then set to expire at the next pending timer event. Because some time has already passed since the last reported jiffy we have to wait less than the time specified in jiffies.
Looks good to me. This patch seems to need an update though.
Did you do this to fix some specific problem, or just to improve timer accuracy?
Quoted 2 lines
Also make sure we don't set a load value of 0 whose outcome is unspecified according to the TRM.
OK
Tony
Quoted 8 lines · On Wed, Jul 05, 2006 at 01:51:04AM -0700, [email protected] wrote:
Quoted 5 lines · * [email protected] <[email protected]> [060703 08:51]:
Reprogramming takes places before putting the CPU into idle mode if the dynamic tick option is enabled. The timer is then set to expire at the next pending timer event. Because some time has already passed since the last reported jiffy we have to wait less than the time specified in jiffies.
Looks good to me. This patch seems to need an update though.
Sorry, the patch was against an older commit.. The updated one:
arch/arm/plat-omap/timer32k.c +11 -1
@@ -106,6 +106,8 @@ static inline unsigned long omap_32k_timstatic inline void omap_32k_timer_start (unsigned long load_val) { +if (!load_val) + load_val =1 ;omap_32k_timer_write (load_val,OMAP1_32K_TIMER_TVR );omap_32k_timer_write (0x0f ,OMAP1_32K_TIMER_CR ); }
@@ -230,7 +232,15 @@ static irqreturn_t omap_32k_timer_interr*/ void omap_32k_timer_reprogram (unsigned long next_tick) { -omap_32k_timer_start (JIFFIES_TO_HW_TICKS (next_tick,32768 ) +1 ); +unsigned long ticks =JIFFIES_TO_HW_TICKS (next_tick,32768 ) +1 ; +unsigned long now =omap_32k_sync_timer_read (); +unsigned long idled = now - omap_32k_last_tick; + +if (idled +1 < ticks) + ticks -= idled; +else + ticks =1 ; +omap_32k_timer_start (ticks); }static struct irqaction omap_32k_timer_irq;
Quoted 3 lines
Did you do this to fix some specific problem, or just to improve timer accuracy?
It's about timer accuracy. Currently we are using the system timer through the hrtimer API and need a 1 jiffy resolution.
--Imre
Quoted 7 lines
Quoted 3 lines
Also make sure we don't set a load value of 0 whose outcome is unspecified according to the TRM.
OK
Tony