1 From 4a9a11deb2e83549d2e77cac129f879a0000ef7e Mon Sep 17 00:00:00 2001
2 From: Yuichi Kusakabe <yuichi.kusakabe@jp.fujitsu.com>
3 Date: Thu, 18 May 2017 17:33:54 +0900
4 Subject: [PATCH 06/15] Add rcar-du hibernation code
6 Signed-off-by: Yuichi Kusakabe <yuichi.kusakabe@jp.fujitsu.com>
8 drivers/gpu/drm/rcar-du/rcar_du_drv.c | 68 ++++++++++++++++++++++++++++++++++-
9 1 file changed, 67 insertions(+), 1 deletion(-)
11 diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/rcar-du/rcar_du_drv.c
12 index 53f1f6a..fbb212c 100644
13 --- a/drivers/gpu/drm/rcar-du/rcar_du_drv.c
14 +++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.c
15 @@ -442,6 +442,15 @@ static int rcar_du_pm_suspend(struct device *dev)
17 drm_kms_helper_poll_disable(rcdu->ddev);
19 +#ifdef CONFIG_MACH_FTEN
20 + list_for_each_entry(encoder,
21 + &rcdu->ddev->mode_config.encoder_list, head) {
22 + if ((encoder->encoder_type == DRM_MODE_ENCODER_TVDAC) &&
23 + (get_rcar_slave_funcs(encoder)->dpms))
24 + get_rcar_slave_funcs(encoder)->dpms(encoder,
25 + DRM_MODE_DPMS_SUSPEND);
28 #if defined(CONFIG_DRM_ADV7511) || defined(CONFIG_DRM_ADV7511_MODULE)
29 list_for_each_entry(encoder,
30 &rcdu->ddev->mode_config.encoder_list, head) {
31 @@ -451,6 +460,8 @@ static int rcar_du_pm_suspend(struct device *dev)
37 #ifdef CONFIG_DRM_RCAR_LVDS
38 for (i = 0; i < rcdu->info->num_lvds; ++i) {
40 @@ -483,6 +494,15 @@ static int rcar_du_pm_resume(struct device *dev)
44 +#ifdef CONFIG_MACH_FTEN
45 + list_for_each_entry(encoder,
46 + &rcdu->ddev->mode_config.encoder_list, head) {
47 + if ((encoder->encoder_type == DRM_MODE_ENCODER_TVDAC) &&
48 + (get_rcar_slave_funcs(encoder)->dpms))
49 + get_rcar_slave_funcs(encoder)->dpms(encoder,
53 #if defined(CONFIG_DRM_ADV7511) || defined(CONFIG_DRM_ADV7511_MODULE)
54 list_for_each_entry(encoder,
55 &rcdu->ddev->mode_config.encoder_list, head) {
56 @@ -492,14 +512,53 @@ static int rcar_du_pm_resume(struct device *dev)
61 drm_kms_helper_poll_enable(rcdu->ddev);
66 +#ifdef CONFIG_MACH_FTEN
67 +static int rcar_du_pm_freeze(struct device *dev)
71 + ret = rcar_du_pm_suspend(dev);
75 +static int rcar_du_pm_thaw(struct device *dev)
79 + ret = rcar_du_pm_resume(dev);
83 +static int rcar_du_pm_restore(struct device *dev)
86 + struct rcar_du_device *rcdu = dev_get_drvdata(dev);
88 + ret = rcar_du_pm_resume(dev);
89 + for (i = 0; i < rcdu->pdata->num_crtcs; ++i)
90 + rcar_du_crtc_enable_vblank(&rcdu->crtcs[i],
91 + rcdu->crtcs[i].vblank_enable);
96 static const struct dev_pm_ops rcar_du_pm_ops = {
97 +#if defined(CONFIG_MACH_FTEN) && defined(CONFIG_HIBERNATION) && \
98 + defined(CONFIG_PM_SLEEP)
99 + .suspend = rcar_du_pm_suspend,
100 + .resume = rcar_du_pm_resume,
101 + .freeze = rcar_du_pm_freeze,
102 + .thaw = rcar_du_pm_thaw,
103 + .poweroff = rcar_du_pm_suspend,
104 + .restore = rcar_du_pm_restore,
106 SET_SYSTEM_SLEEP_PM_OPS(rcar_du_pm_suspend, rcar_du_pm_resume)
110 /* -----------------------------------------------------------------------------
111 @@ -620,6 +679,13 @@ static const struct rcar_du_device_info rcar_du_r8a7791_info = {
112 .possible_clones = 0,
113 .encoder_type = DRM_MODE_ENCODER_NONE,
115 +#if defined(CONFIG_MACH_FTEN)
116 + [RCAR_DU_OUTPUT_COMPOSITE] = {
117 + .possible_crtcs = BIT(1),
118 + .possible_clones = 0,
119 + .encoder_type = DRM_MODE_ENCODER_TVDAC,