| From 0de8e6c848876ba932158c6e4123460a4bb9b467 Mon Sep 17 00:00:00 2001 |
| From: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> |
| Date: Fri, 15 Sep 2017 17:42:06 +0100 |
| Subject: [PATCH 0445/1795] drm: rcar-du: Implement system suspend/resume |
| support |
| |
| 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> |
| (cherry picked from commit 7912dee7775e4c7590c227b4163bdb635bc50dd6) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| --- |
| drivers/gpu/drm/rcar-du/rcar_du_drv.c | 18 +++++++++++++++--- |
| drivers/gpu/drm/rcar-du/rcar_du_drv.h | 1 + |
| 2 files changed, 16 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/rcar-du/rcar_du_drv.c |
| index faa5b328986a..6e02c762a557 100644 |
| --- a/drivers/gpu/drm/rcar-du/rcar_du_drv.c |
| +++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.c |
| @@ -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 |
| diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.h b/drivers/gpu/drm/rcar-du/rcar_du_drv.h |
| index f8cd79488ece..f400fde65a0c 100644 |
| --- a/drivers/gpu/drm/rcar-du/rcar_du_drv.h |
| +++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.h |
| @@ -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; |
| -- |
| 2.19.0 |
| |