drm/tilcdc: Restore old dpms state in pm_resume()
authorJyri Sarha <jsarha@ti.com>
Tue, 14 Jun 2016 08:43:30 +0000 (11:43 +0300)
committerJyri Sarha <jsarha@ti.com>
Mon, 8 Aug 2016 20:04:48 +0000 (23:04 +0300)
Restore old dpms state in pm_resume(). The dpms is turned off in
pm_suspend() and it should be restored to its original state in
pm_resume(). Without this patch the display is left blanked after a
suspend/resume cycle.

Fixes commit 614b3cfeb8d2 ("drm/tilcdc: disable the lcd controller/dma
engine when suspend invoked")

Signed-off-by: Jyri Sarha <jsarha@ti.com>
drivers/gpu/drm/tilcdc/tilcdc_crtc.c
drivers/gpu/drm/tilcdc/tilcdc_drv.c
drivers/gpu/drm/tilcdc/tilcdc_drv.h

index 107c8bd04f6dee0d81f63c0369b39264043e646b..1601428c9b8e0d9452252253cd4539b7e4f90fa2 100644 (file)
@@ -246,6 +246,13 @@ void tilcdc_crtc_dpms(struct drm_crtc *crtc, int mode)
        }
 }
 
+int tilcdc_crtc_current_dpms_state(struct drm_crtc *crtc)
+{
+       struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
+
+       return tilcdc_crtc->dpms;
+}
+
 static bool tilcdc_crtc_mode_fixup(struct drm_crtc *crtc,
                const struct drm_display_mode *mode,
                struct drm_display_mode *adjusted_mode)
index d27809372d54491f19534ae43fc5745c74ae1131..ed68324504f6bbc99d282eb4a305fcfa476d2013 100644 (file)
@@ -597,6 +597,7 @@ static int tilcdc_pm_suspend(struct device *dev)
        }
 
        /* Disable the LCDC controller, to avoid locking up the PRCM */
+       priv->saved_dpms_state = tilcdc_crtc_current_dpms_state(priv->crtc);
        tilcdc_crtc_dpms(priv->crtc, DRM_MODE_DPMS_OFF);
 
        /* Save register state: */
@@ -627,6 +628,8 @@ static int tilcdc_pm_resume(struct device *dev)
                                             priv->saved_register[n++]);
        }
 
+       tilcdc_crtc_dpms(priv->crtc, priv->saved_dpms_state);
+
        drm_kms_helper_poll_enable(ddev);
 
        return 0;
index c1de18bae41530df2eb1d8390b4876d60f29007a..3b52ce8ab69cbc3d5dcf54c9d907764b3fdf0cd3 100644 (file)
@@ -67,6 +67,7 @@ struct tilcdc_drm_private {
 
        /* register contents saved across suspend/resume: */
        u32 *saved_register;
+       int saved_dpms_state;
        bool ctx_valid;
 
 #ifdef CONFIG_CPU_FREQ
@@ -172,5 +173,6 @@ void tilcdc_crtc_set_simulate_vesa_sync(struct drm_crtc *crtc,
 int tilcdc_crtc_mode_valid(struct drm_crtc *crtc, struct drm_display_mode *mode);
 int tilcdc_crtc_max_width(struct drm_crtc *crtc);
 void tilcdc_crtc_dpms(struct drm_crtc *crtc, int mode);
+int tilcdc_crtc_current_dpms_state(struct drm_crtc *crtc);
 
 #endif /* __TILCDC_DRV_H__ */