summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2013-06-13 16:18:25 -0600
committerGregory Nutt <gnutt@nuttx.org>2013-06-13 16:18:25 -0600
commitf89052fa018e2b4e3ae7aeea2f36aa3d08927956 (patch)
tree8803293b855c7a9f6fa848692dc945aff581e21f
parent59868bc1000ec7173ac4b18fa239a5d662ed72c4 (diff)
downloadnuttx-f89052fa018e2b4e3ae7aeea2f36aa3d08927956.tar.gz
nuttx-f89052fa018e2b4e3ae7aeea2f36aa3d08927956.tar.bz2
nuttx-f89052fa018e2b4e3ae7aeea2f36aa3d08927956.zip
SAM3/4: Loop counter for PLL delay must be volatile or it may get optimized away
-rw-r--r--nuttx/arch/arm/src/sam34/sam3u_clockconfig.c3
-rw-r--r--nuttx/configs/sam3u-ek/src/up_touchscreen.c1
-rw-r--r--nuttx/drivers/serial/serialirq.c7
3 files changed, 9 insertions, 2 deletions
diff --git a/nuttx/arch/arm/src/sam34/sam3u_clockconfig.c b/nuttx/arch/arm/src/sam34/sam3u_clockconfig.c
index 71d918b8c..500ed2839 100644
--- a/nuttx/arch/arm/src/sam34/sam3u_clockconfig.c
+++ b/nuttx/arch/arm/src/sam34/sam3u_clockconfig.c
@@ -151,7 +151,8 @@ static inline void sam_supcsetup(void)
static void sam_pmcwait(uint32_t bit)
{
- uint32_t delay;
+ volatile uint32_t delay;
+
for (delay = 0;
(getreg32(SAM_PMC_SR) & bit) == 0 && delay < UINT32_MAX;
delay++);
diff --git a/nuttx/configs/sam3u-ek/src/up_touchscreen.c b/nuttx/configs/sam3u-ek/src/up_touchscreen.c
index f8b465748..ea2ad3d0a 100644
--- a/nuttx/configs/sam3u-ek/src/up_touchscreen.c
+++ b/nuttx/configs/sam3u-ek/src/up_touchscreen.c
@@ -195,6 +195,7 @@ static bool tsc_busy(FAR struct ads7843e_config_s *state)
last = busy;
}
#endif
+
return busy;
}
diff --git a/nuttx/drivers/serial/serialirq.c b/nuttx/drivers/serial/serialirq.c
index fda5b4afb..8e3f80ead 100644
--- a/nuttx/drivers/serial/serialirq.c
+++ b/nuttx/drivers/serial/serialirq.c
@@ -84,7 +84,7 @@ void uart_xmitchars(FAR uart_dev_t *dev)
{
uint16_t nbytes = 0;
- /* Send while we still have data & room in the fifo */
+ /* Send while we still have data in the TX buffer & room in the fifo */
while (dev->xmit.head != dev->xmit.tail && uart_txready(dev))
{
@@ -103,6 +103,11 @@ void uart_xmitchars(FAR uart_dev_t *dev)
/* When all of the characters have been sent from the buffer disable the TX
* interrupt.
+ *
+ * Potential bug? If nbytes == 0 && (dev->xmit.head == dev->xmit.tail) &&
+ * dev->xmitwaiting == true, then disabling the TX interrupt will leave
+ * the uart_write() logic waiting to TX to complete with no TX interrupts.
+ * Can that happen?
*/
if (dev->xmit.head == dev->xmit.tail)