Add kernel Hibernation code for porter board.
[AGL/meta-agl.git] / meta-agl-bsp / meta-renesas / recipes-kernel / linux / linux / hibernation / 0006-Add-rcar-du-hibernation-code.patch
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
5
6 Signed-off-by: Yuichi Kusakabe <yuichi.kusakabe@jp.fujitsu.com>
7 ---
8  drivers/gpu/drm/rcar-du/rcar_du_drv.c | 68 ++++++++++++++++++++++++++++++++++-
9  1 file changed, 67 insertions(+), 1 deletion(-)
10
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)
16  
17         drm_kms_helper_poll_disable(rcdu->ddev);
18  
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);
26 +       }
27 +#else
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)
32                                                  DRM_MODE_DPMS_OFF);
33         }
34  #endif
35 +#endif
36 +
37  #ifdef CONFIG_DRM_RCAR_LVDS
38         for (i = 0; i < rcdu->info->num_lvds; ++i) {
39                 if (rcdu->lvds[i])
40 @@ -483,6 +494,15 @@ static int rcar_du_pm_resume(struct device *dev)
41         }
42  #endif
43  
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,
50 +                                                DRM_MODE_DPMS_ON);
51 +       }
52 +#else
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)
57                                                  DRM_MODE_DPMS_ON);
58         }
59  #endif
60 +#endif
61         drm_kms_helper_poll_enable(rcdu->ddev);
62  
63         return 0;
64  }
65 -#endif
66 +#ifdef CONFIG_MACH_FTEN
67 +static int rcar_du_pm_freeze(struct device *dev)
68 +{
69 +       int ret;
70 +
71 +       ret = rcar_du_pm_suspend(dev);
72 +       return ret;
73 +}
74 +
75 +static int rcar_du_pm_thaw(struct device *dev)
76 +{
77 +       int ret;
78  
79 +       ret = rcar_du_pm_resume(dev);
80 +       return ret;
81 +}
82 +
83 +static int rcar_du_pm_restore(struct device *dev)
84 +{
85 +       int i, ret;
86 +       struct rcar_du_device *rcdu = dev_get_drvdata(dev);
87 +
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);
92 +       return ret;
93 +}
94 +#endif
95 +#endif
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,
105 +#else
106         SET_SYSTEM_SLEEP_PM_OPS(rcar_du_pm_suspend, rcar_du_pm_resume)
107 +#endif
108  };
109  
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,
114                 },
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,
120 +               },
121 +#endif
122         },
123         .num_lvds = 1,
124         .drgbs_bit = 1,
125 -- 
126 1.8.3.1
127