GFX-Display: resolved the flashing issue when booting up SC1.
authorJackie Li <yaodong.li@intel.com>
Tue, 8 May 2012 02:40:51 +0000 (10:40 +0800)
committerbuildbot <buildbot@intel.com>
Tue, 22 May 2012 14:12:38 +0000 (07:12 -0700)
BZ: 32042

Fixed by:
1. Not doing mode setting, DPMS operation and suspending/resuming before driver
   loadling completes, as IFWI turns on the MIPI panel when launching system;
2. Replacing mdfld_dsi_dbi_update_power() with mdfld_auo_dsi_dbi_set_power(),
   to avoid potential incorrect DCS command sequence.
3. Making DBI panel update_fb() work when the frame buffer device is used to
   update screen in droidboot mode.
4. Also fixed the droidboot displaying nothing issue caused by patch #47785,
   by sending "write_mem_start" DSI command in TE interrupt handler in droidboot
   mode where there isn't page flip request.

This issue is from Enzo BZ #570.

Change-Id: Ie2896876690848ef1a77e67b3cd869a30db29535
Signed-off-by: Jackie Li <yaodong.li@intel.com>
Signed-off-by: Austin Hu <austin.hu@intel.com>
Reviewed-on: http://android.intel.com:8080/47708
Reviewed-by: Ai, Ke <ke.ai@intel.com>
Reviewed-by: Xu, Randy <randy.xu@intel.com>
Tested-by: Tong, BoX <box.tong@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/staging/mrst/drv/auo_sc1_cmd.c
drivers/staging/mrst/drv/mdfld_dsi_dbi.c
drivers/staging/mrst/drv/psb_drv.c
drivers/staging/mrst/drv/psb_drv.h
drivers/staging/mrst/drv/psb_fb.c
drivers/staging/mrst/drv/psb_intel_display2.c
drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_displayclass.c
drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_linux.c

index ee455e8..9a9faf2 100644 (file)
@@ -413,8 +413,13 @@ static int mdfld_auo_dsi_dbi_power_on(struct drm_encoder *encoder)
        struct panel_funcs *p_funcs = dbi_output->p_funcs;
        struct mdfld_dsi_hw_registers *regs = NULL;
        struct mdfld_dsi_hw_context *ctx = NULL;
+       struct drm_device *dev = encoder->dev;
+       struct drm_psb_private *dev_priv = dev->dev_private;
        int err = 0;
 
+       if (!dev_priv->dsi_init_done)
+               return 0;
+
        if (!dsi_config)
                return -EINVAL;
 
@@ -459,8 +464,13 @@ static int mdfld_auo_dsi_dbi_power_off(struct drm_encoder *encoder)
                mdfld_dsi_encoder_get_config(dsi_encoder);
        struct panel_funcs *p_funcs = dbi_output->p_funcs;
        struct mdfld_dsi_hw_context *ctx;
+       struct drm_device *dev = encoder->dev;
+       struct drm_psb_private *dev_priv = dev->dev_private;
        int err = 0;
 
+       if (!dev_priv->dsi_init_done)
+               return 0;
+
        if (!dsi_config)
                return -EINVAL;
 
@@ -660,26 +670,6 @@ static void mdfld_auo_dsi_dbi_commit(struct drm_encoder *encoder)
        rect.height = 480;
 #endif
 
-       if (dbi_output->channel_num == 1) {
-               dev_priv->dsr_fb_update |= MDFLD_DSR_2D_3D_2;
-#ifdef CONFIG_MDFLD_DSI_DPU
-               /* if dpu enabled report a fullscreen damage */
-               mdfld_dbi_dpu_report_damage(dev, MDFLD_PLANEC, &rect);
-#endif
-       } else {
-               dev_priv->dsr_fb_update |= MDFLD_DSR_2D_3D_0;
-
-#ifdef CONFIG_MDFLD_DSI_DPU
-               mdfld_dbi_dpu_report_damage(dev, MDFLD_PLANEA, &rect);
-               /* start dpu timer */
-               if (dev_priv->platform_rev_id == MDFLD_PNW_A0)
-                       mdfld_dbi_dpu_timer_start(dev_priv->dbi_dpu_info);
-#else
-               if (dev_priv->platform_rev_id == MDFLD_PNW_A0)
-                       mdfld_dbi_dsr_timer_start(dev_priv->dbi_dsr_info);
-#endif
-       }
-
        dbi_output->mode_flags |= MODE_SETTING_ENCODER_DONE;
 }
 
@@ -703,7 +693,7 @@ static void mdfld_auo_dsi_dbi_dpms(struct drm_encoder *encoder, int mode)
                if (bdispoff)
                        mdfld_dsi_dbi_exit_dsr(dev, MDFLD_DSR_2D_3D, 0, 0);
 
-               mdfld_dsi_dbi_set_power(encoder, true);
+               mdfld_auo_dsi_dbi_set_power(encoder, true);
 
                if (gbgfxsuspended)
                        gbgfxsuspended = false;
@@ -716,7 +706,7 @@ static void mdfld_auo_dsi_dbi_dpms(struct drm_encoder *encoder, int mode)
                 * turn rpm on since we still have a lot of CRTC turnning
                 * on work to do.
                 */
-               mdfld_dsi_dbi_set_power(encoder, false);
+               mdfld_auo_dsi_dbi_set_power(encoder, false);
                bdispoff = true;
                gbdispstatus = false;
        }
@@ -724,9 +714,15 @@ static void mdfld_auo_dsi_dbi_dpms(struct drm_encoder *encoder, int mode)
 
 void mdfld_auo_dsi_dbi_save(struct drm_encoder *encoder)
 {
+       struct drm_device *dev = encoder->dev;
+       struct drm_psb_private *dev_priv = dev->dev_private;
+
        if (!encoder)
                return;
 
+       if (!dev_priv->dsi_init_done)
+               return;
+
        /*turn off*/
        mdfld_auo_dsi_dbi_set_power(encoder, false);
 }
@@ -735,10 +731,15 @@ void mdfld_auo_dsi_dbi_restore(struct drm_encoder *encoder)
 {
        struct mdfld_dsi_encoder *dsi_encoder = NULL;
        struct mdfld_dsi_config *dsi_config = NULL;
+       struct drm_device *dev = encoder->dev;
+       struct drm_psb_private *dev_priv = dev->dev_private;
 
        if (!encoder)
                return;
 
+       if (!dev_priv->dsi_init_done)
+               return;
+
        dsi_encoder = MDFLD_DSI_ENCODER(encoder);
        dsi_config = mdfld_dsi_encoder_get_config(dsi_encoder);
 
@@ -758,6 +759,7 @@ static void auo_dsi_dbi_update_fb(struct mdfld_dsi_dbi_output *dbi_output,
        struct mdfld_dsi_pkg_sender *sender =
                mdfld_dsi_encoder_get_pkg_sender(&dbi_output->base);
        struct drm_device *dev = dbi_output->dev;
+       struct drm_psb_private *dev_priv = dev->dev_private;
        struct drm_crtc *crtc = dbi_output->base.base.crtc;
        struct psb_intel_crtc *psb_crtc =
                (crtc) ? to_psb_intel_crtc(crtc) : NULL;
@@ -767,6 +769,9 @@ static void auo_dsi_dbi_update_fb(struct mdfld_dsi_dbi_output *dbi_output,
        u32 dsplinoff_reg = DSPALINOFF;
        u32 dspsurf_reg = DSPASURF;
 
+       if (!dev_priv->dsi_init_done)
+               return;
+
        /* if mode setting on-going, back off */
        if ((dbi_output->mode_flags & MODE_SETTING_ON_GOING) ||
                        (psb_crtc &&
@@ -907,6 +912,8 @@ static int mdfld_auo_dsi_panel_reset(struct mdfld_dsi_config *dsi_config,
                }
 
                b_gpio_required[dsi_config->pipe] = true;
+
+               goto fun_exit;
        }
 
        if (b_gpio_required[dsi_config->pipe]) {
index 5708f62..6eb9c7b 100644 (file)
@@ -1009,9 +1009,12 @@ struct mdfld_dsi_encoder *mdfld_dsi_dbi_init(struct drm_device *dev,
        }
 
        /*init DSI controller*/
-       if (p_funcs->dsi_controller_init)
-               p_funcs->dsi_controller_init(dsi_config, pipe, true);
-
+       if (p_funcs->dsi_controller_init) {
+               if (get_panel_type(dev, pipe) == AUO_SC1_CMD)
+                       p_funcs->dsi_controller_init(dsi_config, pipe, false);
+               else
+                       p_funcs->dsi_controller_init(dsi_config, pipe, true);
+       }
        if (dsi_connector->status == connector_status_connected) {
                if (pipe == 0)
                        dev_priv->panel_desc |= DISPLAY_A;
@@ -1070,7 +1073,7 @@ struct mdfld_dsi_encoder *mdfld_dsi_dbi_init(struct drm_device *dev,
 
        dev_priv->dsr_fb_update = 0;
        dev_priv->b_dsr_enable = false;
-       dev_priv->b_async_flip_enable = true;
+       dev_priv->b_async_flip_enable = false;
        dev_priv->exit_idle = mdfld_dsi_dbi_exit_dsr;
        dev_priv->async_flip_update_fb = mdfld_dsi_dbi_async_flip_fb_update;
        dev_priv->async_check_fifo_empty = mdfld_dsi_dbi_async_check_fifo_empty;
index e574ccd..c2924ae 100644 (file)
@@ -2034,6 +2034,8 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
 #endif
        }
 
+       dev_priv->dsi_init_done = 1;
+
        /*must be after mrst_get_fuse_settings()*/
        ret = psb_backlight_init(dev);
        if (ret)
index 44268b8..121504b 100644 (file)
@@ -445,6 +445,9 @@ struct drm_psb_private {
        int te_pipe;
        struct work_struct reset_panel_work;
        bool is_in_panel_reset;
+
+       int dsi_init_done;
+
        /*
         *TTM Glue.
         */
index c3a5cbb..61c1b8d 100644 (file)
@@ -741,6 +741,10 @@ static int psbfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
 
        }
 
+       if ((is_panel_vid_or_cmd(dev) == MDFLD_DSI_ENCODER_DBI) &&
+                       dev_priv->exit_idle)
+               dev_priv->exit_idle(dev, MDFLD_DSR_2D_3D, NULL, true);
+
        return 0;
 }
 
index ea66426..8b5247b 100755 (executable)
@@ -1164,6 +1164,10 @@ static void mdfld_crtc_dpms(struct drm_crtc *crtc, int mode)
        }
 #endif
 
+       if (get_panel_type(dev, pipe) == AUO_SC1_CMD &&
+               !dev_priv->dsi_init_done)
+               return;
+
        if (!ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
                                       OSPM_UHB_FORCE_POWER_ON))
                return;
@@ -1927,6 +1931,10 @@ static int mdfld_crtc_mode_set(struct drm_crtc *crtc,
 
        PSB_DEBUG_ENTRY("pipe = 0x%x\n", pipe);
 
+       if (get_panel_type(dev, pipe) == AUO_SC1_CMD &&
+               !dev_priv->dsi_init_done)
+               return;
+
        if (pipe == 0)   //h8c7_cmd
                dsi_config = dev_priv->dsi_configs[0];
        else if (pipe == 2)
index 27e2e13..b6f50c0 100644 (file)
@@ -1223,7 +1223,7 @@ static IMG_BOOL ProcessFlip2(IMG_HANDLE hCmdCookie,
         */
        if (!dev_priv->um_start) {
                dev_priv->um_start = true;
-
+               dev_priv->b_async_flip_enable = true;
                if (dev_priv->b_dsr_enable_config)
                        dev_priv->b_dsr_enable = true;
        }
@@ -1340,7 +1340,7 @@ static IMG_BOOL ProcessFlip(IMG_HANDLE  hCmdCookie,
        psFlipItem = &psSwapChain->psVSyncFlips[psSwapChain->ulInsertIndex];
        if (!dev_priv->um_start) {
                dev_priv->um_start = true;
-
+               dev_priv->b_async_flip_enable = true;
                if (dev_priv->b_dsr_enable_config)
                        dev_priv->b_dsr_enable = true;
        }
index e1b7f33..2cb56b7 100644 (file)
@@ -149,6 +149,7 @@ void MRSTLFBFlipToSurface(MRSTLFB_DEVINFO *psDevInfo,  unsigned long uiAddr)
         } else if (IS_MDFLD(dev)) {
                if (!dev_priv->um_start) {
                        dev_priv->um_start = true;
+                       dev_priv->b_async_flip_enable = true;
                        if (dev_priv->b_dsr_enable_config)
                                dev_priv->b_dsr_enable = true;
                }