summaryrefslogtreecommitdiffstats
path: root/bsps/sparc/erc32/clock/ckinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/sparc/erc32/clock/ckinit.c')
-rw-r--r--bsps/sparc/erc32/clock/ckinit.c138
1 files changed, 66 insertions, 72 deletions
diff --git a/bsps/sparc/erc32/clock/ckinit.c b/bsps/sparc/erc32/clock/ckinit.c
index e7c5b07f33..6d6a335fed 100644
--- a/bsps/sparc/erc32/clock/ckinit.c
+++ b/bsps/sparc/erc32/clock/ckinit.c
@@ -24,103 +24,97 @@
#include <bsp.h>
#include <bspopts.h>
-#include <rtems/counter.h>
+#include <rtems/sysinit.h>
#include <rtems/timecounter.h>
#include <rtems/score/sparcimpl.h>
-#define ERC32_REAL_TIME_CLOCK_FREQUENCY 1000000
-
-/*
- * The Real Time Clock Counter Timer uses this trap type.
- */
-#define CLOCK_VECTOR ERC32_TRAP_TYPE( ERC32_INTERRUPT_REAL_TIME_CLOCK )
-
-#define Clock_driver_support_install_isr( _new ) \
- set_vector( _new, CLOCK_VECTOR, 1 )
-
-#define Clock_driver_support_set_interrupt_affinity( _online_processors ) \
- do { \
- (void) _online_processors; \
- } while (0)
-
extern int CLOCK_SPEED;
-static rtems_timecounter_simple erc32_tc;
+#define ERC32_REAL_TIME_CLOCK_FREQUENCY 1000000
-static uint32_t erc32_tc_get( rtems_timecounter_simple *tc )
-{
- return ERC32_MEC.Real_Time_Clock_Counter;
-}
+static struct timecounter erc32_tc;
-static bool erc32_tc_is_pending( rtems_timecounter_simple *tc )
+static void erc32_clock_init( void )
{
- return ERC32_Is_interrupt_pending( ERC32_INTERRUPT_REAL_TIME_CLOCK );
+ struct timecounter *tc;
+
+ tc = &erc32_tc;
+ tc->tc_get_timecount = _SPARC_Get_timecount_clock;
+ tc->tc_counter_mask = 0xffffffff;
+ tc->tc_frequency = ERC32_REAL_TIME_CLOCK_FREQUENCY;
+ tc->tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
+ rtems_timecounter_install(tc);
}
-static uint32_t erc32_tc_get_timecount( struct timecounter *tc )
+uint32_t _CPU_Counter_frequency(void)
{
- return rtems_timecounter_simple_downcounter_get(
- tc,
- erc32_tc_get,
- erc32_tc_is_pending
- );
+ return ERC32_REAL_TIME_CLOCK_FREQUENCY;
}
-static void erc32_tc_at_tick( rtems_timecounter_simple *tc )
+static void erc32_clock_at_tick( void )
{
- /* Nothing to do */
-}
+ SPARC_Counter *counter;
+ rtems_interrupt_level level;
-static void erc32_tc_tick( void )
-{
- rtems_timecounter_simple_downcounter_tick(
- &erc32_tc,
- erc32_tc_get,
- erc32_tc_at_tick
- );
+ counter = &_SPARC_Counter_mutable;
+ rtems_interrupt_local_disable(level);
+
+ ERC32_Clear_interrupt( ERC32_INTERRUPT_REAL_TIME_CLOCK );
+ counter->accumulated += counter->interval;
+
+ rtems_interrupt_local_enable(level);
}
-static void erc32_counter_initialize( void )
+static void erc32_clock_initialize_early( void )
{
- _SPARC_Counter_initialize(
- _SPARC_Counter_read_address,
- _SPARC_Counter_difference_clock_period,
- &ERC32_MEC.Real_Time_Clock_Counter
+ SPARC_Counter *counter;
+
+ /* approximately 1 us per countdown */
+ ERC32_MEC.Real_Time_Clock_Scalar = CLOCK_SPEED - 1;
+ ERC32_MEC.Real_Time_Clock_Counter =
+ rtems_configuration_get_microseconds_per_tick();
+ ERC32_MEC_Set_Real_Time_Clock_Timer_Control(
+ ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING |
+ ERC32_MEC_TIMER_COUNTER_LOAD_SCALER |
+ ERC32_MEC_TIMER_COUNTER_LOAD_COUNTER
+ );
+ ERC32_MEC_Set_Real_Time_Clock_Timer_Control(
+ ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING |
+ ERC32_MEC_TIMER_COUNTER_RELOAD_AT_ZERO
);
-}
-uint32_t _CPU_Counter_frequency(void)
-{
- return ERC32_REAL_TIME_CLOCK_FREQUENCY;
+ counter = &_SPARC_Counter_mutable;
+ counter->read_isr_disabled = _SPARC_Counter_read_clock_isr_disabled;
+ counter->read = _SPARC_Counter_read_clock;
+ counter->counter_register = &ERC32_MEC.Real_Time_Clock_Counter,
+ counter->pending_register = &ERC32_MEC.Interrupt_Pending;
+ counter->pending_mask = UINT32_C(1) << ERC32_INTERRUPT_REAL_TIME_CLOCK;
+ counter->accumulated = rtems_configuration_get_microseconds_per_tick();
+ counter->interval = rtems_configuration_get_microseconds_per_tick();
}
-#define Clock_driver_support_initialize_hardware() \
+RTEMS_SYSINIT_ITEM(
+ erc32_clock_initialize_early,
+ RTEMS_SYSINIT_CPU_COUNTER,
+ RTEMS_SYSINIT_ORDER_FIRST
+);
+
+/*
+ * The Real Time Clock Counter Timer uses this trap type.
+ */
+#define CLOCK_VECTOR ERC32_TRAP_TYPE( ERC32_INTERRUPT_REAL_TIME_CLOCK )
+
+#define Clock_driver_support_install_isr( _new ) \
+ set_vector( _new, CLOCK_VECTOR, 1 )
+
+#define Clock_driver_support_set_interrupt_affinity( _online_processors ) \
do { \
- /* approximately 1 us per countdown */ \
- ERC32_MEC.Real_Time_Clock_Scalar = CLOCK_SPEED - 1; \
- ERC32_MEC.Real_Time_Clock_Counter = \
- rtems_configuration_get_microseconds_per_tick(); \
- \
- ERC32_MEC_Set_Real_Time_Clock_Timer_Control( \
- ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING | \
- ERC32_MEC_TIMER_COUNTER_LOAD_SCALER | \
- ERC32_MEC_TIMER_COUNTER_LOAD_COUNTER \
- ); \
- \
- ERC32_MEC_Set_Real_Time_Clock_Timer_Control( \
- ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING | \
- ERC32_MEC_TIMER_COUNTER_RELOAD_AT_ZERO \
- ); \
- rtems_timecounter_simple_install( \
- &erc32_tc, \
- ERC32_REAL_TIME_CLOCK_FREQUENCY, \
- rtems_configuration_get_microseconds_per_tick(), \
- erc32_tc_get_timecount \
- ); \
- erc32_counter_initialize(); \
+ (void) _online_processors; \
} while (0)
-#define Clock_driver_timecounter_tick() erc32_tc_tick()
+#define Clock_driver_support_at_tick() erc32_clock_at_tick()
+
+#define Clock_driver_support_initialize_hardware() erc32_clock_init()
#include "../../../shared/dev/clock/clockimpl.h"