diff options
Diffstat (limited to 'drivers/video/omap2/dss')
-rw-r--r-- | drivers/video/omap2/dss/apply.c | 84 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dss.h | 8 | ||||
-rw-r--r-- | drivers/video/omap2/dss/overlay.c | 96 |
3 files changed, 98 insertions, 90 deletions
diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c index 64f9997e5d01..e42d1d3baae2 100644 --- a/drivers/video/omap2/dss/apply.c +++ b/drivers/video/omap2/dss/apply.c | |||
@@ -662,3 +662,87 @@ void dss_mgr_disable(struct omap_overlay_manager *mgr) | |||
662 | mgr->enabled = false; | 662 | mgr->enabled = false; |
663 | } | 663 | } |
664 | 664 | ||
665 | int dss_ovl_set_info(struct omap_overlay *ovl, | ||
666 | struct omap_overlay_info *info) | ||
667 | { | ||
668 | int r; | ||
669 | struct omap_overlay_info old_info; | ||
670 | |||
671 | old_info = ovl->info; | ||
672 | ovl->info = *info; | ||
673 | |||
674 | if (ovl->manager) { | ||
675 | r = dss_check_overlay(ovl, ovl->manager->device); | ||
676 | if (r) { | ||
677 | ovl->info = old_info; | ||
678 | return r; | ||
679 | } | ||
680 | } | ||
681 | |||
682 | ovl->info_dirty = true; | ||
683 | |||
684 | return 0; | ||
685 | } | ||
686 | |||
687 | void dss_ovl_get_info(struct omap_overlay *ovl, | ||
688 | struct omap_overlay_info *info) | ||
689 | { | ||
690 | *info = ovl->info; | ||
691 | } | ||
692 | |||
693 | int dss_ovl_set_manager(struct omap_overlay *ovl, | ||
694 | struct omap_overlay_manager *mgr) | ||
695 | { | ||
696 | if (!mgr) | ||
697 | return -EINVAL; | ||
698 | |||
699 | if (ovl->manager) { | ||
700 | DSSERR("overlay '%s' already has a manager '%s'\n", | ||
701 | ovl->name, ovl->manager->name); | ||
702 | return -EINVAL; | ||
703 | } | ||
704 | |||
705 | if (ovl->info.enabled) { | ||
706 | DSSERR("overlay has to be disabled to change the manager\n"); | ||
707 | return -EINVAL; | ||
708 | } | ||
709 | |||
710 | ovl->manager = mgr; | ||
711 | list_add_tail(&ovl->list, &mgr->overlays); | ||
712 | ovl->manager_changed = true; | ||
713 | |||
714 | /* XXX: When there is an overlay on a DSI manual update display, and | ||
715 | * the overlay is first disabled, then moved to tv, and enabled, we | ||
716 | * seem to get SYNC_LOST_DIGIT error. | ||
717 | * | ||
718 | * Waiting doesn't seem to help, but updating the manual update display | ||
719 | * after disabling the overlay seems to fix this. This hints that the | ||
720 | * overlay is perhaps somehow tied to the LCD output until the output | ||
721 | * is updated. | ||
722 | * | ||
723 | * Userspace workaround for this is to update the LCD after disabling | ||
724 | * the overlay, but before moving the overlay to TV. | ||
725 | */ | ||
726 | |||
727 | return 0; | ||
728 | } | ||
729 | |||
730 | int dss_ovl_unset_manager(struct omap_overlay *ovl) | ||
731 | { | ||
732 | if (!ovl->manager) { | ||
733 | DSSERR("failed to detach overlay: manager not set\n"); | ||
734 | return -EINVAL; | ||
735 | } | ||
736 | |||
737 | if (ovl->info.enabled) { | ||
738 | DSSERR("overlay has to be disabled to unset the manager\n"); | ||
739 | return -EINVAL; | ||
740 | } | ||
741 | |||
742 | ovl->manager = NULL; | ||
743 | list_del(&ovl->list); | ||
744 | ovl->manager_changed = true; | ||
745 | |||
746 | return 0; | ||
747 | } | ||
748 | |||
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h index 1535496677ba..163b9d9b7a44 100644 --- a/drivers/video/omap2/dss/dss.h +++ b/drivers/video/omap2/dss/dss.h | |||
@@ -172,6 +172,14 @@ int omap_dss_mgr_apply(struct omap_overlay_manager *mgr); | |||
172 | void dss_mgr_enable(struct omap_overlay_manager *mgr); | 172 | void dss_mgr_enable(struct omap_overlay_manager *mgr); |
173 | void dss_mgr_disable(struct omap_overlay_manager *mgr); | 173 | void dss_mgr_disable(struct omap_overlay_manager *mgr); |
174 | 174 | ||
175 | int dss_ovl_set_info(struct omap_overlay *ovl, | ||
176 | struct omap_overlay_info *info); | ||
177 | void dss_ovl_get_info(struct omap_overlay *ovl, | ||
178 | struct omap_overlay_info *info); | ||
179 | int dss_ovl_set_manager(struct omap_overlay *ovl, | ||
180 | struct omap_overlay_manager *mgr); | ||
181 | int dss_ovl_unset_manager(struct omap_overlay *ovl); | ||
182 | |||
175 | /* display */ | 183 | /* display */ |
176 | int dss_suspend_all_devices(void); | 184 | int dss_suspend_all_devices(void); |
177 | int dss_resume_all_devices(void); | 185 | int dss_resume_all_devices(void); |
diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c index 3c940654ef91..00c01a395554 100644 --- a/drivers/video/omap2/dss/overlay.c +++ b/drivers/video/omap2/dss/overlay.c | |||
@@ -520,90 +520,6 @@ int dss_check_overlay(struct omap_overlay *ovl, struct omap_dss_device *dssdev) | |||
520 | return 0; | 520 | return 0; |
521 | } | 521 | } |
522 | 522 | ||
523 | static int dss_ovl_set_overlay_info(struct omap_overlay *ovl, | ||
524 | struct omap_overlay_info *info) | ||
525 | { | ||
526 | int r; | ||
527 | struct omap_overlay_info old_info; | ||
528 | |||
529 | old_info = ovl->info; | ||
530 | ovl->info = *info; | ||
531 | |||
532 | if (ovl->manager) { | ||
533 | r = dss_check_overlay(ovl, ovl->manager->device); | ||
534 | if (r) { | ||
535 | ovl->info = old_info; | ||
536 | return r; | ||
537 | } | ||
538 | } | ||
539 | |||
540 | ovl->info_dirty = true; | ||
541 | |||
542 | return 0; | ||
543 | } | ||
544 | |||
545 | static void dss_ovl_get_overlay_info(struct omap_overlay *ovl, | ||
546 | struct omap_overlay_info *info) | ||
547 | { | ||
548 | *info = ovl->info; | ||
549 | } | ||
550 | |||
551 | static int omap_dss_set_manager(struct omap_overlay *ovl, | ||
552 | struct omap_overlay_manager *mgr) | ||
553 | { | ||
554 | if (!mgr) | ||
555 | return -EINVAL; | ||
556 | |||
557 | if (ovl->manager) { | ||
558 | DSSERR("overlay '%s' already has a manager '%s'\n", | ||
559 | ovl->name, ovl->manager->name); | ||
560 | return -EINVAL; | ||
561 | } | ||
562 | |||
563 | if (ovl->info.enabled) { | ||
564 | DSSERR("overlay has to be disabled to change the manager\n"); | ||
565 | return -EINVAL; | ||
566 | } | ||
567 | |||
568 | ovl->manager = mgr; | ||
569 | list_add_tail(&ovl->list, &mgr->overlays); | ||
570 | ovl->manager_changed = true; | ||
571 | |||
572 | /* XXX: When there is an overlay on a DSI manual update display, and | ||
573 | * the overlay is first disabled, then moved to tv, and enabled, we | ||
574 | * seem to get SYNC_LOST_DIGIT error. | ||
575 | * | ||
576 | * Waiting doesn't seem to help, but updating the manual update display | ||
577 | * after disabling the overlay seems to fix this. This hints that the | ||
578 | * overlay is perhaps somehow tied to the LCD output until the output | ||
579 | * is updated. | ||
580 | * | ||
581 | * Userspace workaround for this is to update the LCD after disabling | ||
582 | * the overlay, but before moving the overlay to TV. | ||
583 | */ | ||
584 | |||
585 | return 0; | ||
586 | } | ||
587 | |||
588 | static int omap_dss_unset_manager(struct omap_overlay *ovl) | ||
589 | { | ||
590 | if (!ovl->manager) { | ||
591 | DSSERR("failed to detach overlay: manager not set\n"); | ||
592 | return -EINVAL; | ||
593 | } | ||
594 | |||
595 | if (ovl->info.enabled) { | ||
596 | DSSERR("overlay has to be disabled to unset the manager\n"); | ||
597 | return -EINVAL; | ||
598 | } | ||
599 | |||
600 | ovl->manager = NULL; | ||
601 | list_del(&ovl->list); | ||
602 | ovl->manager_changed = true; | ||
603 | |||
604 | return 0; | ||
605 | } | ||
606 | |||
607 | int omap_dss_get_num_overlays(void) | 523 | int omap_dss_get_num_overlays(void) |
608 | { | 524 | { |
609 | return num_overlays; | 525 | return num_overlays; |
@@ -663,10 +579,10 @@ void dss_init_overlays(struct platform_device *pdev) | |||
663 | break; | 579 | break; |
664 | } | 580 | } |
665 | 581 | ||
666 | ovl->set_manager = &omap_dss_set_manager; | 582 | ovl->set_manager = &dss_ovl_set_manager; |
667 | ovl->unset_manager = &omap_dss_unset_manager; | 583 | ovl->unset_manager = &dss_ovl_unset_manager; |
668 | ovl->set_overlay_info = &dss_ovl_set_overlay_info; | 584 | ovl->set_overlay_info = &dss_ovl_set_info; |
669 | ovl->get_overlay_info = &dss_ovl_get_overlay_info; | 585 | ovl->get_overlay_info = &dss_ovl_get_info; |
670 | ovl->wait_for_go = &dss_mgr_wait_for_go_ovl; | 586 | ovl->wait_for_go = &dss_mgr_wait_for_go_ovl; |
671 | 587 | ||
672 | ovl->caps = dss_feat_get_overlay_caps(ovl->id); | 588 | ovl->caps = dss_feat_get_overlay_caps(ovl->id); |
@@ -731,8 +647,8 @@ void dss_recheck_connections(struct omap_dss_device *dssdev, bool force) | |||
731 | ovl = omap_dss_get_overlay(i); | 647 | ovl = omap_dss_get_overlay(i); |
732 | if (!ovl->manager || force) { | 648 | if (!ovl->manager || force) { |
733 | if (ovl->manager) | 649 | if (ovl->manager) |
734 | omap_dss_unset_manager(ovl); | 650 | ovl->unset_manager(ovl); |
735 | omap_dss_set_manager(ovl, mgr); | 651 | ovl->set_manager(ovl, mgr); |
736 | } | 652 | } |
737 | } | 653 | } |
738 | 654 | ||