Hello all,

Here are some experimental changes that alter the suspend/resume and
VSYNC/HSYNC suspend of jbt6k74. This effort is mainly for streamlining
the driver for upstream submission.

I invite people who have had WSOD problems to please try this patch and
give me some feedback.

I've tested suspend/resume and resume seems a bit faster. I don't know
how can I test HSYNC/VSYNC suspend. Can anyone please point me to
userspace tools that I can use to test them ?

Thank you,
Balaji

diff --git a/drivers/video/display/jbt6k74.c b/drivers/video/display/jbt6k74.c
index a1d48dd..78f7b79 100644
--- a/drivers/video/display/jbt6k74.c
+++ b/drivers/video/display/jbt6k74.c
@@ -265,7 +265,12 @@ static int standby_to_sleep(struct jbt_info *jbt)
        mdelay(1);
 
        /* deep standby out */
-       rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x17);
+       rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x11);
+       mdelay(1);
+       rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x28);
+
+       /* (re)initialize register set */
+       rc |= jbt_init_regs(jbt, 0);
 
        return rc ? -EIO : 0;
 }
@@ -286,15 +291,12 @@ static int sleep_to_normal(struct jbt_info *jbt)
        /* Output control */
        rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xfff9);
 
-       /* Sleep mode off */
-       rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
-
-       /* initialize register set */
-       rc |= jbt_init_regs(jbt, 0);
-
        /* Turn on display */
        rc |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
 
+       /* Sleep mode off */
+       rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
+
        return rc ? -EIO : 0;
 }
 
@@ -314,15 +316,12 @@ static int sleep_to_qvga_normal(struct jbt_info *jbt)
        /* Output control */
        rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xfff9);
 
-       /* Sleep mode off */
-       rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
-
-       /* initialize register set for qvga*/
-       rc |= jbt_init_regs(jbt, 1);
-
        /* Turn on display */
        rc |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
 
+       /* Sleep mode off */
+       rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
+
        return rc ? -EIO : 0;
 }
 
@@ -602,19 +601,20 @@ static int fb_notifier_callback(struct notifier_block 
*self,
                break;
        case FB_BLANK_VSYNC_SUSPEND:
                dev_info(&jbt->spi_dev->dev, "**** jbt6k74 vsync suspend\n");
+                jbt6k74_enter_state(jbt, JBT_STATE_SLEEP);
                break;
        case FB_BLANK_HSYNC_SUSPEND:
                dev_info(&jbt->spi_dev->dev, "**** jbt6k74 hsync suspend\n");
                /* FIXME: we disable SLEEP since it would result in
                 * a visible artefact (white screen) before the backlight
                 * is dimmed to a dark enough level */
-               /* jbt6k74_enter_state(jbt, JBT_STATE_SLEEP); */
+                jbt6k74_enter_state(jbt, JBT_STATE_SLEEP);
                break;
        case FB_BLANK_POWERDOWN:
                dev_info(&jbt->spi_dev->dev, "**** jbt6k74 powerdown\n");
        /* FIXME: deep standby causes WSOD on certain devices. We use
         * sleep as workaround */
-               jbt6k74_enter_state(jbt, JBT_STATE_SLEEP);
+               jbt6k74_enter_state(jbt, JBT_STATE_DEEP_STANDBY);
                break;
        }
 
@@ -724,7 +724,7 @@ static int jbt_suspend(struct spi_device *spi, pm_message_t 
state)
        jbt->last_state = jbt->state;
        /* FIXME: deep standby causes WSOD on certain devices. We use
         * sleep as workaround */
-       jbt6k74_enter_state(jbt, JBT_STATE_SLEEP);
+       jbt6k74_enter_state(jbt, JBT_STATE_DEEP_STANDBY);
 
        jbt->have_resumed = 0;
 
@@ -741,19 +741,6 @@ int jbt6k74_resume(struct spi_device *spi)
 
        dev_info(&spi->dev, "**** jbt6k74 resume start\n");
 
-       /* hard reset the jbt6k74 */
-
-       (jbt6k74_pdata->reset)(0, 0);
-       mdelay(1);
-       (jbt6k74_pdata->reset)(0, 1);
-       mdelay(120);
-
-       rc = jbt_reg_write_nodata(jbt, 0x01);
-       if (rc < 0)
-               dev_err(&spi->dev, "cannot soft reset\n");
-
-       mdelay(120);
-
        jbt->state = JBT_STATE_DEEP_STANDBY;
        
        switch (jbt->last_state) {

Reply via email to