|
@@ -105,6 +105,9 @@ static struct {
|
|
|
struct ovl_priv_data ovl_priv_data_array[MAX_DSS_OVERLAYS];
|
|
|
struct mgr_priv_data mgr_priv_data_array[MAX_DSS_MANAGERS];
|
|
|
|
|
|
+ bool fifo_merge_dirty;
|
|
|
+ bool fifo_merge;
|
|
|
+
|
|
|
bool irq_enabled;
|
|
|
} dss_data;
|
|
|
|
|
@@ -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)
|
|
|
{
|
|
|
const int num_mgrs = omap_dss_get_num_overlay_managers();
|
|
|
int i;
|
|
|
|
|
|
+ dss_write_regs_common();
|
|
|
+
|
|
|
for (i = 0; i < num_mgrs; ++i) {
|
|
|
struct omap_overlay_manager *mgr;
|
|
|
struct mgr_priv_data *mp;
|
|
@@ -659,6 +691,8 @@ void dss_mgr_start_update(struct omap_overlay_manager *mgr)
|
|
|
|
|
|
dss_mgr_write_regs(mgr);
|
|
|
|
|
|
+ dss_write_regs_common();
|
|
|
+
|
|
|
mp->updating = true;
|
|
|
|
|
|
if (!dss_data.irq_enabled && need_isr())
|
|
@@ -859,6 +893,15 @@ static void dss_apply_ovl_fifo_thresholds(struct omap_overlay *ovl,
|
|
|
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)
|
|
|
{
|
|
|
struct ovl_priv_data *op = get_ovl_priv(ovl);
|