diff --git a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
index 838efa4..64a0140 100644
--- a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
+++ b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
@@ -57,6 +57,7 @@ static bool lcd_on = true;
 extern unsigned fg_pattern;
 extern unsigned bg_pattern;
 
+static struct mutex lcd_mtx;
 #if defined(HAVE_LCD_SLEEP)
 bool lcd_active(void)
 {
@@ -287,6 +288,7 @@ void lcd_init_device(void)
     IO_OSD_OSDWINMD0    |= 0x01;
     
     lcd_enable_composite(false);
+    mutex_init(&lcd_mtx);
 }
 
 #if defined(HAVE_LCD_MODES)
@@ -379,7 +381,7 @@ static void dma_start_transfer16(   char *src, int src_x, int src_y, int stride,
         COP_DMA_CTRL    |= 0x0003;
         
         /* Wait for read to finish */
-        while(COP_DMA_CTRL & 0x02) {};
+        while(COP_DMA_CTRL & 0x02) {yield();};
         
         addr            = (int)dst;
         addr            >>= 1;
@@ -392,7 +394,7 @@ static void dma_start_transfer16(   char *src, int src_x, int src_y, int stride,
         COP_DMA_CTRL    = 0x0002;
         
         /* Wait for the transfer to complete */
-        while(COP_DMA_CTRL & 0x02) {};
+        while(COP_DMA_CTRL & 0x02) {yield();};
 
         /* Decrease height, update pointers/counters */
         src     += (stride*pix_width);
@@ -454,7 +456,7 @@ static void dma_start_transfer16(   char *src, int src_x, int src_y, int stride,
         COP_DMA_CTRL    |= 0x0003;
         
         /* Wait for read to finish */
-        while(COP_DMA_CTRL & 0x02) {};
+        while(COP_DMA_CTRL & 0x02) {yield();};
         
         addr            = (int)dst;
         addr            >>= 1;
@@ -467,7 +469,7 @@ static void dma_start_transfer16(   char *src, int src_x, int src_y, int stride,
         COP_DMA_CTRL    = 0x0002;
         
         /* Wait for the transfer to complete */
-        while(COP_DMA_CTRL & 0x02) {};
+        while(COP_DMA_CTRL & 0x02) {yield();};
         
         /* update the width, update pointers/counters */
         src     += (stride*pix_width);
@@ -489,6 +491,7 @@ void lcd_update_rect(int x, int y, int width, int height)
     if ( (width | height) < 0)
         return; /* nothing left to do */
 
+    mutex_lock(&lcd_mtx);
     if (x + width > LCD_WIDTH)
         width = LCD_WIDTH - x; /* Clip right */
     if (x < 0)
@@ -566,6 +569,7 @@ void lcd_update_rect(int x, int y, int width, int height)
 #endif
 
 #endif
+    mutex_unlock(&lcd_mtx);
 }
 
 /* Update the display.
