From bccf1d53528fb6dfae2450df5adc5b370a6fbd47 Mon Sep 17 00:00:00 2001 From: lyx Date: Mon, 7 Mar 2011 00:44:21 -0800 Subject: [PATCH] backlight:set bl_pwm as gpio and set it low, make sure backlight be off --- arch/arm/mach-rk29/board-rk29sdk.c | 23 +++++++++++++++++++++++ arch/arm/mach-rk29/include/mach/board.h | 2 ++ drivers/video/backlight/rk29_backlight.c | 11 +++++++++-- 3 files changed, 34 insertions(+), 2 deletions(-) mode change 100644 => 100755 drivers/video/backlight/rk29_backlight.c diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c index 3d98ca14de31..96f34bace4c7 100755 --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -1017,6 +1017,7 @@ static struct platform_device rk29_device_camera = { #define PWM_MUX_NAME GPIO1B5_PWM0_NAME #define PWM_MUX_MODE GPIO1L_PWM0 #define PWM_MUX_MODE_GPIO GPIO1L_GPIO1B5 +#define PWM_GPIO RK29_PIN1_PB5 #define PWM_EFFECT_VALUE 1 //#define LCD_DISP_ON_PIN @@ -1057,11 +1058,33 @@ static int rk29_backlight_io_deinit(void) rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO); return ret; } + +static int rk29_backlight_pwm_suspend(void) +{ + int ret = 0; + rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO); + if (ret = gpio_request(PWM_GPIO, NULL)) { + printk("func %s, line %d: request gpio fail\n", __FUNCTION__, __LINE__); + return -1; + } + gpio_direction_output(PWM_GPIO, GPIO_LOW); + return ret; +} + +static int rk29_backlight_pwm_resume(void) +{ + gpio_free(PWM_GPIO); + rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE); + return 0; +} + struct rk29_bl_info rk29_bl_info = { .pwm_id = PWM_ID, .bl_ref = PWM_EFFECT_VALUE, .io_init = rk29_backlight_io_init, .io_deinit = rk29_backlight_io_deinit, + .pwm_suspend = rk29_backlight_pwm_suspend, + .pwm_resume = rk29_backlight_pwm_resume, }; #endif /***************************************************************************************** diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h index d5f29c1eb933..40a73a3ea485 100755 --- a/arch/arm/mach-rk29/include/mach/board.h +++ b/arch/arm/mach-rk29/include/mach/board.h @@ -81,6 +81,8 @@ struct rk29_bl_info{ u32 bl_ref; int (*io_init)(void); int (*io_deinit)(void); + int (*pwm_suspend)(void); + int (*pwm_resume)(void); struct timer_list timer; struct notifier_block freq_transition; }; diff --git a/drivers/video/backlight/rk29_backlight.c b/drivers/video/backlight/rk29_backlight.c old mode 100644 new mode 100755 index 86b25cde8798..248190d40aff --- a/drivers/video/backlight/rk29_backlight.c +++ b/drivers/video/backlight/rk29_backlight.c @@ -164,6 +164,10 @@ static void rk29_delaybacklight_timer(unsigned long data) struct rk29_bl_info *rk29_bl_info = (struct rk29_bl_info *)data; u32 id, brightness; u32 div_total, divh; + + if (rk29_bl_info->pwm_resume) + rk29_bl_info->pwm_resume(); + clk_enable(pwm_clk); id = rk29_bl_info->pwm_id; brightness = rk29_bl->props.brightness; @@ -197,9 +201,12 @@ static void rk29_bl_suspend(struct early_suspend *h) } write_pwm_reg(id, PWM_REG_HRC, divh); - if (!suspend_flag) + if (!suspend_flag) { clk_disable(pwm_clk); - + if (rk29_bl_info->pwm_suspend) + rk29_bl_info->pwm_suspend(); + } + suspend_flag = 1; del_timer_sync(&rk29_bl_info->timer); } -- 2.34.1