From 8dd1dc8bf69e964f3055b989e5f833810a670f5f Mon Sep 17 00:00:00 2001 From: merge Date: Fri, 5 Dec 2008 11:10:06 +0000 Subject: MERGE-via-pending-tracking-hist-MERGE-via-stable-tracking-jbt6k74_cleanup_no_deep_sleep-1228475349 pending-tracking-hist top was MERGE-via-stable-tracking-jbt6k74_cleanup_no_deep_sleep-1228475349 / 7e4328b084323f8c35918bc2cb7a3afcf0ddf180 ... parent commitmessage: From: merge MERGE-via-stable-tracking-hist-jbt6k74_cleanup_no_deep_sleep- stable-tracking-hist top was jbt6k74_cleanup_no_deep_sleep- / f5213710553fe7a94cc0b47740162b8a745fa277 ... parent commitmessage: From: nicolas dufresne jbt6k74_cleanup_no_deep_sleep.patch Improve jbt6k74 driver changes to avoid WSOD so they don't stomp on QVGA / VGA mode situation --- drivers/video/display/jbt6k74.c | 68 +++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 44 deletions(-) (limited to 'drivers/video') diff --git a/drivers/video/display/jbt6k74.c b/drivers/video/display/jbt6k74.c index 3d87c736534..6beaea4caf6 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 */ @@ -618,11 +599,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"); @@ -633,11 +613,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; } @@ -745,13 +726,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; -- cgit v1.2.3