backlight:set bl_pwm as gpio and set it low, make sure backlight be off
authorlyx <lyx@rock-chips.com>
Mon, 7 Mar 2011 08:44:21 +0000 (00:44 -0800)
committerlyx <lyx@rock-chips.com>
Mon, 7 Mar 2011 08:44:45 +0000 (00:44 -0800)
arch/arm/mach-rk29/board-rk29sdk.c
arch/arm/mach-rk29/include/mach/board.h
drivers/video/backlight/rk29_backlight.c [changed mode: 0644->0755]

index 3d98ca14de316ca7322e4ad03de32f0efb630433..96f34bace4c75be5889c153c0d3d7463d63f8c05 100755 (executable)
@@ -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
 /*****************************************************************************************
index d5f29c1eb9334b3c81398d912f64fb78a5fedf60..40a73a3ea48582c624973730dd179e47c4893b3f 100755 (executable)
@@ -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;
 };
old mode 100644 (file)
new mode 100755 (executable)
index 86b25cd..248190d
@@ -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);
 }