Port a bunch of patches from R2
authorTong, Bo <box.tong@intel.com>
Wed, 14 Mar 2012 04:54:28 +0000 (12:54 +0800)
committerbuildbot <buildbot@intel.com>
Thu, 15 Mar 2012 07:49:25 +0000 (00:49 -0700)
BZ: 17008

This patch includes below bug fixing

0001-HDMI-Fix-the-unnecessary-encoder_restore-action.patch: BZ: 20187
0002-GFX-Display-Fix-charging-screen-mess-issue.patch:     BZ: 19361
0003-GFX-DISPLAY-fix-lock-screen-flip-issue-when-audio-is.patch: BZ: 20293
0004-GFX-Display-Add-support-for-some-modes-in-video-data.patch: BZ: 22978
0005-GFX-DISPLAY-improve-mipi-panel-init-stability.patch: BZ: 23028
0006-Display-HDMI-do-audio-busy-check-in-psb_runtime_susp.patch: BZ: 19448

0001-Revert-GFX-display-Audio-can-t-play-on-hdmi-after-su.patch: Orig-patch: 32311

Change-Id: Iab06b59e4b6bd0e895658278fbd81f350ed5a3f1
Signed-off-by: Tong, Bo <box.tong@intel.com>
Reviewed-on: http://android.intel.com:8080/35365
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
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/drv/psb_intel_hdmi.c
drivers/staging/mrst/drv/psb_intel_hdmi.h
drivers/staging/mrst/drv/psb_powermgmt.c
drivers/staging/mrst/drv/tmd_6x10_vid.c
drivers/staging/mrst/pvr/services4/3rdparty/linux_framebuffer_drm/drmlfb_displayclass.c
drivers/staging/mrst/pvr/services4/system/intel_drm/sysconfig.c

index a659fd3..273d557 100644 (file)
@@ -1064,6 +1064,10 @@ struct drm_psb_private {
        struct workqueue_struct *hpd_detect;
        pfn_screen_event_handler pvr_screen_event_handler;
        struct mutex dpms_mutex;
+
+       /* fix Lock screen flip in resume issue */
+       unsigned long init_screen_start;
+       unsigned long init_screen_offset;
 };
 
 struct psb_fpriv {
index 8e2b299..c3a5cbb 100644 (file)
@@ -1151,9 +1151,9 @@ static int psbfb_create(struct psb_fbdev * fbdev, struct drm_fb_helper_surface_s
        drm_fb_helper_fill_fix(info, fb->pitch, fb->depth);
 
        if (get_panel_type(dev, 0) == TMD_6X10_VID)
-               drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, sizes->fb_width-200, sizes->fb_height);
+               drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, fb->width, fb->height);
        else
-               drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, sizes->fb_width, sizes->fb_height);
+               drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, fb->width, fb->height);
 
        info->fix.mmio_start = pci_resource_start(dev->pdev, 0);
        info->fix.mmio_len = pci_resource_len(dev->pdev, 0);
index 04a557a..80b90b2 100644 (file)
@@ -1359,10 +1359,12 @@ static int mdfld_crtc_dsi_mode_set(struct drm_crtc *crtc,
        struct psb_framebuffer *mdfld_fb;
        struct psb_intel_mode_device *mode_dev;
        struct mdfld_dsi_hw_context *ctx;
+       struct drm_psb_private *dev_priv;
        int fb_bpp;
        int fb_pitch;
        int fb_depth;
        int hdelay;
+       static int init_flag = 1;   /*bootstrap flag*/
 
        if (!crtc || !crtc->fb) {
                DRM_ERROR("Invalid CRTC\n");
@@ -1383,6 +1385,7 @@ static int mdfld_crtc_dsi_mode_set(struct drm_crtc *crtc,
        fb_pitch = crtc->fb->pitch;
        fb_depth = crtc->fb->depth;
        dev = crtc->dev;
+       dev_priv = (struct drm_psb_private *)dev->dev_private;
 
        mutex_lock(&dsi_config->context_lock);
 
@@ -1427,6 +1430,14 @@ static int mdfld_crtc_dsi_mode_set(struct drm_crtc *crtc,
        ctx->dspsurf = mode_dev->bo_offset(dev, mdfld_fb);
        ctx->dsplinoff = y * fb_pitch + x * (fb_bpp / 8);
 
+       if (init_flag == 1) {
+               printk(KERN_DEBUG"%s: ctx->dspsurf = 0x%x, ctx->dsplinoff = 0x%x\n",
+                               __func__, ctx->dsplinoff, ctx->dspsurf);
+               dev_priv->init_screen_start = ctx->dspsurf;
+               dev_priv->init_screen_offset = ctx->dsplinoff;
+               init_flag = 0;
+       }
+
        switch (fb_bpp) {
        case 8:
                ctx->dspcntr = DISPPLANE_8BPP;
index 6d44f74..f6acb96 100644 (file)
@@ -164,10 +164,14 @@ static struct hdmi_edid_info mdfld_hdmi_edid[] = {
 };
 
 mdfld_hdmi_timing_t mdfld_hdmi_video_mode_table[] = {
-       {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-       {2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-       {3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-       {4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+       /* 640*480/60 */
+       {640, 480, 60, 25200, 800, 640, 800, 656, 752, 525, 480, 525, 490, 492},
+       /* 720*480/60 */
+       {720, 480, 60, 27027, 858, 720, 858, 736, 798, 525, 480, 525, 489, 495},
+       /* 720*480/60-16:9 */
+       {720, 480, 60, 27027, 858, 720, 858, 736, 798, 525, 480, 525, 489, 495},
+       /* 1280*720/60 */
+       {1280, 720, 60, 74250, 1650, 1280, 1650, 1390, 1430, 750, 720, 750, 725, 730},
        {5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
@@ -183,7 +187,8 @@ mdfld_hdmi_timing_t mdfld_hdmi_video_mode_table[] = {
        {16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-       {19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+       /* 1280*720/50 */
+       {1280, 720, 50, 74250, 1980, 1280, 1980, 1720, 1760, 750, 720, 750, 725, 730},
        {20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
@@ -397,6 +402,12 @@ static int mdfld_hdmi_set_avi_infoframe(struct drm_device *dev,
 
        PSB_DEBUG_ENTRY("%s\n", __func__);
 
+       if(unlikely(!mode))
+       {
+               PSB_DEBUG_ENTRY("display mode is NULL!\n");
+               return 0;
+       }
+
        /*get edid infomation*/
        if (connector && connector->edid_blob_ptr) {
                edid_block = connector->edid_blob_ptr->data;
@@ -825,6 +836,8 @@ static void mdfld_hdmi_encoder_save(struct drm_encoder *encoder)
        int dspcntr_reg = DSPBCNTR;
        int dspbase_reg = MRST_DSPBBASE;
        struct drm_device *dev = encoder->dev;
+       struct psb_intel_output *output = enc_to_psb_intel_output(encoder);
+       struct mid_intel_hdmi_priv *hdmi_priv = output->dev_priv;
        u32 temp;
        PSB_DEBUG_ENTRY("\n");
 
@@ -832,6 +845,8 @@ static void mdfld_hdmi_encoder_save(struct drm_encoder *encoder)
                                OSPM_UHB_FORCE_POWER_ON))
                return ;
 
+       hdmi_priv->need_encoder_restore = true;
+
        /*Use Disable pipeB plane to turn off HDMI screen
         in early_suspend  */
        temp = REG_READ(dspcntr_reg);
@@ -849,6 +864,8 @@ static void mdfld_hdmi_encoder_restore(struct drm_encoder *encoder)
 {
        int dspcntr_reg = DSPBCNTR;
        int dspbase_reg = MRST_DSPBBASE;
+       int dspbsurf_reg = DSPBSURF;
+       int dspblinoff_reg = DSPBLINOFF;
        struct drm_device *dev = encoder->dev;
        struct drm_psb_private *dev_priv =
                (struct drm_psb_private *)dev->dev_private;
@@ -857,10 +874,19 @@ static void mdfld_hdmi_encoder_restore(struct drm_encoder *encoder)
        u32 temp;
        PSB_DEBUG_ENTRY("\n");
 
+       if(unlikely(!(hdmi_priv->need_encoder_restore)))
+               return;
+
+       hdmi_priv->need_encoder_restore = false;
+
        if (!ospm_power_using_hw_begin(OSPM_DISPLAY_ISLAND,
                                OSPM_UHB_FORCE_POWER_ON))
                return ;
 
+       /*Set DSPBSURF to systemBuffer temporary to avoid hdmi display last picture*/
+       REG_WRITE(dspbsurf_reg, dev_priv->init_screen_start);
+       REG_WRITE(dspblinoff_reg, dev_priv->init_screen_offset);
+
        /*Restore pipe B plane to turn on HDMI screen
        in late_resume*/
        temp = REG_READ(dspcntr_reg);
@@ -1661,7 +1687,9 @@ int mdfld_add_eedid_video_block_modes(struct drm_connector *connector, struct ed
                                 vic = *(c + j) & 0x7F;
 
                                 printk("vic: %d\n", vic);
-                                if (vic == 34 || vic == 32 || vic == 33) {
+                                if (vic == 34 || vic == 32 || vic == 33 ||
+                                   vic == 1 || vic == 2 || vic == 3 ||
+                                   vic == 4 || vic == 19) {
                                     p_video_mode = &mdfld_hdmi_video_mode_table[vic - 1];
 
                                     mode = drm_mode_create(dev);
@@ -1792,7 +1820,6 @@ static int mdfld_hdmi_get_modes(struct drm_connector *connector)
                        ret += 1;
                }
        }
-
        if (ret <= 0) {
                /*
                 * Didn't get an EDID, so set wide sync ranges so we get all
@@ -1861,7 +1888,7 @@ static int mdfld_hdmi_get_modes(struct drm_connector *connector)
         }
     }
 
-       return ret;
+    return ret;
 }
 
 static int mdfld_hdmi_mode_valid(struct drm_connector *connector,
@@ -2043,6 +2070,7 @@ void mdfld_hdmi_init(struct drm_device *dev,
        /*FIXME: May need to get this somewhere, but CG code seems hard coded it*/
        hdmi_priv->hdmib_reg = HDMIB_CONTROL;
        hdmi_priv->has_hdmi_sink = false;
+       hdmi_priv->need_encoder_restore = false;
        psb_intel_output->dev_priv = hdmi_priv;
 
        drm_encoder_helper_add(encoder, &mdfld_hdmi_helper_funcs);
index ffbe87a..d61f316 100644 (file)
@@ -927,6 +927,7 @@ struct mid_intel_hdmi_priv {
        struct drm_display_mode *edid_preferred_mode;
        bool is_hardcode_edid;
        struct drm_display_mode *current_mode;
+       bool need_encoder_restore;
 };
 
 struct hdmi_edid_info {
index e177a14..103b75b 100644 (file)
@@ -1901,7 +1901,13 @@ int ospm_power_suspend(struct pci_dev *pdev, pm_message_t state)
         int videoenc_access_count;
         int videodec_access_count;
         int display_access_count;
-
+#if (defined(CONFIG_SND_INTELMID_HDMI_AUDIO) || \
+               defined(CONFIG_SND_INTELMID_HDMI_AUDIO_MODULE))
+       struct drm_psb_private *dev_priv = gpDrmDevice->dev_private;
+       struct snd_intel_had_interface *had_interface = dev_priv->had_interface;
+       int hdmi_audio_busy = 0;
+       pm_event_t hdmi_audio_event;
+#endif
        if(gbSuspendInProgress || gbResumeInProgress)
         {
 #ifdef OSPM_GFX_DPK
@@ -1912,18 +1918,31 @@ int ospm_power_suspend(struct pci_dev *pdev, pm_message_t state)
 #ifdef OSPM_GFX_DPK
        printk(KERN_ALERT "%s\n", __func__);
 #endif
-
         mutex_lock(&g_ospm_mutex);
         if (!gbSuspended) {
                 graphics_access_count = atomic_read(&g_graphics_access_count);
                 videoenc_access_count = atomic_read(&g_videoenc_access_count);
                 videodec_access_count = atomic_read(&g_videodec_access_count);
                 display_access_count = atomic_read(&g_display_access_count);
+#if (defined(CONFIG_SND_INTELMID_HDMI_AUDIO) || \
+               defined(CONFIG_SND_INTELMID_HDMI_AUDIO_MODULE))
+               if (dev_priv->had_pvt_data && hdmi_state) {
+                       hdmi_audio_event.event = 0;
+                       hdmi_audio_busy =
+                               had_interface->suspend(dev_priv->had_pvt_data,
+                                                       hdmi_audio_event);
+               }
+#endif
 
-                if (graphics_access_count ||
-                       videoenc_access_count ||
-                       videodec_access_count ||
-                       display_access_count)
+                if (graphics_access_count
+                       || videoenc_access_count
+                       || videodec_access_count
+                       || display_access_count
+#if (defined(CONFIG_SND_INTELMID_HDMI_AUDIO) || \
+               defined(CONFIG_SND_INTELMID_HDMI_AUDIO_MODULE))
+                       || hdmi_audio_busy
+#endif
+               )
                         ret = -EBUSY;
                 if (!ret) {
                         gbSuspendInProgress = true;
@@ -2494,39 +2513,12 @@ int psb_runtime_suspend(struct device *dev)
        pm_message_t state;
        int ret = 0;
        state.event = 0;
-
-#if (defined(CONFIG_SND_INTELMID_HDMI_AUDIO) || \
-               defined(CONFIG_SND_INTELMID_HDMI_AUDIO_MODULE))
-        struct drm_psb_private* dev_priv = gpDrmDevice->dev_private;
-        int hdmi_audio_busy = 0;
-        struct snd_intel_had_interface *had_interface = dev_priv->had_interface;
-        pm_event_t hdmi_audio_event;
-        char *uevent_string = NULL;
-
-        if (dev_priv->had_pvt_data && hdmi_state) {
-                hdmi_audio_event.event = 0;
-                hdmi_audio_busy =
-                        had_interface->suspend(dev_priv->had_pvt_data,
-                                        hdmi_audio_event);
-
-                if (!hdmi_audio_busy) {
-                        uevent_string = "HDMI_AUDIO_PM_SUSPENDED=1";
-                        psb_sysfs_uevent(dev_priv->dev, uevent_string);
-                }
-        }
-#endif
-
 #ifdef OSPM_GFX_DPK
        printk(KERN_ALERT "%s\n", __func__);
 #endif
         if (atomic_read(&g_graphics_access_count) || atomic_read(&g_videoenc_access_count)
                || (gbdispstatus == true)
-               || atomic_read(&g_videodec_access_count) || atomic_read(&g_display_access_count)
-#if (defined(CONFIG_SND_INTELMID_HDMI_AUDIO) || \
-       defined(CONFIG_SND_INTELMID_HDMI_AUDIO_MODULE))
-                || hdmi_audio_busy
-#endif
-           ) {
+               || atomic_read(&g_videodec_access_count) || atomic_read(&g_display_access_count)){
 #ifdef OSPM_GFX_DPK
                printk(KERN_ALERT "GFX:%d VEC:%d VED:%d DC:%d DSR:%d\n",
                        atomic_read(&g_graphics_access_count),
index a67bfd2..aa924ce 100755 (executable)
@@ -99,34 +99,34 @@ void mdfld_dsi_pr2_ic_init(struct mdfld_dsi_config *dsi_config, int pipe)
        while (time_before_eq(jiffies, wait_timeout))
                cpu_relax();
 
-       mdfld_dsi_send_gen_long_hs(sender, pr2_mcs_protect_off, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_pixel_format, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_dsi_control, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_panel_driving, 2, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_v_timing, 2, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_control, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_test_mode_0, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_h_timing, 4, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_can_skip, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_gamma_set_a, 4, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_gamma_set_b, 4, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_gamma_set_c, 4, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_charge_pump_setting, 2, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_test_mode_1, 2, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_source_amplifiers, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_power_supply_circuit, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_vreg_setting, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_test_mode_2, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_timing_control_0, 3, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_timing_control_1, 2, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_timing_control_2, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_white_balance, 2, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_vcs_setting, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_vcom_dc_setting, 1, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_test_mode_3, 2, 0);
-       mdfld_dsi_send_gen_long_hs(sender, pr2_mcs_protect_on, 1, 0);
-       mdfld_dsi_send_mcs_long_hs(sender, pr2_set_address_mode, 1, 0);
-       mdfld_dsi_send_mcs_long_hs(sender, pr2_set_pixel_format, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_mcs_protect_off, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_pixel_format, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_dsi_control, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_panel_driving, 2, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_v_timing, 2, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_control, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_test_mode_0, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_h_timing, 4, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_can_skip, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_gamma_set_a, 4, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_gamma_set_b, 4, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_gamma_set_c, 4, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_charge_pump_setting, 2, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_test_mode_1, 2, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_source_amplifiers, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_power_supply_circuit, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_vreg_setting, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_test_mode_2, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_timing_control_0, 3, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_timing_control_1, 2, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_timing_control_2, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_white_balance, 2, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_vcs_setting, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_vcom_dc_setting, 1, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_test_mode_3, 2, 0);
+       mdfld_dsi_send_gen_long_lp(sender, pr2_mcs_protect_on, 1, 0);
+       mdfld_dsi_send_mcs_long_lp(sender, pr2_set_address_mode, 1, 0);
+       mdfld_dsi_send_mcs_long_lp(sender, pr2_set_pixel_format, 1, 0);
 
        /* Now In Sleep Mode */
 }
index 665ac06..0c84d2b 100755 (executable)
@@ -65,7 +65,8 @@ static void SetAnchorPtr(MRSTLFB_DEVINFO *psDevInfo)
 static void MRSTLFBFlip(MRSTLFB_DEVINFO *psDevInfo, MRSTLFB_BUFFER *psBuffer)
 {
        unsigned long ulAddr = (unsigned long)psBuffer->sDevVAddr.uiAddr;
-    struct fb_info *psLINFBInfo;
+       struct fb_info *psLINFBInfo;
+       static int FirstCleanFlag = 1;
 
        if (!psDevInfo->bSuspended && !psDevInfo->bLeaveVT)
        {
@@ -77,6 +78,11 @@ static void MRSTLFBFlip(MRSTLFB_DEVINFO *psDevInfo, MRSTLFB_BUFFER *psBuffer)
 
        psLINFBInfo = psDevInfo->psLINFBInfo;
        psLINFBInfo->screen_base = psBuffer->sCPUVAddr;
+
+       if (FirstCleanFlag == 1) {
+               memset(psDevInfo->sSystemBuffer.sCPUVAddr, 0, psDevInfo->sSystemBuffer.ui32BufferSize);
+               FirstCleanFlag = 0;
+       }
 }
 
 static void MRSTLFBRestoreLastFlip(MRSTLFB_DEVINFO *psDevInfo)
index 1596002..f170e31 100755 (executable)
@@ -1270,7 +1270,7 @@ PVRSRV_ERROR SysDevicePrePowerState(IMG_UINT32                    ui32DeviceIndex,
 #endif
 
 #ifdef CONFIG_GFX_RTPM
-                       pm_schedule_suspend(&gpDrmDevice->pdev->dev, 0);
+                       pm_request_idle(&gpDrmDevice->pdev->dev);
 #endif
 
                }