]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm: rcar-du: Implement system suspend/resume support
authorKieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Fri, 15 Sep 2017 16:42:06 +0000 (17:42 +0100)
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Mon, 4 Dec 2017 11:04:11 +0000 (13:04 +0200)
To support system suspend operations we must ensure the hardware is
stopped, and resumed explicitly from the suspend and resume handlers.

Implement suspend and resume functions using the DRM atomic helper
functions.

Signed-off-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
drivers/gpu/drm/rcar-du/rcar_du_drv.c
drivers/gpu/drm/rcar-du/rcar_du_drv.h

index faa5b328986acca27783e927fc29389bb6a49228..6e02c762a5573931a5cd61cab05cfcdc1b77c1cc 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/wait.h>
 
 #include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_cma_helper.h>
@@ -309,9 +310,19 @@ static struct drm_driver rcar_du_driver = {
 static int rcar_du_pm_suspend(struct device *dev)
 {
        struct rcar_du_device *rcdu = dev_get_drvdata(dev);
+       struct drm_atomic_state *state;
 
        drm_kms_helper_poll_disable(rcdu->ddev);
-       /* TODO Suspend the CRTC */
+       drm_fbdev_cma_set_suspend_unlocked(rcdu->fbdev, true);
+
+       state = drm_atomic_helper_suspend(rcdu->ddev);
+       if (IS_ERR(state)) {
+               drm_fbdev_cma_set_suspend_unlocked(rcdu->fbdev, false);
+               drm_kms_helper_poll_enable(rcdu->ddev);
+               return PTR_ERR(state);
+       }
+
+       rcdu->suspend_state = state;
 
        return 0;
 }
@@ -320,9 +331,10 @@ static int rcar_du_pm_resume(struct device *dev)
 {
        struct rcar_du_device *rcdu = dev_get_drvdata(dev);
 
-       /* TODO Resume the CRTC */
-
+       drm_atomic_helper_resume(rcdu->ddev, rcdu->suspend_state);
+       drm_fbdev_cma_set_suspend_unlocked(rcdu->fbdev, false);
        drm_kms_helper_poll_enable(rcdu->ddev);
+
        return 0;
 }
 #endif
index f8cd79488eceeef97acae4e2a0c3a55c78e4f7aa..f400fde65a0c99fd1c546cda1e278bfa344275a2 100644 (file)
@@ -81,6 +81,7 @@ struct rcar_du_device {
 
        struct drm_device *ddev;
        struct drm_fbdev_cma *fbdev;
+       struct drm_atomic_state *suspend_state;
 
        struct rcar_du_crtc crtcs[RCAR_DU_MAX_CRTCS];
        unsigned int num_crtcs;