summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c')
-rw-r--r--c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c61
1 files changed, 29 insertions, 32 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 039edde46e..c6300e254f 100644
--- a/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c
+++ b/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c
@@ -7,10 +7,10 @@
*/
/*
- * Copyright (c) 2011-2012 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2011-2015 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
- * Obere Lagerstr. 30
+ * Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
@@ -20,6 +20,8 @@
* http://www.rtems.org/license/LICENSE.
*/
+#include <rtems/timecounter.h>
+
#include <libcpu/powerpc-utility.h>
#include <bsp.h>
@@ -29,10 +31,6 @@
/* 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 =
#if QORIQ_CLOCK_TIMER < 4
&qoriq.pic.gta [QORIQ_CLOCK_TIMER];
@@ -40,8 +38,17 @@ static volatile qoriq_pic_global_timer *const qoriq_clock =
&qoriq.pic.gtb [QORIQ_CLOCK_TIMER - 4];
#endif
+static volatile qoriq_pic_global_timer *const qoriq_timecounter =
+ #if QORIQ_CLOCK_TIMECOUNTER < 4
+ &qoriq.pic.gta [QORIQ_CLOCK_TIMECOUNTER];
+ #else
+ &qoriq.pic.gtb [QORIQ_CLOCK_TIMECOUNTER - 4];
+ #endif
+
#define CLOCK_INTERRUPT (QORIQ_IRQ_GT_BASE + QORIQ_CLOCK_TIMER)
+static struct timecounter qoriq_clock_tc;
+
static void qoriq_clock_handler_install(rtems_isr_entry *old_isr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
@@ -77,18 +84,28 @@ static void qoriq_clock_handler_install(rtems_isr_entry *old_isr)
}
}
+static uint32_t qoriq_clock_get_timecount(struct timecounter *tc)
+{
+ uint32_t ccr = qoriq_timecounter->ccr;
+
+ return GTCCR_COUNT_GET(-ccr);
+}
+
static void qoriq_clock_initialize(void)
{
uint32_t timer_frequency = BSP_bus_frequency / 8;
- uint32_t nanoseconds_per_second = 1000000000;
uint32_t interval = (uint32_t) (((uint64_t) timer_frequency
* (uint64_t) rtems_configuration_get_microseconds_per_tick()) / 1000000);
- qoriq_clock_nanoseconds_per_timer_tick =
- nanoseconds_per_second / timer_frequency;
-
qoriq_clock->bcr = GTBCR_COUNT(interval);
- qoriq_clock_last_ccr = qoriq_clock->ccr;
+
+ qoriq_timecounter->bcr = GTBCR_COUNT(0xffffffff);
+
+ qoriq_clock_tc.tc_get_timecount = qoriq_clock_get_timecount;
+ qoriq_clock_tc.tc_counter_mask = GTCCR_COUNT_GET(0xffffffff);
+ qoriq_clock_tc.tc_frequency = timer_frequency;
+ qoriq_clock_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
+ rtems_timecounter_install(&qoriq_clock_tc);
}
static void qoriq_clock_cleanup(void)
@@ -107,33 +124,13 @@ 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 ccr = qoriq_clock->ccr;
- uint32_t bcr = qoriq_clock->bcr;
-
- if ((ccr & GTCCR_TOG) != (qoriq_clock_last_ccr & GTCCR_TOG)) {
- bcr += bcr;
- }
-
- return (bcr - GTCCR_COUNT_GET(ccr)) * qoriq_clock_nanoseconds_per_timer_tick;
-}
-
-#define Clock_driver_support_at_tick() \
- qoriq_clock_at_tick()
+#define Clock_driver_support_at_tick()
#define Clock_driver_support_initialize_hardware() \
qoriq_clock_initialize()
#define Clock_driver_support_install_isr(clock_isr, old_isr) \
qoriq_clock_handler_install(&old_isr)
#define Clock_driver_support_shutdown_hardware() \
qoriq_clock_cleanup()
-#define Clock_driver_nanoseconds_since_last_tick \
- qoriq_clock_nanoseconds_since_last_tick
/* Include shared source clock driver code */
#include "../../../shared/clockdrv_shell.h"