Commit fb011974 authored by Tomi Valkeinen's avatar Tomi Valkeinen

OMAPDSS: APPLY: add fifo merge support funcs

Add mechanism to set/unset the DISPC fifo-merge:

Add new fields to dss_data, fifo_merge and fifo_merge_dirty. These are
similar to the other info/dirty flags in ovl_priv_data and ovl_mgr_data,
but fifo merge is a common attribute to all managers and thus outside
the ovl_mgr_data.

The fifo-merge field is used in the dss_write_regs_common, which handles
writing the register.

dss_apply_fifo_merge() can be used to set/unset the fifo merge field in
the dss_data.
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent e6b0f884
...@@ -105,6 +105,9 @@ static struct { ...@@ -105,6 +105,9 @@ static struct {
struct ovl_priv_data ovl_priv_data_array[MAX_DSS_OVERLAYS]; struct ovl_priv_data ovl_priv_data_array[MAX_DSS_OVERLAYS];
struct mgr_priv_data mgr_priv_data_array[MAX_DSS_MANAGERS]; struct mgr_priv_data mgr_priv_data_array[MAX_DSS_MANAGERS];
bool fifo_merge_dirty;
bool fifo_merge;
bool irq_enabled; bool irq_enabled;
} dss_data; } dss_data;
...@@ -585,11 +588,40 @@ static void dss_mgr_write_regs(struct omap_overlay_manager *mgr) ...@@ -585,11 +588,40 @@ static void dss_mgr_write_regs(struct omap_overlay_manager *mgr)
} }
} }
static void dss_write_regs_common(void)
{
const int num_mgrs = omap_dss_get_num_overlay_managers();
int i;
if (!dss_data.fifo_merge_dirty)
return;
for (i = 0; i < num_mgrs; ++i) {
struct omap_overlay_manager *mgr;
struct mgr_priv_data *mp;
mgr = omap_dss_get_overlay_manager(i);
mp = get_mgr_priv(mgr);
if (mp->enabled) {
if (dss_data.fifo_merge_dirty) {
dispc_enable_fifomerge(dss_data.fifo_merge);
dss_data.fifo_merge_dirty = false;
}
if (mp->updating)
mp->shadow_info_dirty = true;
}
}
}
static void dss_write_regs(void) static void dss_write_regs(void)
{ {
const int num_mgrs = omap_dss_get_num_overlay_managers(); const int num_mgrs = omap_dss_get_num_overlay_managers();
int i; int i;
dss_write_regs_common();
for (i = 0; i < num_mgrs; ++i) { for (i = 0; i < num_mgrs; ++i) {
struct omap_overlay_manager *mgr; struct omap_overlay_manager *mgr;
struct mgr_priv_data *mp; struct mgr_priv_data *mp;
...@@ -659,6 +691,8 @@ void dss_mgr_start_update(struct omap_overlay_manager *mgr) ...@@ -659,6 +691,8 @@ void dss_mgr_start_update(struct omap_overlay_manager *mgr)
dss_mgr_write_regs(mgr); dss_mgr_write_regs(mgr);
dss_write_regs_common();
mp->updating = true; mp->updating = true;
if (!dss_data.irq_enabled && need_isr()) if (!dss_data.irq_enabled && need_isr())
...@@ -859,6 +893,15 @@ static void dss_apply_ovl_fifo_thresholds(struct omap_overlay *ovl, ...@@ -859,6 +893,15 @@ static void dss_apply_ovl_fifo_thresholds(struct omap_overlay *ovl,
op->extra_info_dirty = true; op->extra_info_dirty = true;
} }
static void dss_apply_fifo_merge(bool use_fifo_merge)
{
if (dss_data.fifo_merge == use_fifo_merge)
return;
dss_data.fifo_merge = use_fifo_merge;
dss_data.fifo_merge_dirty = true;
}
static void dss_ovl_setup_fifo(struct omap_overlay *ovl) static void dss_ovl_setup_fifo(struct omap_overlay *ovl)
{ {
struct ovl_priv_data *op = get_ovl_priv(ovl); struct ovl_priv_data *op = get_ovl_priv(ovl);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment