[PATCH v3] score: Fix simple timecounter support

2016-01-12 Thread Sebastian Huber
Update #2502.
---
 .../arm/shared/armv7m/clock/armv7m-clock-config.c  | 51 --
 c/src/lib/libbsp/m68k/mcf52235/clock/clock.c   | 19 
 c/src/lib/libbsp/m68k/mcf5225x/clock/clock.c   | 19 
 c/src/lib/libbsp/m68k/mcf5329/clock/clock.c| 19 
 c/src/lib/libbsp/m68k/uC5282/clock/clock.c | 29 ++--
 .../libbsp/powerpc/mpc55xxevb/clock/clock-config.c | 34 +--
 c/src/lib/libbsp/shared/clockdrv_shell.h   | 16 ++-
 c/src/lib/libbsp/sparc/erc32/clock/ckinit.c| 10 +++--
 c/src/lib/libbsp/sparc/leon2/clock/ckinit.c| 13 --
 c/src/lib/libbsp/sparc/leon3/clock/ckinit.c| 31 +++--
 c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c  |  9 +++-
 c/src/lib/libcpu/arm/lpc22xx/clock/clockdrv.c  | 32 --
 cpukit/rtems/src/clocktick.c   |  6 ++-
 cpukit/sapi/include/rtems/timecounter.h| 35 ---
 cpukit/score/include/rtems/score/timecounter.h | 27 +++-
 cpukit/score/src/kern_tc.c | 16 +++
 doc/bsp_howto/clock.t  | 13 +-
 17 files changed, 256 insertions(+), 123 deletions(-)

diff --git a/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c 
b/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c
index e78684c..d481c44 100644
--- a/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c
+++ b/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c
@@ -23,7 +23,12 @@
 /* This is defined in clockdrv_shell.h */
 static void Clock_isr(void *arg);
 
-static rtems_timecounter_simple _ARMV7M_TC;
+typedef struct {
+  rtems_timecounter_simple base;
+  bool countflag;
+} ARMV7M_Timecounter;
+
+static ARMV7M_Timecounter _ARMV7M_TC;
 
 static uint32_t _ARMV7M_TC_get(rtems_timecounter_simple *tc)
 {
@@ -32,11 +37,25 @@ static uint32_t _ARMV7M_TC_get(rtems_timecounter_simple *tc)
   return systick->cvr;
 }
 
-static bool _ARMV7M_TC_is_pending(rtems_timecounter_simple *tc)
+static bool _ARMV7M_TC_is_pending(rtems_timecounter_simple *base)
 {
-  volatile ARMV7M_SCB *scb = _ARMV7M_SCB;
+  ARMV7M_Timecounter *tc = (ARMV7M_Timecounter *) base;
+  rtems_interrupt_level level;
+  bool countflag;
+
+  rtems_interrupt_disable(level);
+
+  countflag = tc->countflag;
+  if (!countflag) {
+volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
+
+countflag = ((systick->csr & ARMV7M_SYSTICK_CSR_COUNTFLAG) != 0);
+tc->countflag = countflag;
+  }
+
+  rtems_interrupt_enable(level);
 
-  return ((scb->icsr & ARMV7M_SCB_ICSR_PENDSTSET) != 0);
+  return countflag;
 }
 
 static uint32_t _ARMV7M_TC_get_timecount(struct timecounter *tc)
@@ -48,19 +67,26 @@ static uint32_t _ARMV7M_TC_get_timecount(struct timecounter 
*tc)
   );
 }
 
-static void _ARMV7M_TC_tick(void)
-{
-  rtems_timecounter_simple_downcounter_tick(&_ARMV7M_TC, _ARMV7M_TC_get);
-}
-
-static void _ARMV7M_Systick_at_tick(void)
+static void _ARMV7M_TC_at_tick(rtems_timecounter_simple *base)
 {
+  ARMV7M_Timecounter *tc = (ARMV7M_Timecounter *) base;
   volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
 
+  tc->countflag = false;
+
   /* Clear COUNTFLAG */
   systick->csr;
 }
 
+static void _ARMV7M_TC_tick(void)
+{
+  rtems_timecounter_simple_downcounter_tick(
+&_ARMV7M_TC.base,
+_ARMV7M_TC_get,
+_ARMV7M_TC_at_tick
+  );
+}
+
 static void _ARMV7M_Systick_handler(void)
 {
   _ARMV7M_Interrupt_service_enter();
@@ -95,7 +121,7 @@ static void _ARMV7M_Systick_initialize(void)
 | ARMV7M_SYSTICK_CSR_CLKSOURCE;
 
   rtems_timecounter_simple_install(
-&_ARMV7M_TC,
+&_ARMV7M_TC.base,
 freq,
 interval,
 _ARMV7M_TC_get_timecount
@@ -111,9 +137,6 @@ static void _ARMV7M_Systick_cleanup(void)
 
 #define Clock_driver_timecounter_tick() _ARMV7M_TC_tick()
 
-#define Clock_driver_support_at_tick() \
-  _ARMV7M_Systick_at_tick()
-
 #define Clock_driver_support_initialize_hardware() \
   _ARMV7M_Systick_initialize()
 
diff --git a/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c 
b/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c
index fdc1ed6..4b5f4af 100644
--- a/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c
+++ b/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c
@@ -32,18 +32,19 @@ static uint32_t mcf52235_tc_get_timecount(struct 
timecounter *tc)
   );
 }
 
-static void mcf52235_tc_tick(void)
+static void mcf52235_tc_at_tick(rtems_timecounter_simple *tc)
 {
-  rtems_timecounter_simple_downcounter_tick(&mcf52235_tc, mcf52235_tc_get);
+  MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF;
 }
 
-/*
- * Periodic interval timer interrupt handler
- */
-#define Clock_driver_support_at_tick() \
-do {   \
-MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF; \
-} while (0)\
+static void mcf52235_tc_tick(void)
+{
+  rtems_timecounter_simple_downcounter_tick(
+&mcf52235_tc,
+mcf52235_tc_get,
+mcf52235_tc_at_tick
+  );
+}
 
 /

[PATCH] [RTEMS] Add Cortex-M7 multilib for FPU support

2016-01-12 Thread Sebastian Huber
gcc/ChangeLog
2016-01-12  Sebastian Huber  

* config/arm/t-rtems: Add cortex-m7/fpv5-d16 multilib.
---
 gcc/config/arm/t-rtems | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/gcc/config/arm/t-rtems b/gcc/config/arm/t-rtems
index 3b62181..02dcd65 100644
--- a/gcc/config/arm/t-rtems
+++ b/gcc/config/arm/t-rtems
@@ -1,7 +1,7 @@
 # Custom RTEMS multilibs for ARM
 
-MULTILIB_OPTIONS  = mbig-endian mthumb 
march=armv6-m/march=armv7-a/march=armv7-r/march=armv7-m 
mfpu=neon/mfpu=vfpv3-d16/mfpu=fpv4-sp-d16 mfloat-abi=hard
-MULTILIB_DIRNAMES = eb thumb armv6-m armv7-a armv7-r armv7-m neon vfpv3-d16 
fpv4-sp-d16 hard
+MULTILIB_OPTIONS  = mbig-endian mthumb 
march=armv6-m/march=armv7-a/march=armv7-r/march=armv7-m/mcpu=cortex-m7 
mfpu=neon/mfpu=vfpv3-d16/mfpu=fpv4-sp-d16/mfpu=fpv5-d16 mfloat-abi=hard
+MULTILIB_DIRNAMES = eb thumb armv6-m armv7-a armv7-r armv7-m cortex-m7 neon 
vfpv3-d16 fpv4-sp-d16 fpv5-d16 hard
 
 # Enumeration of multilibs
 
@@ -16,5 +16,6 @@ MULTILIB_REQUIRED += mthumb/march=armv7-a
 MULTILIB_REQUIRED += mthumb/march=armv7-r/mfpu=vfpv3-d16/mfloat-abi=hard
 MULTILIB_REQUIRED += mthumb/march=armv7-r
 MULTILIB_REQUIRED += mthumb/march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard
+MULTILIB_REQUIRED += mthumb/mcpu=cortex-m7/mfpu=fpv5-d16/mfloat-abi=hard
 MULTILIB_REQUIRED += mthumb/march=armv7-m
 MULTILIB_REQUIRED += mthumb
-- 
1.8.4.5

___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel