From: 黄涛 <huangtao@rock-chips.com>
Date: Thu, 21 Apr 2011 06:17:41 +0000 (+0800)
Subject: rk29: backlight: call io_deinit when shutdown, disable update status when resume... 
X-Git-Tag: firefly_0821_release~10438
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=403cdabc83411ef129659ebac623ff83a940bc3e;p=firefly-linux-kernel-4.4.55.git

rk29: backlight: call io_deinit when shutdown, disable update status when resume, add min_brightness and delay_ms board info
---

diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h
index a9224244295a..441572df85a1 100755
--- a/arch/arm/mach-rk29/include/mach/board.h
+++ b/arch/arm/mach-rk29/include/mach/board.h
@@ -86,8 +86,8 @@ struct rk29_bl_info{
     int (*io_deinit)(void);
 	int (*pwm_suspend)(void);
 	int (*pwm_resume)(void);
-    struct timer_list timer;  
-    struct notifier_block freq_transition;
+	int min_brightness;	/* 0 ~ 255 */
+	unsigned int delay_ms;	/* in milliseconds */
 };
 
 struct wifi_platform_data {
diff --git a/drivers/video/backlight/rk29_backlight.c b/drivers/video/backlight/rk29_backlight.c
index edfe0160c7c0..c83ecf426f8f 100755
--- a/drivers/video/backlight/rk29_backlight.c
+++ b/drivers/video/backlight/rk29_backlight.c
@@ -46,7 +46,6 @@
 static struct clk *pwm_clk;
 static struct backlight_device *rk29_bl;
 static int suspend_flag = 0;
-#define BACKLIGHT_SEE_MINVALUE	52
 
 static int rk29_bl_update_status(struct backlight_device *bl)
 {
@@ -58,17 +57,18 @@ static int rk29_bl_update_status(struct backlight_device *bl)
 	if (suspend_flag)
 		return 0;
 
+	if (bl->props.brightness < rk29_bl_info->min_brightness)	/*avoid can't view screen when close backlight*/
+		bl->props.brightness = rk29_bl_info->min_brightness;
+
 	div_total = read_pwm_reg(id, PWM_REG_LRC);
 	if (ref) {
 		divh = div_total*(bl->props.brightness)/BL_STEP;
-		DBG(">>>%s-->%d   bl->props.brightness == %d, div_total == %d , divh == %d\n",__FUNCTION__,__LINE__,bl->props.brightness, div_total, divh);
 	} else {
-		DBG(">>>%s-->%d   bl->props.brightness == %d\n",__FUNCTION__,__LINE__,bl->props.brightness);
-		if(bl->props.brightness < BACKLIGHT_SEE_MINVALUE)	/*avoid can't view screen when close backlight*/
-			bl->props.brightness = BACKLIGHT_SEE_MINVALUE;
 		divh = div_total*(BL_STEP-bl->props.brightness)/BL_STEP;
 	}
 	write_pwm_reg(id, PWM_REG_HRC, divh);
+
+	DBG(">>>%s-->%d brightness = %d, div_total = %d, divh = %d\n",__FUNCTION__,__LINE__,bl->props.brightness, div_total, divh);
 	return 0;
 }
 
@@ -99,6 +99,7 @@ static struct backlight_ops rk29_bl_ops = {
 
 static void rk29_backlight_work_func(struct work_struct *work)
 {
+	suspend_flag = 0;
 	rk29_bl_update_status(rk29_bl);
 }
 static DECLARE_DELAYED_WORK(rk29_backlight_work, rk29_backlight_work_func);
@@ -109,6 +110,8 @@ static void rk29_bl_suspend(struct early_suspend *h)
 	struct rk29_bl_info *rk29_bl_info = bl_get_data(rk29_bl);
 	int brightness = rk29_bl->props.brightness;
 
+	cancel_delayed_work_sync(&rk29_backlight_work);
+
 	if (rk29_bl->props.brightness) {
 		rk29_bl->props.brightness = 0;
 		rk29_bl_update_status(rk29_bl);
@@ -133,9 +136,8 @@ static void rk29_bl_resume(struct early_suspend *h)
 		rk29_bl_info->pwm_resume();
 
 	clk_enable(pwm_clk);
-	suspend_flag = 0;
 
-	schedule_delayed_work(&rk29_backlight_work, msecs_to_jiffies(30));
+	schedule_delayed_work(&rk29_backlight_work, msecs_to_jiffies(rk29_bl_info->delay_ms));
 }
 
 static struct early_suspend bl_early_suspend = {
@@ -159,6 +161,12 @@ static int rk29_backlight_probe(struct platform_device *pdev)
 		return -EEXIST;		
 	}
 
+	if (!rk29_bl_info->delay_ms)
+		rk29_bl_info->delay_ms = 30;
+
+	if (rk29_bl_info->min_brightness < 0 || rk29_bl_info->min_brightness > BL_STEP)
+		rk29_bl_info->min_brightness = 52;
+
 	if (rk29_bl_info && rk29_bl_info->io_init) {
 		rk29_bl_info->io_init();
 	}
@@ -199,7 +207,7 @@ static int rk29_backlight_probe(struct platform_device *pdev)
 	rk29_bl->props.max_brightness = BL_STEP;
 	rk29_bl->props.brightness = BL_STEP / 2;
 
-	schedule_delayed_work(&rk29_backlight_work, msecs_to_jiffies(30));
+	schedule_delayed_work(&rk29_backlight_work, msecs_to_jiffies(rk29_bl_info->delay_ms));
 
 	register_early_suspend(&bl_early_suspend);
 
@@ -229,6 +237,8 @@ static int rk29_backlight_remove(struct platform_device *pdev)
 
 static void rk29_backlight_shutdown(struct platform_device *pdev)
 {
+	struct rk29_bl_info *rk29_bl_info = pdev->dev.platform_data;
+
 	rk29_bl->props.brightness >>= 1;
 	rk29_bl_update_status(rk29_bl);
 	mdelay(100);
@@ -239,6 +249,9 @@ static void rk29_backlight_shutdown(struct platform_device *pdev)
 
 	rk29_bl->props.brightness = 0;
 	rk29_bl_update_status(rk29_bl);
+
+	if (rk29_bl_info && rk29_bl_info->io_deinit)
+		rk29_bl_info->io_deinit();
 }
 
 static struct platform_driver rk29_backlight_driver = {