summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-12-22 10:14:10 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-01-09 14:03:35 +0100
commit691cc202897213a1b16cee609e0bf8416d11a476 (patch)
tree874748028a423b8fb4a15ba338bd87589e9cf31c /c/src/lib/libbsp/powerpc
parentbsp/qoriq: Increase MAS0[ESEL] width (diff)
downloadrtems-691cc202897213a1b16cee609e0bf8416d11a476.tar.bz2
bsp/qoriq: Fix nanoseconds extension
Diffstat (limited to 'c/src/lib/libbsp/powerpc')
-rw-r--r--c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c b/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c
index 80f6426658..039edde46e 100644
--- a/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c
+++ b/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c
@@ -29,6 +29,8 @@
/* This is defined in clockdrv_shell.h */
static rtems_isr Clock_isr(void *arg);
+static uint32_t qoriq_clock_last_ccr;
+
static uint32_t qoriq_clock_nanoseconds_per_timer_tick;
static volatile qoriq_pic_global_timer *const qoriq_clock =
@@ -86,6 +88,7 @@ static void qoriq_clock_initialize(void)
nanoseconds_per_second / timer_frequency;
qoriq_clock->bcr = GTBCR_COUNT(interval);
+ qoriq_clock_last_ccr = qoriq_clock->ccr;
}
static void qoriq_clock_cleanup(void)
@@ -104,15 +107,25 @@ static void qoriq_clock_cleanup(void)
}
}
+static void qoriq_clock_at_tick(void)
+{
+ qoriq_clock_last_ccr = qoriq_clock->ccr;
+}
+
static uint32_t qoriq_clock_nanoseconds_since_last_tick(void)
{
- uint32_t current = GTCCR_COUNT_GET(qoriq_clock->ccr);
- uint32_t base = qoriq_clock->bcr;
+ uint32_t ccr = qoriq_clock->ccr;
+ uint32_t bcr = qoriq_clock->bcr;
+
+ if ((ccr & GTCCR_TOG) != (qoriq_clock_last_ccr & GTCCR_TOG)) {
+ bcr += bcr;
+ }
- return (base - current) * qoriq_clock_nanoseconds_per_timer_tick;
+ return (bcr - GTCCR_COUNT_GET(ccr)) * qoriq_clock_nanoseconds_per_timer_tick;
}
-#define Clock_driver_support_at_tick()
+#define Clock_driver_support_at_tick() \
+ qoriq_clock_at_tick()
#define Clock_driver_support_initialize_hardware() \
qoriq_clock_initialize()
#define Clock_driver_support_install_isr(clock_isr, old_isr) \