aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/patches-2.6.26/1179-fix-pcf50633-really-defer-backlight-on-resume.patch.patch
blob: 6c17c69ef666d22f3270a463e81dcb87b96fbb17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
From 568981c881e20fccdbfffb073c3868dcdc012446 Mon Sep 17 00:00:00 2001
From: Andy Green <andy@openmoko.com>
Date: Fri, 25 Jul 2008 23:06:15 +0100
Subject: [PATCH] fix-pcf50633-really-defer-backlight-on-resume.patch

Backlight wasn't off by default on resume, so it was never really
deferred (until LCM is initialized).  This fixes that and so removes
the brief white screen between pcf50633 resume and LCM init.

Signed-off-by: Andy Green <andy@openmoko.com>
---
 drivers/i2c/chips/pcf50633.c |   23 +++++++++++++++++------
 1 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/i2c/chips/pcf50633.c b/drivers/i2c/chips/pcf50633.c
index 33c4ef4..bbc8ae6 100644
--- a/drivers/i2c/chips/pcf50633.c
+++ b/drivers/i2c/chips/pcf50633.c
@@ -2474,13 +2474,14 @@ EXPORT_SYMBOL_GPL(pcf50633_ready);
 
 void pcf50633_backlight_resume(struct pcf50633_data *pcf)
 {
+	dev_info(&pcf->client.dev, "pcf50633_backlight_resume\n");
+
 	/* we force the backlight on in fact */
-	__reg_write(pcf, PCF50633_REG_LEDOUT, pcf->standby_regs.misc[
+	reg_write(pcf, PCF50633_REG_LEDDIM, 1);
+	reg_write(pcf, PCF50633_REG_LEDOUT, pcf->standby_regs.misc[
 				   PCF50633_REG_LEDOUT - PCF50633_REG_AUTOOUT]);
-	__reg_write(pcf, PCF50633_REG_LEDENA, pcf->standby_regs.misc[
+	reg_write(pcf, PCF50633_REG_LEDENA, pcf->standby_regs.misc[
 			       PCF50633_REG_LEDENA - PCF50633_REG_AUTOOUT] | 1);
-	__reg_write(pcf, PCF50633_REG_LEDDIM, pcf->standby_regs.misc[
-				   PCF50633_REG_LEDDIM - PCF50633_REG_AUTOOUT]);
 }
 EXPORT_SYMBOL_GPL(pcf50633_backlight_resume);
 
@@ -2491,6 +2492,7 @@ static int pcf50633_resume(struct device *dev)
 	struct pcf50633_data *pcf = i2c_get_clientdata(client);
 	int ret;
 	u8 res[5];
+	u8 misc[PCF50633_REG_LEDDIM - PCF50633_REG_AUTOOUT + 1];
 
 	dev_info(dev, "pcf50633_resume suspended on entry = %d\n",
 						 (int)pcf->suspend_state);
@@ -2502,11 +2504,20 @@ static int pcf50633_resume(struct device *dev)
 
 	__reg_write(pcf, PCF50633_REG_OOCTIM2, pcf->standby_regs.ooctim2);
 
+	memcpy(misc, pcf->standby_regs.misc, sizeof(pcf->standby_regs.misc));
+
+	if (pcf->pdata->defer_resume_backlight) {
+		misc[PCF50633_REG_LEDOUT - PCF50633_REG_AUTOOUT] = 1;
+		misc[PCF50633_REG_LEDENA - PCF50633_REG_AUTOOUT] = 0x20;
+		misc[PCF50633_REG_LEDCTL - PCF50633_REG_AUTOOUT] = 1;
+		misc[PCF50633_REG_LEDDIM - PCF50633_REG_AUTOOUT] = 1;
+	}
+
 	/* regulator voltages and enable states */
 	ret = i2c_smbus_write_i2c_block_data(&pcf->client,
 					     PCF50633_REG_AUTOOUT,
-					     sizeof(pcf->standby_regs.misc) - 4,
-					     &pcf->standby_regs.misc[0]);
+					     sizeof(misc),
+					     &misc[0]);
 	if (ret)
 		dev_err(dev, "Failed to restore misc :-( %d\n", ret);
 
-- 
1.5.6.3