diff -Nur linux-2.6.19-g500-005/arch/arm/mach-s3c2410/pm.h linux-2.6.19-g500-006/arch/arm/mach-s3c2410/pm.h
--- linux-2.6.19-g500-005/arch/arm/mach-s3c2410/pm.h	2006-11-29 22:57:37.000000000 +0100
+++ linux-2.6.19-g500-006/arch/arm/mach-s3c2410/pm.h	2006-12-17 13:34:01.000000000 +0100
@@ -48,6 +48,7 @@
 extern int  s3c2410_cpu_save(unsigned long *saveblk);
 extern void s3c2410_cpu_suspend(void);
 extern void s3c2410_cpu_resume(void);
+extern void s3c24xx_pm_return(void);
 
 extern unsigned long s3c2410_sleep_save_phys;
 
diff -Nur linux-2.6.19-g500-005/arch/arm/mach-s3c2410/s3c2410-pm.c linux-2.6.19-g500-006/arch/arm/mach-s3c2410/s3c2410-pm.c
--- linux-2.6.19-g500-005/arch/arm/mach-s3c2410/s3c2410-pm.c	2006-12-17 13:22:06.000000000 +0100
+++ linux-2.6.19-g500-006/arch/arm/mach-s3c2410/s3c2410-pm.c	2006-12-17 13:34:01.000000000 +0100
@@ -32,6 +32,7 @@
 #include <asm/mach-types.h>
 
 #include <asm/arch/regs-gpio.h>
+#include <asm/arch/g500.h>
 
 #include "cpu.h"
 #include "pm.h"
@@ -43,6 +44,11 @@
 #define DBG(fmt...) printk(KERN_DEBUG fmt)
 #endif
 
+// space for saving memory location where we copy resume code 
+// (a few instructions for now, see sleep.S, should be dynamically
+// computed)
+static unsigned long s3c24xx_resume_addr_save[4];
+
 static void s3c2410_pm_prepare(void)
 {
 	/* ensure at least GSTATUS3 has the resume address */
@@ -55,6 +61,14 @@
 	if ( machine_is_aml_m5900() )
 		s3c2410_gpio_setpin(S3C2410_GPF2, 1);
 
+
+	if ( machine_is_g500() ) {
+		// save previous memory area before to overwrite it with the resume code
+		memcpy(s3c24xx_resume_addr_save, phys_to_virt(G500_SUSPEND_RESUMEAT), 16);
+
+		// now write the resume code
+    memcpy(phys_to_virt(G500_SUSPEND_RESUMEAT), s3c24xx_pm_return, 16);
+	}
 }
 
 int s3c2410_pm_resume(struct sys_device *dev)
diff -Nur linux-2.6.19-g500-005/arch/arm/mach-s3c2410/sleep.S linux-2.6.19-g500-006/arch/arm/mach-s3c2410/sleep.S
--- linux-2.6.19-g500-005/arch/arm/mach-s3c2410/sleep.S	2006-11-29 22:57:37.000000000 +0100
+++ linux-2.6.19-g500-006/arch/arm/mach-s3c2410/sleep.S	2006-12-17 13:34:01.000000000 +0100
@@ -41,6 +41,22 @@
 
 	.text
 
+	.global	s3c24xx_pm_return
+	
+	/* s3c24xx_pm_return
+	 *
+	 * Code called by the bootloader on a suspend/resume cycle.
+	 * It branches execution into the return function. This function
+	 * must be copied on a particular location dependant of the 
+	 * bootloader.
+	 */
+s3c24xx_pm_return:
+	mov	r0, #S3C2410_PA_GPIO
+	ldr	pc, [ r0, #S3C2410_GSTATUS3 - S3C24XX_VA_GPIO ]
+
+
+
+  
 	/* s3c2410_cpu_save
 	 *
 	 * save enough of the CPU state to allow us to re-start
diff -Nur linux-2.6.19-g500-005/include/asm-arm/arch-s3c2410/g500.h linux-2.6.19-g500-006/include/asm-arm/arch-s3c2410/g500.h
--- linux-2.6.19-g500-005/include/asm-arm/arch-s3c2410/g500.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.19-g500-006/include/asm-arm/arch-s3c2410/g500.h	2006-12-17 13:34:01.000000000 +0100
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2006 Pierre Hebert <pierrox@pierrox.net>
+ *  
+ * Eten G500 definitions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#ifndef __ASM_ARCH_G500_H
+#define __ASM_ARCH_G500_H
+
+#define G500_SUSPEND_RESUMEAT (0x30041000)
+
+#endif

