From 677278e8e7adc7bbcc49298cf83809cd5e2d6b64 Mon Sep 17 00:00:00 2001 From: Jackie Li Date: Tue, 8 May 2012 10:40:51 +0800 Subject: [PATCH] GFX-Display: resolved the flashing issue when booting up SC1. 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 Signed-off-by: Austin Hu Reviewed-on: http://android.intel.com:8080/47708 Reviewed-by: Ai, Ke Reviewed-by: Xu, Randy Tested-by: Tong, BoX Reviewed-by: buildbot Tested-by: buildbot --- drivers/staging/mrst/drv/auo_sc1_cmd.c | 51 ++++++++++++---------- drivers/staging/mrst/drv/mdfld_dsi_dbi.c | 11 +++-- drivers/staging/mrst/drv/psb_drv.c | 2 + drivers/staging/mrst/drv/psb_drv.h | 3 ++ drivers/staging/mrst/drv/psb_fb.c | 4 ++ drivers/staging/mrst/drv/psb_intel_display2.c | 8 ++++ .../linux_framebuffer_drm/drmlfb_displayclass.c | 4 +- .../3rdparty/linux_framebuffer_drm/drmlfb_linux.c | 1 + 8 files changed, 56 insertions(+), 28 deletions(-) diff --git a/drivers/staging/mrst/drv/auo_sc1_cmd.c b/drivers/staging/mrst/drv/auo_sc1_cmd.c index ee455e8..9a9faf2 100644 --- a/drivers/staging/mrst/drv/auo_sc1_cmd.c +++ b/drivers/staging/mrst/drv/auo_sc1_cmd.c @@ -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]) { diff --git a/drivers/staging/mrst/drv/mdfld_dsi_dbi.c b/drivers/staging/mrst/drv/mdfld_dsi_dbi.c index 5708f62..6eb9c7b 100644 --- a/drivers/staging/mrst/drv/mdfld_dsi_dbi.c +++ b/drivers/staging/mrst/drv/mdfld_dsi_dbi.c @@ -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; diff --git a/drivers/staging/mrst/drv/psb_drv.c b/drivers/staging/mrst/drv/psb_drv.c index e574ccd..c2924ae 100644 --- a/drivers/staging/mrst/drv/psb_drv.c +++ b/drivers/staging/mrst/drv/psb_drv.c @@ -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) diff --git a/drivers/staging/mrst/drv/psb_drv.h b/drivers/staging/mrst/drv/psb_drv.h index 44268b8..121504b 100644 --- a/drivers/staging/mrst/drv/psb_drv.h +++ b/drivers/staging/mrst/drv/psb_drv.h @@ -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. */ diff --git a/drivers/staging/mrst/drv/psb_fb.c b/drivers/staging/mrst/drv/psb_fb.c index c3a5cbb..61c1b8d 100644 --- a/drivers/staging/mrst/drv/psb_fb.c +++ b/drivers/staging/mrst/drv/psb_fb.c @@ -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; } diff --git a/drivers/staging/mrst/drv/psb_intel_display2.c b/drivers/staging/mrst/drv/psb_intel_display2.c index ea66426..8b5247b 100755 --- a/drivers/staging/mrst/drv/psb_intel_display2.c +++ b/drivers/staging/mrst/drv/psb_intel_display2.c @@ -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) diff --git a/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_displayclass.c b/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_displayclass.c index 27e2e13..b6f50c0 100644 --- a/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_displayclass.c +++ b/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_displayclass.c @@ -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; } diff --git a/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_linux.c b/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_linux.c index e1b7f33..2cb56b7 100644 --- a/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_linux.c +++ b/drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_linux.c @@ -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; } -- 2.7.4