From: Rajesh Poornachandran <[email protected]>

Fix to address Display not resuming post X screen saver timeout with Runtime PM.

Change-Id: I12874195ea9f7c37a1d9ecb97b11ffdd142d470e
Signed-off-by: Rajesh Poornachandran <[email protected]>
---
 drivers/staging/mrst/drv/psb_drv.c            |   18 +++++++-------
 drivers/staging/mrst/drv/psb_intel_display2.c |   12 +++++++-
 drivers/staging/mrst/drv/psb_powermgmt.c      |   33 ++++++++++++++++--------
 drivers/staging/mrst/drv/tpo_cmd.c            |   23 ++++++++++++++++-
 4 files changed, 62 insertions(+), 24 deletions(-)

diff --git a/drivers/staging/mrst/drv/psb_drv.c 
b/drivers/staging/mrst/drv/psb_drv.c
index c07225b..39d530b 100644
--- a/drivers/staging/mrst/drv/psb_drv.c
+++ b/drivers/staging/mrst/drv/psb_drv.c
@@ -2596,16 +2596,16 @@ static long psb_unlocked_ioctl(struct file *filp, 
unsigned int cmd,
        DRM_DEBUG("cmd = %x, nr = %x\n", cmd, nr);
        /*Simple (work around)Ugly hack to make runtime pm start only after X 
is initialized*/
        /*This doesn't work with Medfield RT PM.*/
-
-       if(drm_psb_ospm && !runtime_allowed && !(dev_priv->is_lvds_on || 
dev_priv->is_mipi_on)) {
-               runtime_allowed ++;
-       }
-       if((runtime_allowed == 1) && (dev_priv->is_lvds_on || 
dev_priv->is_mipi_on)) {
-               runtime_allowed ++;
-               pm_runtime_allow(&dev->pdev->dev);
-               dev_priv->rpm_enabled = 1;
+       if(IS_MRST(dev)){
+               if(drm_psb_ospm && !runtime_allowed && !(dev_priv->is_lvds_on 
|| dev_priv->is_mipi_on)) {
+                       runtime_allowed ++;
+               }
+               if((runtime_allowed == 1) && (dev_priv->is_lvds_on || 
dev_priv->is_mipi_on)) {
+                       runtime_allowed ++;
+                       pm_runtime_allow(&dev->pdev->dev);
+                       dev_priv->rpm_enabled = 1;
+               }
        }
-
        /*
         * The driver private ioctls and TTM ioctls should be
         * thread-safe.
diff --git a/drivers/staging/mrst/drv/psb_intel_display2.c 
b/drivers/staging/mrst/drv/psb_intel_display2.c
index e4e8017..e5decc1 100644
--- a/drivers/staging/mrst/drv/psb_intel_display2.c
+++ b/drivers/staging/mrst/drv/psb_intel_display2.c
@@ -36,7 +36,7 @@
 extern int allow_runtime_pm;
 extern struct drm_device *gpDrmDevice;
 extern void mdfld_save_display(struct drm_device *dev);
-
+extern bool gbgfxsuspended;
 
 /* MDFLD_PLATFORM start */
 void mdfldWaitForPipeDisable(struct drm_device *dev, int pipe)
@@ -554,6 +554,14 @@ static void mdfld_crtc_dpms(struct drm_crtc *crtc, int 
mode)
 
        PSB_DEBUG_ENTRY("mode = %d, pipe = %d \n", mode, pipe);
 
+       /* Ignore if system is already in DSR and in suspended state. */
+       if(gbgfxsuspended){
+                if(allow_runtime_pm && pipe == 1){
+                        dev_priv->is_mipi_on = false;
+                        pm_request_idle(&gpDrmDevice->pdev->dev);
+                }
+               return;
+       }
 /* FIXME_JLIU7 MDFLD_PO replaced w/ the following function */
 /* mdfld_dbi_dpms (struct drm_device *dev, int pipe, bool enabled) */
 
@@ -809,7 +817,7 @@ static void mdfld_crtc_dpms(struct drm_crtc *crtc, int mode)
                //Runtime PM
                 if(allow_runtime_pm && pipe == 1){
                         dev_priv->is_mipi_on = false;
-                        //pm_request_idle(&gpDrmDevice->pdev->dev);
+                        pm_request_idle(&gpDrmDevice->pdev->dev);
                 }
 #endif
 
diff --git a/drivers/staging/mrst/drv/psb_powermgmt.c 
b/drivers/staging/mrst/drv/psb_powermgmt.c
index 3abf30f..fc2185b 100644
--- a/drivers/staging/mrst/drv/psb_powermgmt.c
+++ b/drivers/staging/mrst/drv/psb_powermgmt.c
@@ -61,6 +61,8 @@ int allow_runtime_pm = 0;
 void ospm_power_island_up(int hw_islands);
 void ospm_power_island_down(int hw_islands);
 static bool gbSuspended = false;
+bool gbgfxsuspended = false;
+
 #if 1
 static int ospm_runtime_check_msvdx_hw_busy(struct drm_device *dev)
 {
@@ -1249,7 +1251,7 @@ static int mdfld_restore_display_registers(struct 
drm_device *dev, int pipe)
         REG_WRITE(device_ready_reg, temp);
         mdelay(1);
 
-#if 0
+#if 1
 
        /*send exit_sleep_mode DCS*/
        ret = mdfld_dsi_dbi_send_dcs(dsi_output, exit_sleep_mode, NULL, 0, 
CMD_DATA_SRC_SYSTEM_MEM);
@@ -1287,7 +1289,7 @@ static int mdfld_restore_display_registers(struct 
drm_device *dev, int pipe)
                return -EINVAL;
        }
 
-#if 0
+#if 1
        /*send set_display_on DCS*/
        ret = mdfld_dsi_dbi_send_dcs(dsi_output, set_display_on, NULL, 0, 
CMD_DATA_SRC_SYSTEM_MEM);
        if(ret) {
@@ -1367,15 +1369,17 @@ static int 
mdfld_restore_cursor_overlay_registers(struct drm_device *dev)
  */
 void mdfld_save_display(struct drm_device *dev)
 {
+       if(!bindsr){
+
 #ifdef OSPM_GFX_DPK
        printk(KERN_ALERT "ospm_save_display\n");
 #endif
+               mdfld_save_cursor_overlay_registers(dev);
 
-       mdfld_save_cursor_overlay_registers(dev);
-
-       mdfld_save_display_registers(dev, 0);
+               mdfld_save_display_registers(dev, 0);
 
-       mdfld_save_display_registers(dev, 2);
+               mdfld_save_display_registers(dev, 2);
+       }
 }
 /*
  * powermgmt_suspend_display
@@ -1399,6 +1403,9 @@ void ospm_suspend_display(struct drm_device *dev)
         u32 device_ready_reg = DEVICE_READY_REG;
         u32 mipi_reg = MIPI;
 
+#ifdef OSPM_GFX_DPK
+       printk(KERN_ALERT "%s \n", __func__);
+#endif
        if (!(g_hw_power_status_mask & OSPM_DISPLAY_ISLAND))
                return;
 
@@ -1416,10 +1423,10 @@ void ospm_suspend_display(struct drm_device *dev)
                mdfld_save_cursor_overlay_registers(dev);
 
                 //Runtime PM
-                if(dev_priv->is_mipi_on)
+//                if(dev_priv->is_mipi_on)
                         mdfld_save_cursor_overlay_registers(dev);
 
-               if(dev_priv->is_mipi_on){
+//             if(dev_priv->is_mipi_on){
                        mdfld_save_display_registers(dev, 0);
 //Put the panel in ULPS mode; don't turn OFF during S0ix.
 #if 0
@@ -1427,11 +1434,11 @@ void ospm_suspend_display(struct drm_device *dev)
                                DRM_ERROR("%s, can't disable dbi_0 panel. \n", 
__FUNCTION__);
 #endif
                        
-               }
+//             }
 
                mdfld_disable_crtc (dev, 0);
 
-               if(dev_priv->is_mipi_on){
+//             if(dev_priv->is_mipi_on){
                        mdfld_save_display_registers(dev, 2);
 //Put the panel in ULPS mode; don't turn OFF during S0ix.
 #if 0
@@ -1439,7 +1446,7 @@ void ospm_suspend_display(struct drm_device *dev)
                                DRM_ERROR("%s, can't disable dbi_2 panel. \n", 
__FUNCTION__);
 #endif
 
-               }
+//             }
 
                mdfld_disable_crtc (dev, 2);
 
@@ -1532,6 +1539,9 @@ void ospm_resume_display(struct pci_dev *pdev)
        struct drm_psb_private *dev_priv = dev->dev_private;
        struct psb_gtt *pg = dev_priv->pg;
 
+#ifdef OSPM_GFX_DPK
+       printk(KERN_ALERT "%s \n", __func__);
+#endif
        if (g_hw_power_status_mask & OSPM_DISPLAY_ISLAND)
                return;
 
@@ -1622,6 +1632,7 @@ static void ospm_suspend_pci(struct pci_dev *pdev)
        pci_set_power_state(pdev, PCI_D3hot);
 
        gbSuspended = true;
+       gbgfxsuspended = true;
 }
 
 /*
diff --git a/drivers/staging/mrst/drv/tpo_cmd.c 
b/drivers/staging/mrst/drv/tpo_cmd.c
index 27b5b6a..e3218b5 100644
--- a/drivers/staging/mrst/drv/tpo_cmd.c
+++ b/drivers/staging/mrst/drv/tpo_cmd.c
@@ -30,6 +30,8 @@
 #include "displays/tpo_cmd.h"
 #include "mdfld_dsi_dbi.h"
 #include "mdfld_dsi_dbi_dpu.h"
+extern bool gbgfxsuspended;
+extern bool bindsr;
 
 static struct drm_display_mode*
 tpo_cmd_get_config_mode(struct drm_device* dev)
@@ -388,12 +390,29 @@ static void mdfld_dsi_dbi_commit(struct drm_encoder * 
encoder)
 
 static void mdfld_dsi_dbi_dpms(struct drm_encoder *encoder, int mode)
 {
+       struct mdfld_dsi_encoder * dsi_encoder = MDFLD_DSI_ENCODER(encoder);
+       struct mdfld_dsi_dbi_output * dbi_output = 
MDFLD_DSI_DBI_OUTPUT(dsi_encoder);
+       struct drm_device * dev = dbi_output->dev;
+       static bool bdispoff = false;
+
        PSB_DEBUG_ENTRY("%s \n",  (mode == DRM_MODE_DPMS_ON ? "on":"off"));
 
-       if (mode == DRM_MODE_DPMS_ON)
+
+       if (mode == DRM_MODE_DPMS_ON){
+#if 1
+               if(gbgfxsuspended && bdispoff){
+                       mdfld_dsi_dbi_exit_dsr (dev, MDFLD_DSR_2D_3D);
+                       bdispoff = false;
+                       gbgfxsuspended = false;
+               }
+#endif
                mdfld_dsi_dbi_set_power(encoder, true);
-       else
+       }
+       else{
+               bdispoff = true;
+               bindsr = true; //allow runtime pm
                mdfld_dsi_dbi_set_power(encoder, false);
+       }
 }
 
 
-- 
1.7.1

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to