From fb42ce6724576fc173faf8abfb04aa2c36d213b7 Mon Sep 17 00:00:00 2001
From: Andy Green <agreen@pads.home.warmcat.com>
Date: Fri, 5 Dec 2008 11:03:59 +0000
Subject: [PATCH]

---
 drivers/video/display/jbt6k74.c |   68 ++++++++++++++-------------------------
 1 files changed, 24 insertions(+), 44 deletions(-)

diff --git a/drivers/video/display/jbt6k74.c b/drivers/video/display/jbt6k74.c
index 0635823..b1b5b1e 100644
--- a/drivers/video/display/jbt6k74.c
+++ b/drivers/video/display/jbt6k74.c
@@ -252,36 +252,22 @@ static int jbt_init_regs(struct jbt_info *jbt, int qvga)
 	return rc ? -EIO : 0;
 }
 
-int jbt6k74_display_onoff(struct jbt_info *jbt, int on)
-{
-	if (on)
-		return jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
-	else
-		return jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);
-}
-EXPORT_SYMBOL_GPL(jbt6k74_display_onoff);
-
 static int standby_to_sleep(struct jbt_info *jbt)
 {
-    static int once = 0;
-    if (!once++) {
-        int rc;
-
-        /* three times command zero */
-        rc = jbt_reg_write_nodata(jbt, 0x00);
-        mdelay(1);
-        rc |= jbt_reg_write_nodata(jbt, 0x00);
-        mdelay(1);
-        rc |= jbt_reg_write_nodata(jbt, 0x00);
-        mdelay(1);
-
-        /* deep standby out */
-        rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x17);
-
-        return rc ? -EIO : 0;
-    }
-    else 
-        return 0;
+	int rc;
+
+	/* three times command zero */
+	rc = jbt_reg_write_nodata(jbt, 0x00);
+	mdelay(1);
+	rc |= jbt_reg_write_nodata(jbt, 0x00);
+	mdelay(1);
+	rc |= jbt_reg_write_nodata(jbt, 0x00);
+	mdelay(1);
+
+	/* deep standby out */
+	rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x17);
+
+	return rc ? -EIO : 0;
 }
 
 static int sleep_to_normal(struct jbt_info *jbt)
@@ -307,7 +293,7 @@ static int sleep_to_normal(struct jbt_info *jbt)
 	rc |= jbt_init_regs(jbt, 0);
 
 	/* Turn on display */
-	rc |= jbt6k74_display_onoff(jbt, 1);
+	rc |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
 
 	return rc ? -EIO : 0;
 }
@@ -335,7 +321,7 @@ static int sleep_to_qvga_normal(struct jbt_info *jbt)
 	rc |= jbt_init_regs(jbt, 1);
 
 	/* Turn on display */
-	rc |= jbt6k74_display_onoff(jbt, 1);
+	rc |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
 
 	return rc ? -EIO : 0;
 }
@@ -344,8 +330,7 @@ static int normal_to_sleep(struct jbt_info *jbt)
 {
 	int rc;
 
-	rc = jbt6k74_display_onoff(jbt, 0);
-	rc |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);
+	rc = jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);
 	rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0x8002);
 	rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_IN);
 
@@ -354,11 +339,7 @@ static int normal_to_sleep(struct jbt_info *jbt)
 
 static int sleep_to_standby(struct jbt_info *jbt)
 {
-#if 0
 	return jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x00);
-#else
-    return 0;
-#endif
 }
 
 /* frontend function */
@@ -576,11 +557,10 @@ static int fb_notifier_callback(struct notifier_block *self,
 	switch (fb_blank) {
 	case FB_BLANK_UNBLANK:
 		dev_info(&jbt->spi_dev->dev, "**** jbt6k74 unblank\n");
+		jbt6k74_enter_state(jbt, JBT_STATE_NORMAL);
 		break;
 	case FB_BLANK_NORMAL:
 		dev_info(&jbt->spi_dev->dev, "**** jbt6k74 normal\n");
-		/*jbt6k74_enter_state(jbt, JBT_STATE_NORMAL);
-		jbt6k74_display_onoff(jbt, 1); */
 		break;
 	case FB_BLANK_VSYNC_SUSPEND:
 		dev_info(&jbt->spi_dev->dev, "**** jbt6k74 vsync suspend\n");
@@ -591,11 +571,12 @@ static int fb_notifier_callback(struct notifier_block *self,
 		 * a visible artefact (white screen) before the backlight
 		 * is dimmed to a dark enough level */
 		/* jbt6k74_enter_state(jbt, JBT_STATE_SLEEP); */
-		/*jbt6k74_display_onoff(jbt, 0);*/
 		break;
 	case FB_BLANK_POWERDOWN:
 		dev_info(&jbt->spi_dev->dev, "**** jbt6k74 powerdown\n");
-		/*jbt6k74_enter_state(jbt, JBT_STATE_DEEP_STANDBY);*/
+	/* FIXME: deep standby causes WSOD on certain devices. We use
+	 * sleep as workaround */
+		jbt6k74_enter_state(jbt, JBT_STATE_SLEEP);
 		break;
 	}
 
@@ -692,13 +673,12 @@ static int jbt_suspend(struct spi_device *spi, pm_message_t state)
 
 	/* Save mode for resume */
 	jbt->last_state = jbt->state;
-
-	jbt6k74_enter_state(jbt, JBT_STATE_DEEP_STANDBY);
+	/* FIXME: deep standby causes WSOD on certain devices. We use
+	 * sleep as workaround */
+	jbt6k74_enter_state(jbt, JBT_STATE_SLEEP);
 
 	jbt->have_resumed = 0;
 
-/*	(jbt6k74_pdata->reset)(0, 0); */
-
 	dev_info(&spi->dev, "**** jbt6k74 suspend end\n");
 
 	return 0;
-- 
1.5.6.5