Index: firmware/target/arm/s3c2440/gigabeat-fx/power-meg-fx.c
===================================================================
--- firmware/target/arm/s3c2440/gigabeat-fx/power-meg-fx.c	(revision 13395)
+++ firmware/target/arm/s3c2440/gigabeat-fx/power-meg-fx.c	(working copy)
@@ -60,11 +60,23 @@
     return (GPGDAT & (1 << 11)) != 0;
 }
 
+void cpu_resume(void)
+{
+	/* restart kernel */
+	/* at this point MMU is not initialized, so let CRT0 code do this stuff */
+    unsigned char* loadbuffer = (unsigned char*) (DRAM0+0x100);
+    int(*kernel_entry)(void) = (void*) loadbuffer;
+    kernel_entry(); /* restart kernel */
+}
+
 void power_off(void)
 {
     /* turn off backlight and wait for 1 second */
     __backlight_off();
     __button_backlight_off();
+	GSTATUS2 = GSTATUS2;
+	GSTATUS3 = ((int)&cpu_resume)+DRAM0;
+
     sleep(HZ);
     /* set SLEEP bit to on in CLKCON to turn off */
     CLKCON |=(1<<3);
Index: firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c
===================================================================
--- firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c	(revision 13395)
+++ firmware/target/arm/s3c2440/gigabeat-fx/lcd-meg-fx.c	(working copy)
@@ -44,6 +44,13 @@
 }
 
 
+static void udelay(int us)
+{
+    do{int x;for(x=51*us/2;x;x--);} while (0);/*DELAY_LO;*/
+}
+
+extern bool coldstart;
+
 /* LCD init */
 void lcd_init_device(void)
 {
@@ -70,6 +77,49 @@
 
     LCDCON5 |= 1 << 11;     /* Switch from 555I mode to 565 mode */
 
+    {
+        LCDCON1 = 0x879;
+        LCDCON2 = 0x74FC141;
+        LCDCON3 = 0x38EF09;
+        LCDCON4 = 7;
+        LCDCON5 = 0xB01;
+
+        /* LCD controller reset */
+        GPBCON = (GPBCON & ~((1<<15)|(1<<17))) | (1<<16)|(1<<14); /* GPB7=OUT, GPB8=OUT */
+        GPBDAT |= (1<<7);	/* LCD reset */
+        GPBUP  |= (1<<8) | (1<<7) | 1; /* pullup GPB8, GPB7, GPB0(?) */
+        CLKCON |= (1<<5);  	/* enable LCD clock */
+
+        /* SPI bus transfer */
+        GPBDAT &= ~(1<<8); 	/* LCD CS off */
+        /* alloc SPI bus */
+        CLKCON |= 1<<18;	/* enable SPI clock */
+        SPCON0 = 0x3E;		/* enable iterrupt mode, master,active low,format B    */
+        SPPRE0 = 0x18;		/* Baud rate = PCLK(50MHz) / 2 / (Prescaler value + 1) */
+        /* SPI send */
+        const unsigned char buf[] = {
+            0,0x0F,1,0x01, 0,0x09,1,0x06, 0,0x16,1,0xA6, 0,0x1E,1,0x49,
+            0,0x1F,1,0x26, 0,0x0B,1,0x2F, 0,0x0C,1,0x2B, 0,0x19,1,0x5E,
+            0,0x1A,1,0x15, 0,0x1B,1,0x15, 0,0x1D,1,0x01, 0,0x00,1,0x03,
+            0,0x01,1,0x10, 0,0x02,1,0x0A, 0,0x06,1,0x04, 0,0x08,1,0x2E,
+            0,0x24,1,0x12, 0,0x25,1,0x3F, 0,0x26,1,0x0B, 0,0x27,1,0x00,
+            0,0x28,1,0x00, 0,0x29,1,0xF6, 0,0x2A,1,0x03, 0,0x2B,1,0x0A,
+            0,0x04,1,0x01};
+        udelay(30*1000);
+        int i;
+        for (i=0;i<(int)sizeof(buf);i++)
+        {
+            while ((SPSTA0&1)==0);
+            SPRDAT0 = buf[i];
+            udelay(1000);
+        }
+        /* free SPI buf*/
+        SPPRE0 = 0;
+        SPCON0 = 0;
+        CLKCON &= ~(1<<18);	/* disable SPI clock */
+        GPBDAT |= (1<<8);	/* LCD CS on */
+    }
+
 #if !defined(BOOTLOADER)
     lcd_poweroff = false;
 #endif
Index: firmware/target/arm/crt0.S
===================================================================
--- firmware/target/arm/crt0.S	(revision 13395)
+++ firmware/target/arm/crt0.S	(working copy)
@@ -35,6 +35,10 @@
 
 #ifndef BOOTLOADER
 
+#if CONFIG_CPU == S3C2440
+	bl 	   memory_init
+#endif
+
 #ifndef DEBUG
     /* Copy exception handler code to address 0 */
     ldr    r2, =_vectorsstart
