diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c index b6e608386219..c38c015d60e2 100644 --- a/drivers/video/omap2/dss/apply.c +++ b/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);