diff options
Diffstat (limited to 'drivers/video/omap2/dss/apply.c')
-rw-r--r-- | drivers/video/omap2/dss/apply.c | 58 |
1 files changed, 52 insertions, 6 deletions
diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c index 6f60d0e0b7ee..98cebe30318a 100644 --- a/drivers/video/omap2/dss/apply.c +++ b/drivers/video/omap2/dss/apply.c | |||
@@ -416,7 +416,37 @@ static void wait_pending_extra_info_updates(void) | |||
416 | DSSWARN("timeout in wait_pending_extra_info_updates\n"); | 416 | DSSWARN("timeout in wait_pending_extra_info_updates\n"); |
417 | } | 417 | } |
418 | 418 | ||
419 | int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr) | 419 | static inline struct omap_dss_device *dss_mgr_get_device(struct omap_overlay_manager *mgr) |
420 | { | ||
421 | return mgr->output ? mgr->output->device : NULL; | ||
422 | } | ||
423 | |||
424 | static int dss_mgr_wait_for_vsync(struct omap_overlay_manager *mgr) | ||
425 | { | ||
426 | unsigned long timeout = msecs_to_jiffies(500); | ||
427 | struct omap_dss_device *dssdev = mgr->get_device(mgr); | ||
428 | u32 irq; | ||
429 | int r; | ||
430 | |||
431 | r = dispc_runtime_get(); | ||
432 | if (r) | ||
433 | return r; | ||
434 | |||
435 | if (dssdev->type == OMAP_DISPLAY_TYPE_VENC) | ||
436 | irq = DISPC_IRQ_EVSYNC_ODD; | ||
437 | else if (dssdev->type == OMAP_DISPLAY_TYPE_HDMI) | ||
438 | irq = DISPC_IRQ_EVSYNC_EVEN; | ||
439 | else | ||
440 | irq = dispc_mgr_get_vsync_irq(mgr->id); | ||
441 | |||
442 | r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); | ||
443 | |||
444 | dispc_runtime_put(); | ||
445 | |||
446 | return r; | ||
447 | } | ||
448 | |||
449 | static int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr) | ||
420 | { | 450 | { |
421 | unsigned long timeout = msecs_to_jiffies(500); | 451 | unsigned long timeout = msecs_to_jiffies(500); |
422 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | 452 | struct mgr_priv_data *mp = get_mgr_priv(mgr); |
@@ -885,7 +915,7 @@ static void omap_dss_mgr_apply_mgr(struct omap_overlay_manager *mgr) | |||
885 | mp->info = mp->user_info; | 915 | mp->info = mp->user_info; |
886 | } | 916 | } |
887 | 917 | ||
888 | int omap_dss_mgr_apply(struct omap_overlay_manager *mgr) | 918 | static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr) |
889 | { | 919 | { |
890 | unsigned long flags; | 920 | unsigned long flags; |
891 | struct omap_overlay *ovl; | 921 | struct omap_overlay *ovl; |
@@ -1058,7 +1088,7 @@ out: | |||
1058 | mutex_unlock(&apply_lock); | 1088 | mutex_unlock(&apply_lock); |
1059 | } | 1089 | } |
1060 | 1090 | ||
1061 | int dss_mgr_set_info(struct omap_overlay_manager *mgr, | 1091 | static int dss_mgr_set_info(struct omap_overlay_manager *mgr, |
1062 | struct omap_overlay_manager_info *info) | 1092 | struct omap_overlay_manager_info *info) |
1063 | { | 1093 | { |
1064 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | 1094 | struct mgr_priv_data *mp = get_mgr_priv(mgr); |
@@ -1079,7 +1109,7 @@ int dss_mgr_set_info(struct omap_overlay_manager *mgr, | |||
1079 | return 0; | 1109 | return 0; |
1080 | } | 1110 | } |
1081 | 1111 | ||
1082 | void dss_mgr_get_info(struct omap_overlay_manager *mgr, | 1112 | static void dss_mgr_get_info(struct omap_overlay_manager *mgr, |
1083 | struct omap_overlay_manager_info *info) | 1113 | struct omap_overlay_manager_info *info) |
1084 | { | 1114 | { |
1085 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | 1115 | struct mgr_priv_data *mp = get_mgr_priv(mgr); |
@@ -1092,7 +1122,7 @@ void dss_mgr_get_info(struct omap_overlay_manager *mgr, | |||
1092 | spin_unlock_irqrestore(&data_lock, flags); | 1122 | spin_unlock_irqrestore(&data_lock, flags); |
1093 | } | 1123 | } |
1094 | 1124 | ||
1095 | int dss_mgr_set_output(struct omap_overlay_manager *mgr, | 1125 | static int dss_mgr_set_output(struct omap_overlay_manager *mgr, |
1096 | struct omap_dss_output *output) | 1126 | struct omap_dss_output *output) |
1097 | { | 1127 | { |
1098 | int r; | 1128 | int r; |
@@ -1124,7 +1154,7 @@ err: | |||
1124 | return r; | 1154 | return r; |
1125 | } | 1155 | } |
1126 | 1156 | ||
1127 | int dss_mgr_unset_output(struct omap_overlay_manager *mgr) | 1157 | static int dss_mgr_unset_output(struct omap_overlay_manager *mgr) |
1128 | { | 1158 | { |
1129 | int r; | 1159 | int r; |
1130 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | 1160 | struct mgr_priv_data *mp = get_mgr_priv(mgr); |
@@ -1470,6 +1500,7 @@ static DEFINE_MUTEX(compat_init_lock); | |||
1470 | int omapdss_compat_init(void) | 1500 | int omapdss_compat_init(void) |
1471 | { | 1501 | { |
1472 | struct platform_device *pdev = dss_get_core_pdev(); | 1502 | struct platform_device *pdev = dss_get_core_pdev(); |
1503 | int i; | ||
1473 | 1504 | ||
1474 | mutex_lock(&compat_init_lock); | 1505 | mutex_lock(&compat_init_lock); |
1475 | 1506 | ||
@@ -1481,6 +1512,21 @@ int omapdss_compat_init(void) | |||
1481 | dss_init_overlay_managers(pdev); | 1512 | dss_init_overlay_managers(pdev); |
1482 | dss_init_overlays(pdev); | 1513 | dss_init_overlays(pdev); |
1483 | 1514 | ||
1515 | for (i = 0; i < omap_dss_get_num_overlay_managers(); i++) { | ||
1516 | struct omap_overlay_manager *mgr; | ||
1517 | |||
1518 | mgr = omap_dss_get_overlay_manager(i); | ||
1519 | |||
1520 | mgr->set_output = &dss_mgr_set_output; | ||
1521 | mgr->unset_output = &dss_mgr_unset_output; | ||
1522 | mgr->apply = &omap_dss_mgr_apply; | ||
1523 | mgr->set_manager_info = &dss_mgr_set_info; | ||
1524 | mgr->get_manager_info = &dss_mgr_get_info; | ||
1525 | mgr->wait_for_go = &dss_mgr_wait_for_go; | ||
1526 | mgr->wait_for_vsync = &dss_mgr_wait_for_vsync; | ||
1527 | mgr->get_device = &dss_mgr_get_device; | ||
1528 | } | ||
1529 | |||
1484 | out: | 1530 | out: |
1485 | mutex_unlock(&compat_init_lock); | 1531 | mutex_unlock(&compat_init_lock); |
1486 | 1532 | ||