aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2012-09-05 07:09:33 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2012-09-07 13:02:13 -0400
commitb82fe7f025183897880771dd7cdf725ecc148ff2 (patch)
treec780a0d02442250f3c63f285930065d14268756e
parent66a0f9e4ac46144fb86ebe90f58ce6f416a55cd5 (diff)
OMAPDSS: fix set_timings
set_timings function of DSS's output drivers are not consistent. Some of them disable the output, set the timings, and re-enable the output. Some set the timings on the fly, while the output is enabled. And some just store the given timings, so that they will be taken into use next time the output is enabled. We require the DISPC output to be disabled when changing the timings, and so we can change all the output drivers' set_timings to just store the given timings. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
-rw-r--r--drivers/video/omap2/dss/display.c4
-rw-r--r--drivers/video/omap2/dss/dpi.c14
-rw-r--r--drivers/video/omap2/dss/hdmi.c12
-rw-r--r--drivers/video/omap2/dss/sdi.c10
-rw-r--r--drivers/video/omap2/dss/venc.c13
5 files changed, 4 insertions, 49 deletions
diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c
index 5bd957e85505..5f09d503d619 100644
--- a/drivers/video/omap2/dss/display.c
+++ b/drivers/video/omap2/dss/display.c
@@ -142,7 +142,11 @@ static ssize_t display_timings_store(struct device *dev,
142 if (r) 142 if (r)
143 return r; 143 return r;
144 144
145 dssdev->driver->disable(dssdev);
145 dssdev->driver->set_timings(dssdev, &t); 146 dssdev->driver->set_timings(dssdev, &t);
147 r = dssdev->driver->enable(dssdev);
148 if (r)
149 return r;
146 150
147 return size; 151 return size;
148} 152}
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
index 99b9851f8429..5ccce9b69e42 100644
--- a/drivers/video/omap2/dss/dpi.c
+++ b/drivers/video/omap2/dss/dpi.c
@@ -277,26 +277,12 @@ EXPORT_SYMBOL(omapdss_dpi_display_disable);
277void omapdss_dpi_set_timings(struct omap_dss_device *dssdev, 277void omapdss_dpi_set_timings(struct omap_dss_device *dssdev,
278 struct omap_video_timings *timings) 278 struct omap_video_timings *timings)
279{ 279{
280 int r;
281
282 DSSDBG("dpi_set_timings\n"); 280 DSSDBG("dpi_set_timings\n");
283 281
284 mutex_lock(&dpi.lock); 282 mutex_lock(&dpi.lock);
285 283
286 dpi.timings = *timings; 284 dpi.timings = *timings;
287 285
288 if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
289 r = dispc_runtime_get();
290 if (r)
291 return;
292
293 dpi_set_mode(dssdev);
294
295 dispc_runtime_put();
296 } else {
297 dss_mgr_set_timings(dssdev->manager, timings);
298 }
299
300 mutex_unlock(&dpi.lock); 286 mutex_unlock(&dpi.lock);
301} 287}
302EXPORT_SYMBOL(omapdss_dpi_set_timings); 288EXPORT_SYMBOL(omapdss_dpi_set_timings);
diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c
index ccfc677c910a..83f18458a406 100644
--- a/drivers/video/omap2/dss/hdmi.c
+++ b/drivers/video/omap2/dss/hdmi.c
@@ -632,18 +632,6 @@ void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev,
632 if (t != NULL) 632 if (t != NULL)
633 hdmi.ip_data.cfg = *t; 633 hdmi.ip_data.cfg = *t;
634 634
635 if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
636 int r;
637
638 hdmi_power_off(dssdev);
639
640 r = hdmi_power_on(dssdev);
641 if (r)
642 DSSERR("failed to power on device\n");
643 } else {
644 dss_mgr_set_timings(dssdev->manager, &t->timings);
645 }
646
647 mutex_unlock(&hdmi.lock); 635 mutex_unlock(&hdmi.lock);
648} 636}
649 637
diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c
index 3bf1bfe29585..c87e07ebb16d 100644
--- a/drivers/video/omap2/dss/sdi.c
+++ b/drivers/video/omap2/dss/sdi.c
@@ -152,17 +152,7 @@ EXPORT_SYMBOL(omapdss_sdi_display_disable);
152void omapdss_sdi_set_timings(struct omap_dss_device *dssdev, 152void omapdss_sdi_set_timings(struct omap_dss_device *dssdev,
153 struct omap_video_timings *timings) 153 struct omap_video_timings *timings)
154{ 154{
155 int r;
156
157 sdi.timings = *timings; 155 sdi.timings = *timings;
158
159 if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
160 omapdss_sdi_display_disable(dssdev);
161
162 r = omapdss_sdi_display_enable(dssdev);
163 if (r)
164 DSSERR("failed to set new timings\n");
165 }
166} 156}
167EXPORT_SYMBOL(omapdss_sdi_set_timings); 157EXPORT_SYMBOL(omapdss_sdi_set_timings);
168 158
diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
index 45252cf034b3..17b31029a793 100644
--- a/drivers/video/omap2/dss/venc.c
+++ b/drivers/video/omap2/dss/venc.c
@@ -564,19 +564,6 @@ void omapdss_venc_set_timings(struct omap_dss_device *dssdev,
564 564
565 venc.timings = *timings; 565 venc.timings = *timings;
566 566
567 if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
568 int r;
569
570 /* turn the venc off and on to get new timings to use */
571 venc_power_off(dssdev);
572
573 r = venc_power_on(dssdev);
574 if (r)
575 DSSERR("failed to power on VENC\n");
576 } else {
577 dss_mgr_set_timings(dssdev->manager, timings);
578 }
579
580 mutex_unlock(&venc.venc_lock); 567 mutex_unlock(&venc.venc_lock);
581} 568}
582 569