aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2015-05-27 19:34:05 -0400
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2015-06-12 15:52:50 -0400
commit4029755e2a411c72f32b60b37ca8861f21647139 (patch)
tree25b074fc88d9b0cf14d2eba64197a69a5cd892be
parent69fb7c855c7bd4b4bc3fd6bec0885236365d5261 (diff)
drm: omapdrm: Move encoder setup to encoder operations
Now that the driver is fully converted to atomic operations, and that the atomic helpers call the operations in the right order, we can move encoder setup to where it belongs, in the encoder operations. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
-rw-r--r--drivers/gpu/drm/omapdrm/omap_crtc.c38
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.h6
-rw-r--r--drivers/gpu/drm/omapdrm/omap_encoder.c79
3 files changed, 34 insertions, 89 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 3a5e68a06af3..2236f52f8bc3 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -35,7 +35,6 @@ struct omap_crtc {
35 35
36 const char *name; 36 const char *name;
37 enum omap_channel channel; 37 enum omap_channel channel;
38 struct drm_encoder *current_encoder;
39 38
40 /* 39 /*
41 * Temporary: eventually this will go away, but it is needed 40 * Temporary: eventually this will go away, but it is needed
@@ -70,7 +69,7 @@ uint32_t pipe2vbl(struct drm_crtc *crtc)
70 return dispc_mgr_get_vsync_irq(omap_crtc->channel); 69 return dispc_mgr_get_vsync_irq(omap_crtc->channel);
71} 70}
72 71
73const struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc) 72struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc)
74{ 73{
75 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 74 struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
76 return &omap_crtc->timings; 75 return &omap_crtc->timings;
@@ -125,7 +124,7 @@ static void omap_crtc_dss_start_update(struct omap_overlay_manager *mgr)
125{ 124{
126} 125}
127 126
128/* Called only from omap_crtc_encoder_setup and suspend/resume handlers. */ 127/* Called only from the encoder enable/disable and suspend/resume handlers. */
129static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable) 128static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
130{ 129{
131 struct drm_device *dev = crtc->dev; 130 struct drm_device *dev = crtc->dev;
@@ -365,37 +364,6 @@ static int omap_crtc_flush(struct drm_crtc *crtc)
365 return 0; 364 return 0;
366} 365}
367 366
368static void omap_crtc_encoder_setup(struct drm_crtc *crtc, bool enable)
369{
370 struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
371 struct omap_drm_private *priv = crtc->dev->dev_private;
372 struct drm_encoder *encoder = NULL;
373 unsigned int i;
374
375 DBG("%s: enable=%d", omap_crtc->name, enable);
376
377 for (i = 0; i < priv->num_encoders; i++) {
378 if (priv->encoders[i]->crtc == crtc) {
379 encoder = priv->encoders[i];
380 break;
381 }
382 }
383
384 if (omap_crtc->current_encoder && encoder != omap_crtc->current_encoder)
385 omap_encoder_set_enabled(omap_crtc->current_encoder, false);
386
387 omap_crtc->current_encoder = encoder;
388
389 if (encoder) {
390 omap_encoder_set_enabled(encoder, false);
391 if (enable) {
392 omap_encoder_update(encoder, omap_crtc->mgr,
393 &omap_crtc->timings);
394 omap_encoder_set_enabled(encoder, true);
395 }
396 }
397}
398
399/* ----------------------------------------------------------------------------- 367/* -----------------------------------------------------------------------------
400 * CRTC Functions 368 * CRTC Functions
401 */ 369 */
@@ -437,7 +405,6 @@ static void omap_crtc_enable(struct drm_crtc *crtc)
437 WARN_ON(omap_plane_setup(plane)); 405 WARN_ON(omap_plane_setup(plane));
438 } 406 }
439 407
440 omap_crtc_encoder_setup(crtc, true);
441 omap_crtc_flush(crtc); 408 omap_crtc_flush(crtc);
442 409
443 drm_crtc_vblank_on(crtc); 410 drm_crtc_vblank_on(crtc);
@@ -462,7 +429,6 @@ static void omap_crtc_disable(struct drm_crtc *crtc)
462 WARN_ON(omap_plane_setup(plane)); 429 WARN_ON(omap_plane_setup(plane));
463 } 430 }
464 431
465 omap_crtc_encoder_setup(crtc, false);
466 omap_crtc_flush(crtc); 432 omap_crtc_flush(crtc);
467} 433}
468 434
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index 81c60284bfb0..bdd54162698f 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -141,7 +141,7 @@ int omap_drm_irq_install(struct drm_device *dev);
141struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev); 141struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev);
142void omap_fbdev_free(struct drm_device *dev); 142void omap_fbdev_free(struct drm_device *dev);
143 143
144const struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc); 144struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc);
145enum omap_channel omap_crtc_channel(struct drm_crtc *crtc); 145enum omap_channel omap_crtc_channel(struct drm_crtc *crtc);
146void omap_crtc_pre_init(void); 146void omap_crtc_pre_init(void);
147void omap_crtc_pre_uninit(void); 147void omap_crtc_pre_uninit(void);
@@ -156,10 +156,6 @@ void omap_plane_install_properties(struct drm_plane *plane,
156 156
157struct drm_encoder *omap_encoder_init(struct drm_device *dev, 157struct drm_encoder *omap_encoder_init(struct drm_device *dev,
158 struct omap_dss_device *dssdev); 158 struct omap_dss_device *dssdev);
159int omap_encoder_set_enabled(struct drm_encoder *encoder, bool enabled);
160int omap_encoder_update(struct drm_encoder *encoder,
161 struct omap_overlay_manager *mgr,
162 struct omap_video_timings *timings);
163 159
164struct drm_connector *omap_connector_init(struct drm_device *dev, 160struct drm_connector *omap_connector_init(struct drm_device *dev,
165 int connector_type, struct omap_dss_device *dssdev, 161 int connector_type, struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index 54847ed089ef..7d9b32a0eb43 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -52,8 +52,6 @@ static void omap_encoder_destroy(struct drm_encoder *encoder)
52{ 52{
53 struct omap_encoder *omap_encoder = to_omap_encoder(encoder); 53 struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
54 54
55 omap_encoder_set_enabled(encoder, false);
56
57 drm_encoder_cleanup(encoder); 55 drm_encoder_cleanup(encoder);
58 kfree(omap_encoder); 56 kfree(omap_encoder);
59} 57}
@@ -93,59 +91,18 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder,
93 } 91 }
94} 92}
95 93
96/*
97 * The CRTC drm_crtc_helper_set_mode() didn't really give us the right order.
98 * The easiest way to work around this was to make all the encoder-helper's
99 * no-op's and have the omap_crtc code take care of the sequencing and call
100 * us in the right points.
101 *
102 * FIXME: Revisit this after switching to atomic updates completely.
103 */
104
105static void omap_encoder_disable(struct drm_encoder *encoder) 94static void omap_encoder_disable(struct drm_encoder *encoder)
106{ 95{
107}
108
109static void omap_encoder_enable(struct drm_encoder *encoder)
110{
111}
112
113static int omap_encoder_atomic_check(struct drm_encoder *encoder,
114 struct drm_crtc_state *crtc_state,
115 struct drm_connector_state *conn_state)
116{
117 return 0;
118}
119
120static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
121 .mode_set = omap_encoder_mode_set,
122 .disable = omap_encoder_disable,
123 .enable = omap_encoder_enable,
124 .atomic_check = omap_encoder_atomic_check,
125};
126
127/*
128 * Instead of relying on the helpers for modeset, the omap_crtc code
129 * calls these functions in the proper sequence.
130 */
131
132int omap_encoder_set_enabled(struct drm_encoder *encoder, bool enabled)
133{
134 struct omap_encoder *omap_encoder = to_omap_encoder(encoder); 96 struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
135 struct omap_dss_device *dssdev = omap_encoder->dssdev; 97 struct omap_dss_device *dssdev = omap_encoder->dssdev;
136 struct omap_dss_driver *dssdrv = dssdev->driver; 98 struct omap_dss_driver *dssdrv = dssdev->driver;
137 99
138 if (enabled) { 100 dssdrv->disable(dssdev);
139 return dssdrv->enable(dssdev);
140 } else {
141 dssdrv->disable(dssdev);
142 return 0;
143 }
144} 101}
145 102
146int omap_encoder_update(struct drm_encoder *encoder, 103static int omap_encoder_update(struct drm_encoder *encoder,
147 struct omap_overlay_manager *mgr, 104 enum omap_channel channel,
148 struct omap_video_timings *timings) 105 struct omap_video_timings *timings)
149{ 106{
150 struct drm_device *dev = encoder->dev; 107 struct drm_device *dev = encoder->dev;
151 struct omap_encoder *omap_encoder = to_omap_encoder(encoder); 108 struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
@@ -153,7 +110,7 @@ int omap_encoder_update(struct drm_encoder *encoder,
153 struct omap_dss_driver *dssdrv = dssdev->driver; 110 struct omap_dss_driver *dssdrv = dssdev->driver;
154 int ret; 111 int ret;
155 112
156 dssdev->src->manager = mgr; 113 dssdev->src->manager = omap_dss_get_overlay_manager(channel);
157 114
158 if (dssdrv->check_timings) { 115 if (dssdrv->check_timings) {
159 ret = dssdrv->check_timings(dssdev, timings); 116 ret = dssdrv->check_timings(dssdev, timings);
@@ -179,6 +136,32 @@ int omap_encoder_update(struct drm_encoder *encoder,
179 return 0; 136 return 0;
180} 137}
181 138
139static void omap_encoder_enable(struct drm_encoder *encoder)
140{
141 struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
142 struct omap_dss_device *dssdev = omap_encoder->dssdev;
143 struct omap_dss_driver *dssdrv = dssdev->driver;
144
145 omap_encoder_update(encoder, omap_crtc_channel(encoder->crtc),
146 omap_crtc_timings(encoder->crtc));
147
148 dssdrv->enable(dssdev);
149}
150
151static int omap_encoder_atomic_check(struct drm_encoder *encoder,
152 struct drm_crtc_state *crtc_state,
153 struct drm_connector_state *conn_state)
154{
155 return 0;
156}
157
158static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
159 .mode_set = omap_encoder_mode_set,
160 .disable = omap_encoder_disable,
161 .enable = omap_encoder_enable,
162 .atomic_check = omap_encoder_atomic_check,
163};
164
182/* initialize encoder */ 165/* initialize encoder */
183struct drm_encoder *omap_encoder_init(struct drm_device *dev, 166struct drm_encoder *omap_encoder_init(struct drm_device *dev,
184 struct omap_dss_device *dssdev) 167 struct omap_dss_device *dssdev)