summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Cederman <cederman@gaisler.com>2014-08-21 09:49:42 +0200
committerDaniel Hellstrom <daniel@gaisler.com>2014-11-20 15:25:23 +0100
commitfa3b2a11d5723878e86c401515345f1e8294694f (patch)
tree89659280d0ef2fdbbf4058028c35341737f853da
parent1ff5b7cc80816756b579f65dc67bfc394a0f5029 (diff)
LEON3: Clear timer pending bit together with tick update in critical sectionrcc-v1.2.99.1smp-toolchain-nov2014
-rw-r--r--c/src/lib/libbsp/sparc/leon3/clock/ckinit.c15
-rw-r--r--cpukit/score/src/coretodtickle.c10
2 files changed, 24 insertions, 1 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
index f382f1abc6..afc9292fde 100644
--- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
@@ -35,6 +35,7 @@
volatile struct gptimer_regs *LEON3_Timer_Regs = 0;
static int clkirq;
+static unsigned char irq_ack_mask;
static void leon3_clock_profiling_interrupt_delay(void)
{
@@ -126,6 +127,11 @@ static void bsp_clock_handler_install(rtems_isr *new)
#define Clock_driver_support_initialize_hardware() \
do { \
+ LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl = GPTIMER_TIMER_CTRL_IP; \
+ if ((LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl & GPTIMER_TIMER_CTRL_IP) != 0) \
+ irq_ack_mask = (unsigned char)~GPTIMER_TIMER_CTRL_IP; \
+ else \
+ irq_ack_mask = (unsigned char)~0; \
LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].reload = \
rtems_configuration_get_microseconds_per_tick() - 1; \
\
@@ -140,6 +146,13 @@ static void bsp_clock_handler_install(rtems_isr *new)
LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl = 0; \
} while (0)
+void leon3_clear_timer_interrupt_pending_bit(void);
+void leon3_clear_timer_interrupt_pending_bit(void)
+{
+ unsigned int ctrl = LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl;
+ LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl = ctrl & irq_ack_mask;
+}
+
static uint32_t bsp_clock_nanoseconds_since_last_tick(void)
{
uint32_t clicks;
@@ -150,7 +163,7 @@ static uint32_t bsp_clock_nanoseconds_since_last_tick(void)
clicks = LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].value;
- if ( LEON_Is_interrupt_pending( clkirq ) ) {
+ if( LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl & GPTIMER_TIMER_CTRL_IP ) {
clicks = LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].value;
usecs = (2*rtems_configuration_get_microseconds_per_tick() - clicks);
} else {
diff --git a/cpukit/score/src/coretodtickle.c b/cpukit/score/src/coretodtickle.c
index 9116fc1a3b..4adba8f7e0 100644
--- a/cpukit/score/src/coretodtickle.c
+++ b/cpukit/score/src/coretodtickle.c
@@ -22,6 +22,11 @@
#include <rtems/score/watchdogimpl.h>
#include <rtems/config.h>
+#ifdef __leon__
+ /* Hack used until API has been defined */
+ void leon3_clear_timer_interrupt_pending_bit(void);
+#endif
+
void _TOD_Tickle_ticks( void )
{
TOD_Control *tod = &_TOD;
@@ -39,6 +44,11 @@ void _TOD_Tickle_ticks( void )
_TOD_Acquire( tod, &lock_context );
+#ifdef __leon__
+ /* Hack used until API has been defined */
+ leon3_clear_timer_interrupt_pending_bit();
+#endif
+
/* Update the uptime */
_Timestamp_Add_to( &tod->uptime, &tick );