diff options
Diffstat (limited to 'drivers/video/omap2/dss/apply.c')
-rw-r--r-- | drivers/video/omap2/dss/apply.c | 95 |
1 files changed, 57 insertions, 38 deletions
diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c index 3fd2ea163f05..d5505becd065 100644 --- a/drivers/video/omap2/dss/apply.c +++ b/drivers/video/omap2/dss/apply.c @@ -69,14 +69,12 @@ struct ovl_priv_data { struct omap_overlay_info info; - u32 fifo_low; - u32 fifo_high; - bool extra_info_dirty; bool shadow_extra_info_dirty; bool enabled; enum omap_channel channel; + u32 fifo_low, fifo_high; }; struct mgr_priv_data { @@ -396,8 +394,6 @@ static void dss_ovl_write_regs(struct omap_overlay *ovl) return; } - dispc_ovl_set_fifo_threshold(ovl->id, op->fifo_low, op->fifo_high); - mp = get_mgr_priv(ovl->manager); op->dirty = false; @@ -420,6 +416,7 @@ static void dss_ovl_write_regs_extra(struct omap_overlay *ovl) dispc_ovl_enable(ovl->id, op->enabled); dispc_ovl_set_channel_out(ovl->id, op->channel); + dispc_ovl_set_fifo_threshold(ovl->id, op->fifo_low, op->fifo_high); mp = get_mgr_priv(ovl->manager); @@ -632,13 +629,42 @@ static void omap_dss_mgr_apply_mgr(struct omap_overlay_manager *mgr) mp->info = mp->user_info; } -static void omap_dss_mgr_apply_ovl_fifos(struct omap_overlay *ovl) +int omap_dss_mgr_apply(struct omap_overlay_manager *mgr) { - struct ovl_priv_data *op; + int r; + unsigned long flags; + struct omap_overlay *ovl; + + DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name); + + r = dispc_runtime_get(); + if (r) + return r; + + spin_lock_irqsave(&data_lock, flags); + + /* Configure overlays */ + list_for_each_entry(ovl, &mgr->overlays, list) + omap_dss_mgr_apply_ovl(ovl); + + /* Configure manager */ + omap_dss_mgr_apply_mgr(mgr); + + dss_write_regs(); + + spin_unlock_irqrestore(&data_lock, flags); + + dispc_runtime_put(); + + return r; +} + +static void dss_ovl_setup_fifo(struct omap_overlay *ovl) +{ + struct ovl_priv_data *op = get_ovl_priv(ovl); struct omap_dss_device *dssdev; u32 size, burst_size; - - op = get_ovl_priv(ovl); + u32 fifo_low, fifo_high; dssdev = ovl->manager->device; @@ -653,53 +679,42 @@ static void omap_dss_mgr_apply_ovl_fifos(struct omap_overlay *ovl) case OMAP_DISPLAY_TYPE_VENC: case OMAP_DISPLAY_TYPE_HDMI: default_get_overlay_fifo_thresholds(ovl->id, size, - burst_size, &op->fifo_low, - &op->fifo_high); + burst_size, &fifo_low, &fifo_high); break; #ifdef CONFIG_OMAP2_DSS_DSI case OMAP_DISPLAY_TYPE_DSI: dsi_get_overlay_fifo_thresholds(ovl->id, size, - burst_size, &op->fifo_low, - &op->fifo_high); + burst_size, &fifo_low, &fifo_high); break; #endif default: BUG(); } + + op->fifo_low = fifo_low; + op->fifo_high = fifo_high; + op->extra_info_dirty = true; } -int omap_dss_mgr_apply(struct omap_overlay_manager *mgr) +static void dss_mgr_setup_fifos(struct omap_overlay_manager *mgr) { - int r; - unsigned long flags; struct omap_overlay *ovl; + struct ovl_priv_data *op; + struct mgr_priv_data *mp; - DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name); - - r = dispc_runtime_get(); - if (r) - return r; - - spin_lock_irqsave(&data_lock, flags); - - /* Configure overlays */ - list_for_each_entry(ovl, &mgr->overlays, list) - omap_dss_mgr_apply_ovl(ovl); - - /* Configure manager */ - omap_dss_mgr_apply_mgr(mgr); - - /* Configure overlay fifos */ - list_for_each_entry(ovl, &mgr->overlays, list) - omap_dss_mgr_apply_ovl_fifos(ovl); + mp = get_mgr_priv(mgr); - dss_write_regs(); + if (!mp->enabled) + return; - spin_unlock_irqrestore(&data_lock, flags); + list_for_each_entry(ovl, &mgr->overlays, list) { + op = get_ovl_priv(ovl); - dispc_runtime_put(); + if (!op->enabled) + continue; - return r; + dss_ovl_setup_fifo(ovl); + } } void dss_mgr_enable(struct omap_overlay_manager *mgr) @@ -713,6 +728,8 @@ void dss_mgr_enable(struct omap_overlay_manager *mgr) mp->enabled = true; + dss_mgr_setup_fifos(mgr); + dss_write_regs(); if (!mgr_manual_update(mgr)) @@ -1000,6 +1017,8 @@ int dss_ovl_enable(struct omap_overlay *ovl) op->enabled = true; op->extra_info_dirty = true; + dss_ovl_setup_fifo(ovl); + dss_write_regs(); spin_unlock_irqrestore(&data_lock, flags); |