diff mbox

[1/5] drm/tilcdc: Restore old dmps state in pm_resume()

Message ID 8eeaaba403a3f3d830bb3e70357f18c599b17381.1465904170.git.jsarha@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jyri Sarha June 14, 2016, 11:45 a.m. UTC
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().

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 | 7 +++++++
 drivers/gpu/drm/tilcdc/tilcdc_drv.c  | 3 +++
 drivers/gpu/drm/tilcdc/tilcdc_drv.h  | 2 ++
 3 files changed, 12 insertions(+)

Comments

Tomi Valkeinen June 14, 2016, 11:48 a.m. UTC | #1
On 14/06/16 14:45, Jyri Sarha wrote:
> 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().
> 
> Fixes commit 614b3cfeb8d2 ("drm/tilcdc: disable the lcd controller/dma
> engine when suspend invoked")

"dmps" in the subject.

It would be good to mention what the problem seen is, what does this fix.

 Tomi
Daniel Vetter June 14, 2016, 4:22 p.m. UTC | #2
On Tue, Jun 14, 2016 at 02:48:44PM +0300, Tomi Valkeinen wrote:
> On 14/06/16 14:45, Jyri Sarha wrote:
> > 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().
> > 
> > Fixes commit 614b3cfeb8d2 ("drm/tilcdc: disable the lcd controller/dma
> > engine when suspend invoked")
> 
> "dmps" in the subject.
> 
> It would be good to mention what the problem seen is, what does this fix.

With atomic you get this all for free, using
drm_atomic_helper_suspend/resume ...
-Daniel
diff mbox

Patch

diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
index 79027b1..4d8f9a5 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
@@ -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)
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index 308e197..148b1ed 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -598,6 +598,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: */
@@ -628,6 +629,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;
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.h b/drivers/gpu/drm/tilcdc/tilcdc_drv.h
index c1de18b..3b52ce8 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.h
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.h
@@ -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__ */