diff -urpN -X ../dontdiff linux-2.6.20-rc5-gpiofix1/arch/arm/mach-s3c2410/gpio.c linux-2.6.20-rc5-gpiofix2/arch/arm/mach-s3c2410/gpio.c
--- linux-2.6.20-rc5-gpiofix1/arch/arm/mach-s3c2410/gpio.c	2007-01-16 11:08:15.000000000 +0000
+++ linux-2.6.20-rc5-gpiofix2/arch/arm/mach-s3c2410/gpio.c	2007-01-16 11:40:32.000000000 +0000
@@ -84,15 +84,18 @@ EXPORT_SYMBOL(s3c2410_gpio_cfgpin);
 unsigned int s3c2410_gpio_getcfg(unsigned int pin)
 {
 	void __iomem *base = S3C24XX_GPIO_BASE(pin);
-	unsigned long mask;
+	unsigned long val = __raw_readl(base);
 
 	if (pin < S3C2410_GPIO_BANKB) {
-		mask = 1 << S3C2410_GPIO_OFFSET(pin);
+		val >>= S3C2410_GPIO_OFFSET(pin);
+		val &= 1;
+		val += 1;
 	} else {
-		mask = 3 << S3C2410_GPIO_OFFSET(pin)*2;
+		val >>= S3C2410_GPIO_OFFSET(pin)*2;
+		val &= 3;
 	}
 
-	return __raw_readl(base) & mask;
+	return val | S3C2410_GPIO_INPUT;
 }
 
 EXPORT_SYMBOL(s3c2410_gpio_getcfg);
diff -urpN -X ../dontdiff linux-2.6.20-rc5-gpiofix1/arch/arm/mach-s3c2410/pm.c linux-2.6.20-rc5-gpiofix2/arch/arm/mach-s3c2410/pm.c
--- linux-2.6.20-rc5-gpiofix1/arch/arm/mach-s3c2410/pm.c	2007-01-16 09:42:26.000000000 +0000
+++ linux-2.6.20-rc5-gpiofix2/arch/arm/mach-s3c2410/pm.c	2007-01-16 11:54:19.000000000 +0000
@@ -451,15 +451,14 @@ static void s3c2410_pm_check_resume_pin(
 		irqstate = s3c_irqwake_eintmask & (1L<<irqoffs);
 
 	pinstate = s3c2410_gpio_getcfg(pin);
-	pinstate >>= S3C2410_GPIO_OFFSET(pin)*2;
 
 	if (!irqstate) {
-		if (pinstate == 0x02)
+		if (pinstate == S3C2410_GPIO_IRQ)
 			DBG("Leaving IRQ %d (pin %d) enabled\n", irq, pin);
 	} else {
-		if (pinstate == 0x02) {
+		if (pinstate == S3C2410_GPIO_IRQ) {
 			DBG("Disabling IRQ %d (pin %d)\n", irq, pin);
-			s3c2410_gpio_cfgpin(pin, 0x00);
+			s3c2410_gpio_cfgpin(pin, S3C2410_GPIO_INPUT);
 		}
 	}
 }

