From 89ecdb53f62877adabeb692a23ff8c92bef925a4 Mon Sep 17 00:00:00 2001 From: zyw Date: Tue, 31 May 2011 17:06:17 +0800 Subject: [PATCH] fix White screen when power_on or resume --- arch/arm/mach-rk29/board-rk29sdk.c | 59 +++++++++++++++++++---- arch/arm/mach-rk29/include/mach/board.h | 6 +-- drivers/video/rk29_fb.c | 62 +++++++++---------------- 3 files changed, 74 insertions(+), 53 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c index ef07c74616c7..647e7edef77e 100755 --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -169,7 +169,7 @@ struct rk29_nand_platform_data rk29_nand_data = { * author: zyw@rock-chips.com *****************************************************************************************/ #define FB_ID 0 -#define FB_DISPLAY_ON_PIN RK29_PIN6_PD0 +#define FB_DISPLAY_ON_PIN INVALID_GPIO// RK29_PIN6_PD0 #define FB_LCD_STANDBY_PIN RK29_PIN6_PD1 #define FB_LCD_CABC_EN_PIN RK29_PIN6_PD2 #define FB_MCU_FMK_PIN INVALID_GPIO @@ -197,6 +197,33 @@ static struct rk29lcd_info rk29_lcd_info = { .io_deinit = rk29_lcd_io_deinit, }; +int rk29_fb_io_enable(void) +{ + if(FB_DISPLAY_ON_PIN != INVALID_GPIO) + { + gpio_direction_output(FB_DISPLAY_ON_PIN, 0); + gpio_set_value(FB_DISPLAY_ON_PIN, FB_DISPLAY_ON_VALUE); + } + if(FB_LCD_STANDBY_PIN != INVALID_GPIO) + { + gpio_direction_output(FB_LCD_STANDBY_PIN, 0); + gpio_set_value(FB_LCD_STANDBY_PIN, FB_LCD_STANDBY_VALUE); + } +} + +int rk29_fb_io_disable(void) +{ + if(FB_DISPLAY_ON_PIN != INVALID_GPIO) + { + gpio_direction_output(FB_DISPLAY_ON_PIN, 0); + gpio_set_value(FB_DISPLAY_ON_PIN, !FB_DISPLAY_ON_VALUE); + } + if(FB_LCD_STANDBY_PIN != INVALID_GPIO) + { + gpio_direction_output(FB_LCD_STANDBY_PIN, 0); + gpio_set_value(FB_LCD_STANDBY_PIN, !FB_LCD_STANDBY_VALUE); + } +} static int rk29_fb_io_init(struct rk29_fb_setting_info *fb_setting) { @@ -270,19 +297,20 @@ static int rk29_fb_io_init(struct rk29_fb_setting_info *fb_setting) gpio_direction_output(FB_LCD_CABC_EN_PIN, 0); gpio_set_value(FB_LCD_CABC_EN_PIN, GPIO_LOW); } + + rk29_fb_io_enable(); //enable it return ret; } + static struct rk29fb_info rk29_fb_info = { .fb_id = FB_ID, - .disp_on_pin = FB_DISPLAY_ON_PIN, - .disp_on_value = FB_DISPLAY_ON_VALUE, - .standby_pin = FB_LCD_STANDBY_PIN, - .standby_value = FB_LCD_STANDBY_VALUE, .mcu_fmk_pin = FB_MCU_FMK_PIN, .lcd_info = &rk29_lcd_info, .io_init = rk29_fb_io_init, + .io_enable = rk29_fb_io_enable, + .io_disable = rk29_fb_io_disable, }; /* rk29 fb resource */ @@ -776,13 +804,13 @@ static struct rk29camera_platform_ioctl_cb sensor_ioctl_cb = { #define PWM_GPIO RK29_PIN1_PB5 #define PWM_EFFECT_VALUE 1 -//#define LCD_DISP_ON_PIN +#define LCD_DISP_ON_PIN #ifdef LCD_DISP_ON_PIN -#define BL_EN_MUX_NAME GPIOF34_UART3_SEL_NAME -#define BL_EN_MUX_MODE IOMUXB_GPIO1_B34 +//#define BL_EN_MUX_NAME GPIOF34_UART3_SEL_NAME +//#define BL_EN_MUX_MODE IOMUXB_GPIO1_B34 -#define BL_EN_PIN GPIO0L_GPIO0A5 +#define BL_EN_PIN RK29_PIN6_PD0 #define BL_EN_VALUE GPIO_HIGH #endif static int rk29_backlight_io_init(void) @@ -791,7 +819,7 @@ static int rk29_backlight_io_init(void) rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE); #ifdef LCD_DISP_ON_PIN - rk29_mux_api_set(BL_EN_MUX_NAME, BL_EN_MUX_MODE); + // rk29_mux_api_set(BL_EN_MUX_NAME, BL_EN_MUX_MODE); ret = gpio_request(BL_EN_PIN, NULL); if(ret != 0) @@ -812,6 +840,7 @@ static int rk29_backlight_io_deinit(void) gpio_free(BL_EN_PIN); #endif rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO); + return ret; } @@ -824,6 +853,10 @@ static int rk29_backlight_pwm_suspend(void) return -1; } gpio_direction_output(PWM_GPIO, GPIO_LOW); + #ifdef LCD_DISP_ON_PIN + gpio_direction_output(BL_EN_PIN, 0); + gpio_set_value(BL_EN_PIN, !BL_EN_VALUE); + #endif return ret; } @@ -831,6 +864,12 @@ static int rk29_backlight_pwm_resume(void) { gpio_free(PWM_GPIO); rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE); + + #ifdef LCD_DISP_ON_PIN + msleep(30); + gpio_direction_output(BL_EN_PIN, 1); + gpio_set_value(BL_EN_PIN, BL_EN_VALUE); + #endif return 0; } diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h index a761ee53520e..b9e59e90ee59 100755 --- a/arch/arm/mach-rk29/include/mach/board.h +++ b/arch/arm/mach-rk29/include/mach/board.h @@ -69,14 +69,12 @@ struct rk29_fb_setting_info{ struct rk29fb_info{ u32 fb_id; - u32 disp_on_pin; - u8 disp_on_value; - u32 standby_pin; - u8 standby_value; u32 mcu_fmk_pin; struct rk29lcd_info *lcd_info; int (*io_init)(struct rk29_fb_setting_info *fb_setting); int (*io_deinit)(void); + int (*io_enable)(void); + int (*io_disable)(void); }; struct rk29_bl_info{ diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index 2bc6c7783574..cf5c0bea5a67 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -265,34 +265,6 @@ static int new_frame_seted = 1; #endif static struct wake_lock idlelock; /* only for fb */ -void set_lcd_pin(struct platform_device *pdev, int enable) -{ - struct rk29fb_info *mach_info = pdev->dev.platform_data; - - unsigned display_on = mach_info->disp_on_pin; - unsigned lcd_standby = mach_info->standby_pin; - - int display_on_pol = mach_info->disp_on_value; - int lcd_standby_pol = mach_info->standby_value; - - fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__); - fbprintk(">>>>>> display_on(%d) = %d \n", display_on, enable ? display_on_pol : !display_on_pol); - fbprintk(">>>>>> lcd_standby(%d) = %d \n", lcd_standby, enable ? lcd_standby_pol : !lcd_standby_pol); - - // set display_on - - if(display_on != INVALID_GPIO) - { - gpio_direction_output(display_on, 0); - gpio_set_value(display_on, enable ? display_on_pol : !display_on_pol); - } - if(lcd_standby != INVALID_GPIO) - { - gpio_direction_output(lcd_standby, 0); - gpio_set_value(lcd_standby, enable ? lcd_standby_pol : !lcd_standby_pol); - } -} - int mcu_do_refresh(struct rk29fb_inf *inf) { if(inf->mcu_stopflush) return 0; @@ -2141,6 +2113,7 @@ int FB_Switch_Screen( struct rk29fb_screen *screen, u32 enable ) { struct rk29fb_inf *inf = platform_get_drvdata(g_pdev); // struct rk29fb_info *mach_info = g_pdev->dev.platform_data; + struct rk29fb_info *mach_info = g_pdev->dev.platform_data; memcpy(&inf->panel2_info, screen, sizeof( struct rk29fb_screen )); @@ -2159,8 +2132,10 @@ int FB_Switch_Screen( struct rk29fb_screen *screen, u32 enable ) if(inf->cur_screen->standby) inf->cur_screen->standby(1); // operate the display_on pin to power down the lcd - set_lcd_pin(g_pdev, (enable==0)); - + + if(enable && mach_info->io_disable)mach_info->io_disable(); //close lcd out + else if (mach_info->io_enable)mach_info->io_enable(); //open lcd out + load_screen(inf->fb0, 0); mcu_refresh(inf); @@ -2291,6 +2266,7 @@ static void rk29fb_early_suspend(struct early_suspend *h) early_suspend); struct rk29fb_inf *inf = info->inf; + struct rk29fb_info *mach_info = g_pdev->dev.platform_data; fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); @@ -2299,8 +2275,8 @@ static void rk29fb_early_suspend(struct early_suspend *h) return; } - if(inf->cur_screen != &inf->panel2_info) // close lcd pwr when output screen is lcd - set_lcd_pin(g_pdev, 0); + if((inf->cur_screen != &inf->panel2_info) && mach_info->io_disable) // close lcd pwr when output screen is lcd + mach_info->io_disable(); //close lcd out if(inf->cur_screen->standby) { @@ -2344,6 +2320,7 @@ static void rk29fb_early_resume(struct early_suspend *h) struct rk29fb_inf *inf = info->inf; struct rk29fb_screen *screen = inf->cur_screen; + struct rk29fb_info *mach_info = g_pdev->dev.platform_data; fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); if(!inf) { @@ -2381,10 +2358,13 @@ static void rk29fb_early_resume(struct early_suspend *h) fbprintk(">>>>>> power on the screen! \n"); inf->cur_screen->standby(0); } - msleep(100); - if(inf->cur_screen != &inf->panel2_info) // open lcd pwr when output screen is lcd - set_lcd_pin(g_pdev, 1); - memcpy((u8*)inf->preg, (u8*)&inf->regbak, 0xa4); //resume reg + msleep(10); + memcpy((u8*)inf->preg, (u8*)&inf->regbak, 0xa4); //resume reg + msleep(40); + + if((inf->cur_screen != &inf->panel2_info) && mach_info->io_enable) // open lcd pwr when output screen is lcd + mach_info->io_enable(); //close lcd out + } static struct suspend_info suspend_info = { @@ -2647,7 +2627,7 @@ static int __init rk29fb_probe (struct platform_device *pdev) mach_info->io_init(&fb_setting); } - set_lcd_pin(pdev, 1); + //set_lcd_pin(pdev, 1); mdelay(10); g_pdev = pdev; inf->mcu_usetimer = 1; @@ -2778,7 +2758,8 @@ static int rk29fb_remove(struct platform_device *pdev) free_irq(gpio_to_irq(mach_info->mcu_fmk_pin), pdev); } - set_lcd_pin(pdev, 0); + if(mach_info->io_disable) + mach_info->io_disable(); //close lcd out // blank the lcdc if(inf->fb1) @@ -2842,10 +2823,13 @@ static int rk29fb_remove(struct platform_device *pdev) static void rk29fb_shutdown(struct platform_device *pdev) { struct rk29fb_inf *inf = platform_get_drvdata(pdev); + struct rk29fb_info *mach_info = pdev->dev.platform_data;; fbprintk("----------------------------rk29fb_shutdown----------------------------\n"); - set_lcd_pin(pdev, 0); + if(mach_info->io_disable) + mach_info->io_disable(); //close lcd out + if(!inf->in_suspend) { LcdMskReg(inf, DSP_CTRL1, m_BLANK_MODE , v_BLANK_MODE(1)); -- 2.34.1