From 5a56a2487643d24353fab2c2e3e754647fb5c757 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Sat, 26 Nov 2011 14:26:46 +0200 Subject: [PATCH] --- yaml --- r: 284966 b: refs/heads/master c: 82153eda076ee4df434bb1008f24e46590f76dfc h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/video/omap2/dss/apply.c | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index c6b13cbbfa72..0487bc3d62de 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 153b6e7357778267e6914f2370a059e79a751371 +refs/heads/master: 82153eda076ee4df434bb1008f24e46590f76dfc diff --git a/trunk/drivers/video/omap2/dss/apply.c b/trunk/drivers/video/omap2/dss/apply.c index b6e608386219..c38c015d60e2 100644 --- a/trunk/drivers/video/omap2/dss/apply.c +++ b/trunk/drivers/video/omap2/dss/apply.c @@ -72,6 +72,12 @@ struct ovl_priv_data { bool enabled; enum omap_channel channel; u32 fifo_low, fifo_high; + + /* + * True if overlay is to be enabled. Used to check and calculate configs + * for the overlay before it is enabled in the HW. + */ + bool enabling; }; struct mgr_priv_data { @@ -297,7 +303,7 @@ static int dss_check_settings_low(struct omap_overlay_manager *mgr, list_for_each_entry(ovl, &mgr->overlays, list) { op = get_ovl_priv(ovl); - if (!op->enabled) + if (!op->enabled && !op->enabling) oi = NULL; else if (applying && op->user_info_dirty) oi = &op->user_info; @@ -998,7 +1004,7 @@ static void dss_mgr_setup_fifos(struct omap_overlay_manager *mgr) list_for_each_entry(ovl, &mgr->overlays, list) { op = get_ovl_priv(ovl); - if (!op->enabled) + if (!op->enabled && !op->enabling) continue; dss_ovl_setup_fifo(ovl); @@ -1395,19 +1401,20 @@ int dss_ovl_enable(struct omap_overlay *ovl) spin_lock_irqsave(&data_lock, flags); - op->enabled = true; + op->enabling = true; + r = dss_check_settings(ovl->manager, ovl->manager->device); - op->enabled = false; if (r) { DSSERR("failed to enable overlay %d: check_settings failed\n", ovl->id); goto err2; } - dss_apply_ovl_enable(ovl, true); - dss_ovl_setup_fifo(ovl); + op->enabling = false; + dss_apply_ovl_enable(ovl, true); + dss_write_regs(); dss_set_go_bits(); @@ -1417,6 +1424,7 @@ int dss_ovl_enable(struct omap_overlay *ovl) return 0; err2: + op->enabling = false; spin_unlock_irqrestore(&data_lock, flags); err1: mutex_unlock(&apply_lock);