aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/omap2/dss/manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/omap2/dss/manager.c')
-rw-r--r--drivers/video/omap2/dss/manager.c59
1 files changed, 14 insertions, 45 deletions
diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
index 9aeea50e33f..18a1b9286c4 100644
--- a/drivers/video/omap2/dss/manager.c
+++ b/drivers/video/omap2/dss/manager.c
@@ -416,8 +416,6 @@ struct overlay_cache_data {
416 enum omap_burst_size burst_size; 416 enum omap_burst_size burst_size;
417 u32 fifo_low; 417 u32 fifo_low;
418 u32 fifo_high; 418 u32 fifo_high;
419
420 bool manual_update;
421}; 419};
422 420
423struct manager_cache_data { 421struct manager_cache_data {
@@ -437,7 +435,6 @@ struct manager_cache_data {
437 435
438 bool alpha_enabled; 436 bool alpha_enabled;
439 437
440 bool manual_upd_display;
441 bool manual_update; 438 bool manual_update;
442 bool do_manual_update; 439 bool do_manual_update;
443 440
@@ -539,24 +536,15 @@ static int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
539 if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 536 if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
540 return 0; 537 return 0;
541 538
539 if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE)
540 return 0;
541
542 if (dssdev->type == OMAP_DISPLAY_TYPE_VENC 542 if (dssdev->type == OMAP_DISPLAY_TYPE_VENC
543 || dssdev->type == OMAP_DISPLAY_TYPE_HDMI) { 543 || dssdev->type == OMAP_DISPLAY_TYPE_HDMI) {
544 irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN; 544 irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN;
545 } else { 545 } else {
546 if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) { 546 irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
547 enum omap_dss_update_mode mode; 547 DISPC_IRQ_VSYNC : DISPC_IRQ_VSYNC2;
548 mode = dssdev->driver->get_update_mode(dssdev);
549 if (mode != OMAP_DSS_UPDATE_AUTO)
550 return 0;
551
552 irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
553 DISPC_IRQ_FRAMEDONE
554 : DISPC_IRQ_FRAMEDONE2;
555 } else {
556 irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
557 DISPC_IRQ_VSYNC
558 : DISPC_IRQ_VSYNC2;
559 }
560 } 548 }
561 549
562 mc = &dss_cache.manager_cache[mgr->id]; 550 mc = &dss_cache.manager_cache[mgr->id];
@@ -617,24 +605,15 @@ int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl)
617 if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 605 if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
618 return 0; 606 return 0;
619 607
608 if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE)
609 return 0;
610
620 if (dssdev->type == OMAP_DISPLAY_TYPE_VENC 611 if (dssdev->type == OMAP_DISPLAY_TYPE_VENC
621 || dssdev->type == OMAP_DISPLAY_TYPE_HDMI) { 612 || dssdev->type == OMAP_DISPLAY_TYPE_HDMI) {
622 irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN; 613 irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN;
623 } else { 614 } else {
624 if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) { 615 irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
625 enum omap_dss_update_mode mode; 616 DISPC_IRQ_VSYNC : DISPC_IRQ_VSYNC2;
626 mode = dssdev->driver->get_update_mode(dssdev);
627 if (mode != OMAP_DSS_UPDATE_AUTO)
628 return 0;
629
630 irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
631 DISPC_IRQ_FRAMEDONE
632 : DISPC_IRQ_FRAMEDONE2;
633 } else {
634 irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
635 DISPC_IRQ_VSYNC
636 : DISPC_IRQ_VSYNC2;
637 }
638 } 617 }
639 618
640 oc = &dss_cache.overlay_cache[ovl->id]; 619 oc = &dss_cache.overlay_cache[ovl->id];
@@ -763,7 +742,7 @@ static int configure_overlay(enum omap_plane plane)
763 orig_outw = outw; 742 orig_outw = outw;
764 orig_outh = outh; 743 orig_outh = outh;
765 744
766 if (c->manual_update && mc->do_manual_update) { 745 if (mc->manual_update && mc->do_manual_update) {
767 unsigned bpp; 746 unsigned bpp;
768 unsigned scale_x_m = w, scale_x_d = outw; 747 unsigned scale_x_m = w, scale_x_d = outw;
769 unsigned scale_y_m = h, scale_y_d = outh; 748 unsigned scale_y_m = h, scale_y_d = outh;
@@ -928,7 +907,7 @@ static int configure_dispc(void)
928 if (!oc->dirty) 907 if (!oc->dirty)
929 continue; 908 continue;
930 909
931 if (oc->manual_update && !mc->do_manual_update) 910 if (mc->manual_update && !mc->do_manual_update)
932 continue; 911 continue;
933 912
934 if (mgr_busy[oc->channel]) { 913 if (mgr_busy[oc->channel]) {
@@ -976,7 +955,7 @@ static int configure_dispc(void)
976 /* We don't need GO with manual update display. LCD iface will 955 /* We don't need GO with manual update display. LCD iface will
977 * always be turned off after frame, and new settings will be 956 * always be turned off after frame, and new settings will be
978 * taken in to use at next update */ 957 * taken in to use at next update */
979 if (!mc->manual_upd_display) 958 if (!mc->manual_update)
980 dispc_go(i); 959 dispc_go(i);
981 } 960 }
982 961
@@ -1302,11 +1281,6 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
1302 1281
1303 oc->enabled = true; 1282 oc->enabled = true;
1304 1283
1305 oc->manual_update =
1306 dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE &&
1307 dssdev->driver->get_update_mode(dssdev) !=
1308 OMAP_DSS_UPDATE_AUTO;
1309
1310 ++num_planes_enabled; 1284 ++num_planes_enabled;
1311 } 1285 }
1312 1286
@@ -1341,13 +1315,8 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
1341 mc->trans_enabled = mgr->info.trans_enabled; 1315 mc->trans_enabled = mgr->info.trans_enabled;
1342 mc->alpha_enabled = mgr->info.alpha_enabled; 1316 mc->alpha_enabled = mgr->info.alpha_enabled;
1343 1317
1344 mc->manual_upd_display =
1345 dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
1346
1347 mc->manual_update = 1318 mc->manual_update =
1348 dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE && 1319 dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
1349 dssdev->driver->get_update_mode(dssdev) !=
1350 OMAP_DSS_UPDATE_AUTO;
1351 } 1320 }
1352 1321
1353 /* XXX TODO: Try to get fifomerge working. The problem is that it 1322 /* XXX TODO: Try to get fifomerge working. The problem is that it