aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/rcar-du
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2015-02-20 07:05:21 -0500
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2015-03-03 09:16:16 -0500
commit58706b88c4a8f7423be3e521b457fdb88516aa30 (patch)
tree9845ccf60b832022455a5f1b46cbf25f23fdd820 /drivers/gpu/drm/rcar-du
parentf6638b6abc298a9d4a13492a4d918e3c4ced3109 (diff)
drm: rcar-du: Rework HDMI encoder enable/disable for atomic updates
When using atomic updates the encoder .enable() and .disable() helper operations are preferred over the (then legacy) .prepare() and .commit() operations. Implement .enable() and .disable() and rework .prepare(), .commit() and .dpms() as wrappers around .enable() and .disable(), easing their future removal. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Diffstat (limited to 'drivers/gpu/drm/rcar-du')
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c48
1 files changed, 35 insertions, 13 deletions
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
index 89a7c0ecc935..04e21b5f96d4 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
@@ -26,35 +26,54 @@
26struct rcar_du_hdmienc { 26struct rcar_du_hdmienc {
27 struct rcar_du_encoder *renc; 27 struct rcar_du_encoder *renc;
28 struct device *dev; 28 struct device *dev;
29 int dpms; 29 bool enabled;
30}; 30};
31 31
32#define to_rcar_hdmienc(e) (to_rcar_encoder(e)->hdmi) 32#define to_rcar_hdmienc(e) (to_rcar_encoder(e)->hdmi)
33#define to_slave_funcs(e) (to_rcar_encoder(e)->slave.slave_funcs) 33#define to_slave_funcs(e) (to_rcar_encoder(e)->slave.slave_funcs)
34 34
35static void rcar_du_hdmienc_dpms(struct drm_encoder *encoder, int mode) 35static void rcar_du_hdmienc_disable(struct drm_encoder *encoder)
36{ 36{
37 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder); 37 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
38 struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder); 38 struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);
39 39
40 if (mode != DRM_MODE_DPMS_ON) 40 if (sfuncs->dpms)
41 mode = DRM_MODE_DPMS_OFF; 41 sfuncs->dpms(encoder, DRM_MODE_DPMS_OFF);
42 42
43 if (hdmienc->dpms == mode) 43 if (hdmienc->renc->lvds)
44 return; 44 rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc,
45 false);
46
47 hdmienc->enabled = false;
48}
49
50static void rcar_du_hdmienc_enable(struct drm_encoder *encoder)
51{
52 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
53 struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);
45 54
46 if (mode == DRM_MODE_DPMS_ON && hdmienc->renc->lvds) 55 if (hdmienc->renc->lvds)
47 rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc, 56 rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc,
48 true); 57 true);
49 58
50 if (sfuncs->dpms) 59 if (sfuncs->dpms)
51 sfuncs->dpms(encoder, mode); 60 sfuncs->dpms(encoder, DRM_MODE_DPMS_ON);
52 61
53 if (mode != DRM_MODE_DPMS_ON && hdmienc->renc->lvds) 62 hdmienc->enabled = true;
54 rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc, 63}
55 false);
56 64
57 hdmienc->dpms = mode; 65static void rcar_du_hdmienc_dpms(struct drm_encoder *encoder, int mode)
66{
67 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
68 bool enable = mode == DRM_MODE_DPMS_ON;
69
70 if (hdmienc->enabled == enable)
71 return;
72
73 if (enable)
74 rcar_du_hdmienc_enable(encoder);
75 else
76 rcar_du_hdmienc_disable(encoder);
58} 77}
59 78
60static bool rcar_du_hdmienc_mode_fixup(struct drm_encoder *encoder, 79static bool rcar_du_hdmienc_mode_fixup(struct drm_encoder *encoder,
@@ -106,13 +125,16 @@ static const struct drm_encoder_helper_funcs encoder_helper_funcs = {
106 .prepare = rcar_du_hdmienc_mode_prepare, 125 .prepare = rcar_du_hdmienc_mode_prepare,
107 .commit = rcar_du_hdmienc_mode_commit, 126 .commit = rcar_du_hdmienc_mode_commit,
108 .mode_set = rcar_du_hdmienc_mode_set, 127 .mode_set = rcar_du_hdmienc_mode_set,
128 .disable = rcar_du_hdmienc_disable,
129 .enable = rcar_du_hdmienc_enable,
109}; 130};
110 131
111static void rcar_du_hdmienc_cleanup(struct drm_encoder *encoder) 132static void rcar_du_hdmienc_cleanup(struct drm_encoder *encoder)
112{ 133{
113 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder); 134 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
114 135
115 rcar_du_hdmienc_dpms(encoder, DRM_MODE_DPMS_OFF); 136 if (hdmienc->enabled)
137 rcar_du_hdmienc_disable(encoder);
116 138
117 drm_encoder_cleanup(encoder); 139 drm_encoder_cleanup(encoder);
118 put_device(hdmienc->dev); 140 put_device(hdmienc->dev);