ARM: S3C2410: H1940: Fix lcd_power_set function
authorVasily Khoruzhick <anarsoul@gmail.com>
Thu, 6 Jan 2011 19:52:50 +0000 (21:52 +0200)
committerBen Dooks <ben-linux@fluff.org>
Sun, 20 Mar 2011 23:14:55 +0000 (23:14 +0000)
Current implementation of lcd_power_set is not reliable, sometimes
it does not enable LCD at all.
Mimic WinCE behavior to fix this issue.

Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
arch/arm/mach-s3c2410/mach-h1940.c

index a0116ef2eca7de0748ee806476e295f0d2134096..882b32af9ddef947b05547eb0936b9beb8eb3e58 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/leds.h>
 #include <linux/pda_power.h>
 #include <linux/s3c_adc_battery.h>
+#include <linux/delay.h>
 
 #include <video/platform_lcd.h>
 
@@ -209,15 +210,15 @@ static struct s3c2410fb_mach_info h1940_fb_info __initdata = {
        .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)
@@ -526,14 +527,14 @@ static struct platform_device h1940_backlight = {
 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);
@@ -551,6 +552,9 @@ static void h1940_lcd_power_set(struct plat_lcd_data *pd,
                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));