summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-08-09 18:34:52 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-08-09 18:34:52 -0600
commitab1019b7df4fc7929bfa1cd58a35a5d9c56708a6 (patch)
tree868e86fc66d653238a2a8f88d65f8e4038976239
parent6d39b27f610f7e63ba0017ad8c56d5f685e3e327 (diff)
downloadnuttx-ab1019b7df4fc7929bfa1cd58a35a5d9c56708a6.tar.gz
nuttx-ab1019b7df4fc7929bfa1cd58a35a5d9c56708a6.tar.bz2
nuttx-ab1019b7df4fc7929bfa1cd58a35a5d9c56708a6.zip
SAMA5 Timer/counter repair: Missing sem_post() caused a hang
-rw-r--r--nuttx/arch/arm/src/sama5/sam_freerun.c11
-rw-r--r--nuttx/arch/arm/src/sama5/sam_oneshot.c8
-rw-r--r--nuttx/arch/arm/src/sama5/sam_tc.c5
-rw-r--r--nuttx/arch/arm/src/sama5/sam_tickless.c12
4 files changed, 25 insertions, 11 deletions
diff --git a/nuttx/arch/arm/src/sama5/sam_freerun.c b/nuttx/arch/arm/src/sama5/sam_freerun.c
index 514e22778..f7fd95650 100644
--- a/nuttx/arch/arm/src/sama5/sam_freerun.c
+++ b/nuttx/arch/arm/src/sama5/sam_freerun.c
@@ -67,11 +67,15 @@
****************************************************************************/
#ifdef CONFIG_SAMA5_TC_DEBUG
-# define tcdbg dbg
-# define tcvdbg vdbg
+# define tcdbg dbg
+# define tcvdbg vdbg
+# define tclldbg lldbg
+# define tcllvdbg llvdbg
#else
# define tcdbg(x...)
# define tcvdbg(x...)
+# define tclldbg(x...)
+# define tcllvdbg(x...)
#endif
/****************************************************************************
@@ -316,8 +320,6 @@ int sam_freerun_counter(struct sam_freerun_s *freerun, struct timespec *ts)
int sam_freerun_uninitialize(struct sam_freerun_s *freerun)
{
- irqstate_t flags;
-
/* Now we can disable the timer interrupt and disable the timer. */
sam_tc_attach(freerun->handle, NULL, NULL, 0);
@@ -326,7 +328,6 @@ int sam_freerun_uninitialize(struct sam_freerun_s *freerun)
/* Free the timer */
sam_tc_free(freerun->handle);
- irqrestore(flags);
return OK;
}
diff --git a/nuttx/arch/arm/src/sama5/sam_oneshot.c b/nuttx/arch/arm/src/sama5/sam_oneshot.c
index 997e04f04..552cee10d 100644
--- a/nuttx/arch/arm/src/sama5/sam_oneshot.c
+++ b/nuttx/arch/arm/src/sama5/sam_oneshot.c
@@ -67,11 +67,15 @@
****************************************************************************/
#ifdef CONFIG_SAMA5_TC_DEBUG
-# define tcdbg dbg
-# define tcvdbg vdbg
+# define tcdbg dbg
+# define tcvdbg vdbg
+# define tclldbg lldbg
+# define tcllvdbg llvdbg
#else
# define tcdbg(x...)
# define tcvdbg(x...)
+# define tclldbg(x...)
+# define tcllvdbg(x...)
#endif
/****************************************************************************
diff --git a/nuttx/arch/arm/src/sama5/sam_tc.c b/nuttx/arch/arm/src/sama5/sam_tc.c
index d0495382c..942f1912b 100644
--- a/nuttx/arch/arm/src/sama5/sam_tc.c
+++ b/nuttx/arch/arm/src/sama5/sam_tc.c
@@ -90,9 +90,13 @@
#ifdef CONFIG_SAMA5_TC_DEBUG
# define tcdbg dbg
# define tcvdbg vdbg
+# define tclldbg llbg
+# define tcllvdbg llvdbg
#else
# define tcdbg(x...)
# define tcvdbg(x...)
+# define tclldbg(x...)
+# define tcllvdbg(x...)
#endif
/****************************************************************************
@@ -1138,6 +1142,7 @@ TC_HANDLE sam_tc_allocate(int channel, int mode)
sam_chan_putreg(chan, SAM_TC_CMR_OFFSET, mode);
sam_regdump(chan, "Allocated");
+ sam_givesem(chan->tc);
}
/* Return an opaque reference to the channel */
diff --git a/nuttx/arch/arm/src/sama5/sam_tickless.c b/nuttx/arch/arm/src/sama5/sam_tickless.c
index ce728a454..36b1759f8 100644
--- a/nuttx/arch/arm/src/sama5/sam_tickless.c
+++ b/nuttx/arch/arm/src/sama5/sam_tickless.c
@@ -149,11 +149,15 @@
#endif
#ifdef CONFIG_SAMA5_TC_DEBUG
-# define tcdbg dbg
-# define tcvdbg vdbg
+# define tcdbg dbg
+# define tcvdbg vdbg
+# define tclldbg lldbg
+# define tcllvdbg llvdbg
#else
# define tcdbg(x...)
# define tcvdbg(x...)
+# define tclldbg(x...)
+# define tcllvdbg(x...)
#endif
/****************************************************************************
@@ -243,7 +247,7 @@ void up_timer_initialize(void)
CONFIG_USEC_PER_TICK);
if (ret < 0)
{
- tcdbg("ERROR: sam_oneshot_initialize failed\n");
+ tclldbg("ERROR: sam_oneshot_initialize failed\n");
PANIC();
}
@@ -254,7 +258,7 @@ void up_timer_initialize(void)
CONFIG_USEC_PER_TICK);
if (ret < 0)
{
- tcdbg("ERROR: sam_freerun_initialize failed\n");
+ tclldbg("ERROR: sam_freerun_initialize failed\n");
PANIC();
}
}