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
