#include <linux/leds.h>
 #include <linux/pda_power.h>
 #include <linux/s3c_adc_battery.h>
+#include <linux/delay.h>
 
 #include <video/platform_lcd.h>
 
        .num_displays = 1,
        .default_display = 0,
 
-       .lpcsel=        0x02,
-       .gpccon=        0xaa940659,
-       .gpccon_mask=   0xffffffff,
-       .gpcup=         0x0000ffff,
-       .gpcup_mask=    0xffffffff,
-       .gpdcon=        0xaa84aaa0,
-       .gpdcon_mask=   0xffffffff,
-       .gpdup=         0x0000faff,
-       .gpdup_mask=    0xffffffff,
+       .lpcsel =       0x02,
+       .gpccon =       0xaa940659,
+       .gpccon_mask =  0xffffc0f0,
+       .gpcup =        0x0000ffff,
+       .gpcup_mask =   0xffffffff,
+       .gpdcon =       0xaa84aaa0,
+       .gpdcon_mask =  0xffffffff,
+       .gpdup =        0x0000faff,
+       .gpdup_mask =   0xffffffff,
 };
 
 static int power_supply_init(struct device *dev)
 static void h1940_lcd_power_set(struct plat_lcd_data *pd,
                                        unsigned int power)
 {
-       int value;
+       int value, retries = 100;
 
        if (!power) {
                gpio_set_value(S3C2410_GPC(0), 0);
                /* wait for 3ac */
                do {
                        value = gpio_get_value(S3C2410_GPC(6));
-               } while (value);
+               } while (value && retries--);
 
                gpio_set_value(H1940_LATCH_LCD_P2, 0);
                gpio_set_value(H1940_LATCH_LCD_P3, 0);
                gpio_set_value(H1940_LATCH_LCD_P0, 1);
                gpio_set_value(H1940_LATCH_LCD_P1, 1);
 
+               gpio_direction_input(S3C2410_GPC(1));
+               gpio_direction_input(S3C2410_GPC(4));
+               mdelay(10);
                s3c_gpio_cfgpin(S3C2410_GPC(1), S3C_GPIO_SFN(2));
                s3c_gpio_cfgpin(S3C2410_GPC(4), S3C_GPIO_SFN(2));