diff options
Diffstat (limited to 'drivers/video/omap2/dss/manager.c')
-rw-r--r-- | drivers/video/omap2/dss/manager.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c index f933996..6485eff 100644 --- a/drivers/video/omap2/dss/manager.c +++ b/drivers/video/omap2/dss/manager.c @@ -39,6 +39,7 @@ static int num_managers; static struct list_head manager_list; +static struct omap_overlay_manager *mgrs[MAX_DSS_MANAGERS]; static ssize_t manager_name_show(struct omap_overlay_manager *mgr, char *buf) { @@ -716,7 +717,7 @@ static int dss_mgr_wait_for_vsync(struct omap_overlay_manager *mgr) } r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); - if(!r) + if (!r) mgr->device->first_vsync = true; return r; @@ -784,6 +785,8 @@ static int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr) } r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); + if (!r) + mgr->device->first_vsync = true; if (r == -ERESTARTSYS) break; @@ -1403,6 +1406,8 @@ static void dss_completion_irq_handler(void *data, u32 mask) for (i = 0; i < num_mgrs; i++) { mc = &dss_cache.manager_cache[i]; if (mask & masks[i]) { + if (mgrs[i] && mgrs[i]->device) + mgrs[i]->device->first_vsync = true; dss_ovl_cb(&mc->cb.dispc, i, DSS_COMPLETION_DISPLAYED); mc->cb.dispc_displayed = true; } @@ -1531,6 +1536,8 @@ static void dss_apply_irq_handler(void *data, u32 mask) for (i = 0; i < num_mgrs; ++i) { mc = &dss_cache.manager_cache[i]; if (!mgr_busy[i] && mc->shadow_dirty) { + if (mgrs[i] && mgrs[i]->device) + mgrs[i]->device->first_vsync = true; dss_ovl_program_cb(&mc->cb, i); mc->shadow_dirty = false; } @@ -2077,6 +2084,8 @@ static void omap_dss_add_overlay_manager(struct omap_overlay_manager *manager) { ++num_managers; list_add_tail(&manager->list, &manager_list); + if (manager->id < ARRAY_SIZE(mgrs)) + mgrs[manager->id] = manager; } int dss_init_overlay_managers(struct platform_device *pdev) |