diff -Nurp linux/kernel26/arch/arm/configs/g500_defconfig linux.mine/kernel26/arch/arm/configs/g500_defconfig
--- linux/kernel26/arch/arm/configs/g500_defconfig	2006-12-17 04:43:34.000000000 +0100
+++ linux.mine/kernel26/arch/arm/configs/g500_defconfig	2006-12-17 17:15:58.000000000 +0100
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.19
-# Tue Dec  5 19:56:17 2006
+# Linux kernel version: 2.6.19-hh6
+# Sun Dec 17 17:08:00 2006
 #
 CONFIG_ARM=y
 # CONFIG_GENERIC_TIME is not set
@@ -38,6 +38,7 @@ CONFIG_POSIX_MQUEUE=y
 # CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
 # CONFIG_IKCONFIG is not set
+# CONFIG_MINIMAL_OOPS is not set
 # CONFIG_RELAY is not set
 CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -55,6 +56,8 @@ CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
 CONFIG_SHMEM=y
+CONFIG_USELIB=y
+CONFIG_CORE_DUMP=y
 CONFIG_SLAB=y
 CONFIG_VM_EVENT_COUNTERS=y
 CONFIG_RT_MUTEXES=y
@@ -122,6 +125,9 @@ CONFIG_ARCH_S3C2410=y
 # CONFIG_ARCH_SHARK is not set
 # CONFIG_ARCH_LH7A40X is not set
 # CONFIG_ARCH_OMAP is not set
+# CONFIG_SA1100_H3100 is not set
+# CONFIG_SA1100_H3600 is not set
+# CONFIG_SA1100_H3800 is not set
 
 #
 # S3C24XX Implementations
@@ -137,6 +143,7 @@ CONFIG_ARCH_S3C2410=y
 # CONFIG_MACH_SMDK2413 is not set
 # CONFIG_MACH_VR1000 is not set
 # CONFIG_MACH_RX3715 is not set
+# CONFIG_MACH_HTCHERMES is not set
 # CONFIG_MACH_OTOM is not set
 # CONFIG_MACH_NEXCODER_2440 is not set
 # CONFIG_MACH_VSTMS is not set
@@ -161,6 +168,11 @@ CONFIG_S3C2410_DMA=y
 CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
 
 #
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
 # Processor Type
 #
 CONFIG_CPU_32=y
@@ -181,6 +193,19 @@ CONFIG_ARM_THUMB=y
 # CONFIG_CPU_ICACHE_DISABLE is not set
 # CONFIG_CPU_DCACHE_DISABLE is not set
 # CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_KEXEC is not set
+
+#
+# Compaq/iPAQ Platforms
+#
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
 
 #
 # Bus support
@@ -535,6 +560,7 @@ CONFIG_NET_RADIO=y
 # CONFIG_STRIP is not set
 # CONFIG_USB_ZD1201 is not set
 # CONFIG_HOSTAP is not set
+# CONFIG_ACX is not set
 
 #
 # Wan interfaces
@@ -582,6 +608,7 @@ CONFIG_INPUT_KEYBOARD=y
 # CONFIG_KEYBOARD_XTKBD is not set
 # CONFIG_KEYBOARD_NEWTON is not set
 # CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_GPIO_KEYS is not set
 CONFIG_S3C2410_BUTTONS=y
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_JOYSTICK is not set
@@ -591,6 +618,9 @@ CONFIG_INPUT_TOUCHSCREEN=y
 # CONFIG_TOUCHSCREEN_ELO is not set
 # CONFIG_TOUCHSCREEN_MTOUCH is not set
 # CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_WM9705 is not set
+# CONFIG_TOUCHSCREEN_WM9712 is not set
+# CONFIG_TOUCHSCREEN_WM9713 is not set
 # CONFIG_TOUCHSCREEN_PENMOUNT is not set
 # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
 # CONFIG_TOUCHSCREEN_TOUCHWIN is not set
@@ -671,6 +701,7 @@ CONFIG_I2C_ALGOPCA=y
 #
 # I2C Hardware Bus support
 #
+# CONFIG_I2C_ELV is not set
 # CONFIG_I2C_OCORES is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
 CONFIG_I2C_S3C2410=m
@@ -685,7 +716,9 @@ CONFIG_I2C_S3C2410=m
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
 # CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 is not set
 # CONFIG_SENSORS_MAX6875 is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
@@ -721,8 +754,36 @@ CONFIG_SPI_S3C24XX=m
 # CONFIG_HWMON_VID is not set
 
 #
+# Hardware Monitoring - Battery
+#
+# CONFIG_BATTERY_MONITOR is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# SoC drivers
+#
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
 # Misc devices
 #
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_MCP is not set
+# CONFIG_ADC_ADS7846_SSP is not set
 # CONFIG_TIFM_CORE is not set
 
 #
@@ -734,7 +795,7 @@ CONFIG_LEDS_CLASS=y
 #
 # LED drivers
 #
-CONFIG_LEDS_S3C24XX=m
+CONFIG_LEDS_S3C24XX=y
 
 #
 # LED Triggers
@@ -765,10 +826,12 @@ CONFIG_FB_CFB_IMAGEBLIT=y
 # CONFIG_FB_BACKLIGHT is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_IMAGEON is not set
 # CONFIG_FB_S1D13XXX is not set
 CONFIG_FB_S3C2410=y
 # CONFIG_FB_S3C2410_DEBUG is not set
 # CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
 
 #
 # Console display driver support
@@ -801,6 +864,7 @@ CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_DEVICE=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_DEVICE=y
+# CONFIG_BACKLIGHT_CORGI is not set
 CONFIG_BACKLIGHT_S3C2410=y
 
 #
@@ -940,7 +1004,9 @@ CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_SELECTED=y
 # CONFIG_USB_GADGET_NET2280 is not set
 # CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_PXA27X is not set
 # CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
 # CONFIG_USB_GADGET_LH7A40X is not set
 CONFIG_USB_GADGET_S3C2410=y
 CONFIG_USB_S3C2410=y
@@ -956,6 +1022,7 @@ CONFIG_USB_ETH=y
 # CONFIG_USB_FILE_STORAGE is not set
 # CONFIG_USB_G_SERIAL is not set
 # CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
 
 #
 # MMC/SD Card support
@@ -965,6 +1032,8 @@ CONFIG_MMC=y
 CONFIG_MMC_BLOCK=y
 CONFIG_MMC_S3C2440=y
 # CONFIG_MMC_TIFM_SD is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
 
 #
 # Real Time Clock
diff -Nurp linux/kernel26/arch/arm/mach-s3c2410/mach-g500.c linux.mine/kernel26/arch/arm/mach-s3c2410/mach-g500.c
--- linux/kernel26/arch/arm/mach-s3c2410/mach-g500.c	2006-12-17 04:43:34.000000000 +0100
+++ linux.mine/kernel26/arch/arm/mach-s3c2410/mach-g500.c	2006-12-17 17:12:01.000000000 +0100
@@ -8,9 +8,8 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
- * Modifications:
- *	02-Nov-2006 PHE   Copied and adapted from mach-rx3715.c, mach-h1940.c,
- *			  and mach-smdk2440.c
+ * Origin:
+ * Copied and adapted from mach-rx3715.c, mach-h1940.c and mach-smdk2440.c.
 */
 
 #include <linux/kernel.h>
@@ -35,29 +34,31 @@
 #include <asm/arch/regs-timer.h>
 #include <asm/arch/regs-gpio.h>
 #include <asm/arch/regs-lcd.h>
+#include <asm/arch/regs-irq.h>
 
 #include <asm/arch/idle.h>
 #include <asm/arch/nand.h>
 #include <asm/arch/fb.h>
+#include <asm/arch/mmc.h>
 #include <asm/arch/ts.h>
-#include <asm/arch/lcd.h>
 #include <asm/arch/buttons.h>
-#include <asm/arch/spi.h>
-#include <asm/arch/mmc.h>
+#include <asm/arch/lcd.h>
+#include <asm/arch/leds-gpio.h>
 
-#include <linux/mmc/mmc.h>
-#include <linux/mmc/protocol.h>
-#include <linux/spi/spi.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
+#include <linux/mmc/mmc.h>
+#include <linux/mmc/protocol.h>
 
 #include "s3c2410.h"
 #include "s3c2440.h"
 #include "clock.h"
 #include "devs.h"
 #include "cpu.h"
+#include "irq.h"
 #include "pm.h"
 
+
 static struct map_desc g500_iodesc[] __initdata = {
 	/* nothing */
 };
@@ -90,81 +91,6 @@ static struct s3c2410_uartcfg g500_uartc
 	}
 };
 
-static void g500_backlight_power(int on)
-{
-	s3c2410_gpio_setpin(S3C2410_GPB0, 0);
-	s3c2410_gpio_pullup(S3C2410_GPB0, 0);
-
-	s3c2410_gpio_cfgpin(S3C2410_GPB0,
-			(on) ? S3C2410_GPB0_TOUT0 : S3C2410_GPB0_OUTP);
-}
-
-static void g500_lcd_power(int on)
-{
-	s3c2410_gpio_setpin(S3C2410_GPC0, on);
-}
-
-static void g500_set_brightness(int tcmpb0)
-{
-	unsigned long tcfg0;
-	unsigned long tcfg1;
-	unsigned long tcon;
-
-	/* configure power on/off */
-	g500_backlight_power(tcmpb0 ? 1 : 0);
-
-
-	tcfg0=readl(S3C2410_TCFG0);
-	tcfg1=readl(S3C2410_TCFG1);
-
-	tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
-	tcfg0 |= 0x18;
-
-	tcfg1 &= ~S3C2410_TCFG1_MUX0_MASK;
-	tcfg1 |= S3C2410_TCFG1_MUX0_DIV2;
-
-	writel(tcfg0, S3C2410_TCFG0);
-	writel(tcfg1, S3C2410_TCFG1);
-	writel(0x31, S3C2410_TCNTB(0));
-
-	tcon = readl(S3C2410_TCON);
-	tcon &= ~0x0F;
-	tcon |= S3C2410_TCON_T0RELOAD;
-	tcon |= S3C2410_TCON_T0MANUALUPD;
-
-	writel(tcon, S3C2410_TCON);
-	writel(0x31, S3C2410_TCNTB(0));
-	writel(tcmpb0, S3C2410_TCMPB(0));
-
-	/* start the timer running */
-	tcon |= S3C2410_TCON_T0START;
-	tcon &= ~S3C2410_TCON_T0MANUALUPD;
-	writel(tcon, S3C2410_TCON);
-}
-
-static struct s3c2410_bl_mach_info g500_bl_cfg __initdata = {
-
-	.backlight_max          = 0x2c,
-	.backlight_default      = 0x16,
-	.backlight_power	= g500_backlight_power,
-	.set_brightness		= g500_set_brightness,
-	.backlight_power	= g500_backlight_power,
-	.lcd_power		= g500_lcd_power
-};
-
-static struct s3c2410_button g500_buttons[] = {
-	{  IRQ_EINT1,   S3C2410_GPF1,   S3C2410_GPF1_EINT1,     KEY_POWER,	     "Power", 0 },
-	{  IRQ_EINT10,  S3C2410_GPG2,   S3C2410_GPG2_EINT10,    KEY_CAMERA, 	     "Camera", 0 },
-	{  IRQ_EINT11,  S3C2410_GPG3,   S3C2410_GPG3_EINT11,    KEY_LEFT, 	     "Left", 0 },
-	{  IRQ_EINT13,  S3C2410_GPG5,   S3C2410_GPG5_EINT13,    KEY_RIGHT, 	     "Right", 0 },
-	{  IRQ_EINT14,  S3C2410_GPG6,   S3C2410_GPG6_EINT14,    KEY_REPLY, 	     "Pick-Up", 0 },
-};
-
-static struct s3c2410_butt_mach_info g500_bt_cfg __initdata = {
-	.buttons  = g500_buttons,
-	.size = ARRAY_SIZE(g500_buttons),
-};
-
 /* LCD driver info */
 
 static struct s3c2410fb_mach_info g500_lcd_cfg __initdata = {
@@ -231,15 +157,6 @@ static struct s3c2410fb_mach_info g500_l
 	},
 };
 
-static struct s3c2410_ts_mach_info g500_ts_cfg __initdata = {
-#ifdef TOUCHSCREEN_S3C2410_ALT
-		.xp_threshold = 940,
-#endif
-		.delay = 50000,
-		.presc = 49,
-		.oversampling_shift = 2,
-};
-
 static struct mtd_partition g500_nand_part[] = {
 	[0] = {
 		.name		= "Whole Flash",
@@ -266,44 +183,6 @@ static struct s3c2410_platform_nand g500
 	.sets		= g500_nand_sets,
 };
 
-static struct spi_board_info g500_spi_board_info_0[] = {
-	[0]={
-		.modalias       = "CHIP0",
-		.platform_data  = NULL,
-		.mode           = SPI_MODE_0,
-		//.irq            = GPIO_IRQ(31),
-		.max_speed_hz   = 120000 /* max sample rate at 3V */ * 16,
-		.bus_num        = 0,
-		.chip_select    = 0,
-	},
-};
-
-/*static struct spi_board_info g500_spi_board_info_1[] = {
-	[0]={
-		.modalias       = "CHIP1",
-		.platform_data  = NULL,
-		.mode           = SPI_MODE_0,
-		//.irq            = GPIO_IRQ(31),
-		.max_speed_hz   = 120000 * 16,
-		.bus_num        = 1,
-		.chip_select    = 0,
-	},
-};*/
-
-static struct s3c2410_spi_info g500_spi_info_0 = {
-	.pin_cs = S3C2410_GPD15,
-	.board_size=ARRAY_SIZE(g500_spi_board_info_0),
-	.board_info=g500_spi_board_info_0,
-	.set_cs=NULL, 
-};
-
-/*static struct s3c2410_spi_info g500_spi_info_1 = {
-	.pin_cs = S3C2410_GPD14,
-	.board_size=ARRAY_SIZE(g500_spi_board_info_1),
-	.board_info=g500_spi_board_info_1,
-	.set_cs=NULL, 
-};*/
-
 static void s3c2410_mmc_def_setpower(unsigned int to)
 {
 	s3c2410_gpio_cfgpin(S3C2410_GPA17, S3C2410_GPIO_OUTPUT);
@@ -316,6 +195,105 @@ static struct s3c24xx_mmc_platdata g500_
 	.ocr_avail  = MMC_VDD_32_33,
 };
 
+static struct s3c2410_ts_mach_info g500_ts_cfg __initdata = {
+#ifdef TOUCHSCREEN_S3C2410_ALT
+		.xp_threshold = 940,
+#endif
+		.delay = 50000,
+		.presc = 49,
+		.oversampling_shift = 2,
+};
+
+static struct s3c2410_button g500_buttons[] = {
+	{  IRQ_EINT1,   S3C2410_GPF1,   S3C2410_GPF1_EINT1,     KEY_POWER,	     "Power", 0 },
+	{  IRQ_EINT10,  S3C2410_GPG2,   S3C2410_GPG2_EINT10,    KEY_CAMERA, 	   "Camera", 0 },
+	{  IRQ_EINT11,  S3C2410_GPG3,   S3C2410_GPG3_EINT11,    KEY_LEFT, 	     "Left", 0 },
+	{  IRQ_EINT13,  S3C2410_GPG5,   S3C2410_GPG5_EINT13,    KEY_RIGHT, 	     "Right", 0 },
+	{  IRQ_EINT14,  S3C2410_GPG6,   S3C2410_GPG6_EINT14,    KEY_REPLY, 	     "Pick-Up", 0 },
+};
+
+static struct s3c2410_butt_mach_info g500_bt_cfg __initdata = {
+	.buttons  = g500_buttons,
+	.size = ARRAY_SIZE(g500_buttons),
+};
+
+static void g500_backlight_power(int on)
+{
+	s3c2410_gpio_setpin(S3C2410_GPB0, 0);
+	s3c2410_gpio_pullup(S3C2410_GPB0, 0);
+
+	s3c2410_gpio_cfgpin(S3C2410_GPB0,
+			(on) ? S3C2410_GPB0_TOUT0 : S3C2410_GPB0_OUTP);
+}
+
+static void g500_lcd_power(int on)
+{
+	s3c2410_gpio_setpin(S3C2410_GPC0, on);
+}
+
+static void g500_set_brightness(int tcmpb0)
+{
+	unsigned long tcfg0;
+	unsigned long tcfg1;
+	unsigned long tcon;
+
+	/* configure power on/off */
+	g500_backlight_power(tcmpb0 ? 1 : 0);
+
+
+	tcfg0=readl(S3C2410_TCFG0);
+	tcfg1=readl(S3C2410_TCFG1);
+
+	tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
+	tcfg0 |= 0x18;
+
+	tcfg1 &= ~S3C2410_TCFG1_MUX0_MASK;
+	tcfg1 |= S3C2410_TCFG1_MUX0_DIV2;
+
+	writel(tcfg0, S3C2410_TCFG0);
+	writel(tcfg1, S3C2410_TCFG1);
+	writel(0x31, S3C2410_TCNTB(0));
+
+	tcon = readl(S3C2410_TCON);
+	tcon &= ~0x0F;
+	tcon |= S3C2410_TCON_T0RELOAD;
+	tcon |= S3C2410_TCON_T0MANUALUPD;
+
+	writel(tcon, S3C2410_TCON);
+	writel(0x31, S3C2410_TCNTB(0));
+	writel(tcmpb0, S3C2410_TCMPB(0));
+
+	/* start the timer running */
+	tcon |= S3C2410_TCON_T0START;
+	tcon &= ~S3C2410_TCON_T0MANUALUPD;
+	writel(tcon, S3C2410_TCON);
+}
+
+static struct s3c2410_bl_mach_info g500_bl_cfg __initdata = {
+
+	.backlight_max          = 0x2c,
+	.backlight_default      = 0x16,
+	.backlight_power	= g500_backlight_power,
+	.set_brightness		= g500_set_brightness,
+	.backlight_power	= g500_backlight_power,
+	.lcd_power		= g500_lcd_power
+};
+
+static struct s3c24xx_led_platdata g500_vibrator_pdata = {
+	.gpio		= S3C2410_GPA6,
+	.flags		= S3C24XX_LEDF_ACTLOW,
+	.name		= "vibrator",
+	.def_trigger	= "none",
+};
+
+static struct platform_device g500_vibrator = {
+	.name		= "s3c24xx_led",
+	.id		= 1,
+	.dev		= {
+		.platform_data = &g500_vibrator_pdata,
+	},
+};
+
 static struct platform_device *g500_devices[] __initdata = {
 	&s3c_device_usb,
 	&s3c_device_lcd,
@@ -324,12 +302,11 @@ static struct platform_device *g500_devi
 	&s3c_device_iis,
 	&s3c_device_nand,
 	&s3c_device_usbgadget,
-	&s3c_device_ts,
-	&s3c_device_bl,
 	&s3c_device_sdi,
-	&s3c_device_spi0,
-	//&s3c_device_spi1,
+	&s3c_device_ts,
 	&s3c_device_buttons,
+	&s3c_device_bl,
+	/* soon : &g500_vibrator,*/
 };
 
 static struct s3c24xx_board g500_board __initdata = {
@@ -349,20 +326,15 @@ static void __init g500_map_io(void)
 static void __init g500_machine_init(void)
 {
 	s3c24xx_fb_set_platdata(&g500_lcd_cfg);
+  s3c_device_sdi.dev.platform_data = &g500_mmc_cfg;
 	set_s3c2410ts_info(&g500_ts_cfg);
-	set_s3c2410bl_info(&g500_bl_cfg);
 	s3c24xx_butt_set_platdata(&g500_bt_cfg);
-
-	s3c_device_sdi.dev.platform_data = &g500_mmc_cfg;
-	s3c_device_spi0.dev.platform_data=&g500_spi_info_0;
-	//s3c_device_spi1.dev.platform_data=&g500_spi_info_1;
+	set_s3c2410bl_info(&g500_bl_cfg);
 
 	s3c2410_pm_init();
 
-	s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST |S3C2410_MISCCR_USBSUSPND0 |S3C2410_MISCCR_USBSUSPND1, 0x0); 
-
-	/* test for wake up source */
-	s3c_irq_wake(IRQ_EINT1, 1);
+  /* wake up source */
+  s3c_irq_wake(IRQ_EINT1, 1);
 }
 
 MACHINE_START(G500, "G500")
diff -Nurp linux/kernel26/drivers/mmc/s3c2440mci.c linux.mine/kernel26/drivers/mmc/s3c2440mci.c
--- linux/kernel26/drivers/mmc/s3c2440mci.c	2006-12-17 04:43:35.000000000 +0100
+++ linux.mine/kernel26/drivers/mmc/s3c2440mci.c	2006-12-17 16:47:40.000000000 +0100
@@ -76,7 +76,7 @@ static struct s3c2410_dma_client s3c2410
  * 9) Driver wakes up and takes care of the request
 */
 
-static irqreturn_t s3c2410sdi_irq(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t s3c2410sdi_irq(int irq, void *dev_id)
 {
 	struct s3c2410sdi_host *host;
 	u32 sdi_csta, sdi_fsta, sdi_dsta, sdi_dcnt;
@@ -251,7 +252,7 @@ clear_imask:
  * ISR for the CardDetect Pin
 */
 
-static irqreturn_t s3c2410sdi_irq_cd(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t s3c2410sdi_irq_cd(int irq, void *dev_id)
 {
 	struct s3c2410sdi_host *host = (struct s3c2410sdi_host *)dev_id;
 	mmc_detect_change(host->mmc, S3C2410SDI_CDLATENCY);
@@ -379,7 +380,7 @@ static void s3c2410sdi_request(struct mm
 		host->complete_what = COMPLETION_XFERFINISH_RSPFIN;
 
 		sdi_bsize = mrq->data->blksz;
-		host->size = mrq->data->blocks * mrq->data->blksz;
+		host->size = mrq->data->blksz;
 
 		sdi_dcon  = (mrq->data->blocks & S3C2410_SDIDCON_BLKNUM_MASK);
 		sdi_dcon |= S3C2440_SDIDCON_DATA_START;
@@ -435,7 +436,7 @@ static void s3c2410sdi_request(struct mm
 		{
 			struct scatterlist *sg;
 			sg=&mrq->data->sg[0];
-			host->pio_words=(mrq->data->blocks * sdi_bsize)>>2;
+			host->pio_words=sdi_bsize>>2;
 			host->pio_ptr=page_address(sg->page)+sg->offset;
 		}
 
@@ -509,7 +510,7 @@ static void s3c2410sdi_request(struct mm
 	 * no error
 	 */
 	if(mrq->data->error == MMC_ERR_NONE) {
-		mrq->data->bytes_xfered = mrq->data->blocks * mrq->data->blksz;
+		mrq->data->bytes_xfered = mrq->data->blksz;
 	} else {
 		mrq->data->bytes_xfered = 0;
 	}
@@ -570,6 +571,9 @@ static void s3c2410sdi_set_ios(struct mm
 	if(ios->clock) 	sdi_con |= S3C2440_SDICON_CLOCKENABLE;
 	else		sdi_con &=~S3C2440_SDICON_CLOCKENABLE;
 
+  // use MMC type clock
+  sdi_con|=S3C2440_SDICON_MMCCLOCK;
+
 	writel(sdi_con, host->base + S3C2410_SDICON);
 
 	host->bus_width = ios->bus_width;
@@ -694,7 +698,7 @@ static int s3c2410sdi_probe(struct platf
 	mmc->ocr_avail	= pdata->ocr_avail;
 	mmc->f_min 	= clk_get_rate(host->clk) / 512;
 	mmc->f_max 	= clk_get_rate(host->clk) / 2;
-	mmc->caps	= MMC_CAP_4_BIT_DATA;
+	mmc->caps	= MMC_CAP_4_BIT_DATA | MMC_CAP_MULTIWRITE | MMC_CAP_BYTEBLOCK;
 
 	if(pdata->f_max && (mmc->f_max>pdata->f_max))
 		mmc->f_max = pdata->f_max;
diff -Nurp linux/kernel26/drivers/usb/gadget/s3c2410_udc.c linux.mine/kernel26/drivers/usb/gadget/s3c2410_udc.c
--- linux/kernel26/drivers/usb/gadget/s3c2410_udc.c	2006-12-17 14:21:12.000000000 +0100
+++ linux.mine/kernel26/drivers/usb/gadget/s3c2410_udc.c	2006-12-17 16:56:51.000000000 +0100
@@ -791,7 +791,7 @@ static void handle_ep(struct s3c2410_ep 
  *      s3c2410_udc_irq - interrupt handler
  */
 static irqreturn_t
-s3c2410_udc_irq(int irq, void *_dev)
+s3c2410_udc_irq(int irq, void *_dev, struct pt_regs *regs)
 {
 	struct s3c2410_udc      *dev = _dev;
 	int usb_status;
@@ -1388,7 +1388,7 @@ static int s3c2410_pullup (struct usb_ga
 	return 0;
 }
 
-static irqreturn_t s3c2410_udc_vbus_irq(int irq, void *_dev)
+static irqreturn_t s3c2410_udc_vbus_irq(int irq, void *_dev, struct pt_regs *regs)
 {
 	struct s3c2410_udc      *dev = _dev;
 	unsigned int 		value;
diff -Nurp linux/kernel26/include/asm-arm/arch-s3c2410/regs-sdi.h linux.mine/kernel26/include/asm-arm/arch-s3c2410/regs-sdi.h
--- linux/kernel26/include/asm-arm/arch-s3c2410/regs-sdi.h	2006-12-02 03:20:53.000000000 +0100
+++ linux.mine/kernel26/include/asm-arm/arch-s3c2410/regs-sdi.h	2006-12-17 16:51:58.000000000 +0100
@@ -31,18 +31,25 @@
 #define S3C2410_SDIDATA               (0x3C)
 #define S3C2410_SDIIMSK               (0x40)
 
+#define S3C2440_SDIDATA               (0x40)
+#define S3C2440_SDIIMSK               (0x3C)
+
+#define S3C2440_SDICON_SDRESET        (1<<8)
+#define S3C2440_SDICON_MMCCLOCK       (1<<5)
 #define S3C2410_SDICON_BYTEORDER      (1<<4)
 #define S3C2410_SDICON_SDIOIRQ        (1<<3)
 #define S3C2410_SDICON_RWAITEN        (1<<2)
 #define S3C2410_SDICON_FIFORESET      (1<<1)
 #define S3C2410_SDICON_CLOCKTYPE      (1<<0)
+#define S3C2440_SDICON_CLOCKENABLE    (1<<0)
 
 #define S3C2410_SDICMDCON_ABORT       (1<<12)
 #define S3C2410_SDICMDCON_WITHDATA    (1<<11)
 #define S3C2410_SDICMDCON_LONGRSP     (1<<10)
 #define S3C2410_SDICMDCON_WAITRSP     (1<<9)
 #define S3C2410_SDICMDCON_CMDSTART    (1<<8)
-#define S3C2410_SDICMDCON_INDEX       (0xff)
+#define S3C2410_SDICMDCON_SENDERHOST  (1<<6)
+#define S3C2410_SDICMDCON_INDEX       (0x3f)
 
 #define S3C2410_SDICMDSTAT_CRCFAIL    (1<<12)
 #define S3C2410_SDICMDSTAT_CMDSENT    (1<<11)
@@ -50,7 +57,11 @@
 #define S3C2410_SDICMDSTAT_RSPFIN     (1<<9)
 #define S3C2410_SDICMDSTAT_XFERING    (1<<8)
 #define S3C2410_SDICMDSTAT_INDEX      (0xff)
+#define S3C2410_SDICMDSTAT_ALLFLAGS   (0x1f00)
 
+#define S3C2440_SDIDCON_DS_BYTE       (0<<22)
+#define S3C2440_SDIDCON_DS_HALFWORD   (1<<22)
+#define S3C2440_SDIDCON_DS_WORD       (2<<22)
 #define S3C2410_SDIDCON_IRQPERIOD     (1<<21)
 #define S3C2410_SDIDCON_TXAFTERRESP   (1<<20)
 #define S3C2410_SDIDCON_RXAFTERCMD    (1<<19)
@@ -58,8 +69,11 @@
 #define S3C2410_SDIDCON_BLOCKMODE     (1<<17)
 #define S3C2410_SDIDCON_WIDEBUS       (1<<16)
 #define S3C2410_SDIDCON_DMAEN         (1<<15)
+#define S3C2440_SDIDCON_DATA_START    (1<<14)
 #define S3C2410_SDIDCON_STOP          (1<<14)
-#define S3C2410_SDIDCON_DATMODE	      (3<<12)
+#define S3C2440_SDIDCON_DATA_MODE_TX  (3<<12)
+#define S3C2410_SDIDCON_DATMODE       (3<<12)
+#define S3C2440_SDIDCON_DATA_MODE_RX  (2<<12)
 #define S3C2410_SDIDCON_BLKNUM        (0x7ff)
 
 /* constants for S3C2410_SDIDCON_DATMODE */
@@ -68,6 +82,7 @@
 #define S3C2410_SDIDCON_XFER_RXSTART  (2<<12)
 #define S3C2410_SDIDCON_XFER_TXSTART  (3<<12)
 
+#define S3C2410_SDIDCON_BLKNUM_MASK   (0xFFF)
 #define S3C2410_SDIDCNT_BLKNUM_SHIFT  (12)
 
 #define S3C2410_SDIDSTA_RDYWAITREQ    (1<<10)
@@ -82,6 +97,8 @@
 #define S3C2410_SDIDSTA_TXDATAON      (1<<1)
 #define S3C2410_SDIDSTA_RXDATAON      (1<<0)
 
+#define S3C2440_SDIFSTA_FIFORESET      (1<<16)
+#define S3C2440_SDIFSTA_FIFOFAIL       (3<<14)
 #define S3C2410_SDIFSTA_TFDET          (1<<13)
 #define S3C2410_SDIFSTA_RFDET          (1<<12)
 #define S3C2410_SDIFSTA_TXHALF         (1<<11)
@@ -91,6 +108,7 @@
 #define S3C2410_SDIFSTA_RFHALF         (1<<7)
 #define S3C2410_SDIFSTA_COUNTMASK      (0x7f)
 
+#define S3C2440_SDIIMSK_NOBUSY         (1<<18)
 #define S3C2410_SDIIMSK_RESPONSECRC    (1<<17)
 #define S3C2410_SDIIMSK_CMDSENT        (1<<16)
 #define S3C2410_SDIIMSK_CMDTIMEOUT     (1<<15)
@@ -110,4 +128,14 @@
 #define S3C2410_SDIIMSK_RXFIFOFULL     (1<<1)
 #define S3C2410_SDIIMSK_RXFIFOHALF     (1<<0)
 
+#define S3C2410_SDICMDCON_ABORT       (1<<12)
+#define S3C2410_SDICMDCON_WITHDATA    (1<<11)
+#define S3C2410_SDICMDCON_LONGRSP     (1<<10)
+#define S3C2410_SDICMDCON_WAITRSP     (1<<9)
+#define S3C2410_SDICMDCON_CMDSTART    (1<<8)
+#define S3C2410_SDICMDCON_SENDERHOST  (1<<6)
+
+#define S3C2410_SDIDCON_BLKNUM_MASK   (0xFFF)
+#define S3C2410_SDIDCNT_BLKNUM_SHIFT  (12)
+
 #endif /* __ASM_ARM_REGS_SDI */

