}
 
        /* Set up channel 0 sync (based on chnl_update_registers()) */
-       if (mcde->te_sync) {
-               /*
-                * Turn on hardware TE0 synchronization
-                */
+       if (mcde->video_mode || mcde->te_sync)
                val = MCDE_CHNLXSYNCHMOD_SRC_SYNCH_HARDWARE
                        << MCDE_CHNLXSYNCHMOD_SRC_SYNCH_SHIFT;
-               val |= MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_TE0
-                       << MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_SHIFT;
-       } else {
-               /*
-                * Set up sync source to software, out sync formatter
-                * Code mostly from mcde_hw.c chnl_update_registers()
-                */
+       else
                val = MCDE_CHNLXSYNCHMOD_SRC_SYNCH_SOFTWARE
                        << MCDE_CHNLXSYNCHMOD_SRC_SYNCH_SHIFT;
+
+       if (mcde->te_sync)
+               val |= MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_TE0
+                       << MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_SHIFT;
+       else
                val |= MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_FORMATTER
                        << MCDE_CHNLXSYNCHMOD_OUT_SYNCH_SRC_SHIFT;
-       }
+
        writel(val, mcde->regs + sync);
 
        /* Set up pixels per line and lines per frame */
 
        drm_crtc_vblank_on(crtc);
 
+       if (mcde->video_mode)
+               /*
+                * Keep FIFO permanently enabled in video mode,
+                * otherwise MCDE will stop feeding data to the panel.
+                */
+               mcde_enable_fifo(mcde, MCDE_FIFO_A);
+
        dev_info(drm->dev, "MCDE display is enabled\n");
 }
 
         */
        if (fb) {
                mcde_set_extsrc(mcde, drm_fb_cma_get_gem_addr(fb, pstate, 0));
-               /* Send a single frame using software sync */
-               mcde_display_send_one_frame(mcde);
+               if (!mcde->video_mode)
+                       /* Send a single frame using software sync */
+                       mcde_display_send_one_frame(mcde);
                dev_info_once(mcde->dev, "sent first display update\n");
        } else {
                /*
 
        return te_received;
 }
 
+static void mcde_dsi_attach_to_mcde(struct mcde_dsi *d)
+{
+       d->mcde->mdsi = d->mdsi;
+
+       d->mcde->video_mode = !!(d->mdsi->mode_flags & MIPI_DSI_MODE_VIDEO);
+       /* Enable use of the TE signal for all command mode panels */
+       d->mcde->te_sync = !d->mcde->video_mode;
+}
+
 static int mcde_dsi_host_attach(struct mipi_dsi_host *host,
                                struct mipi_dsi_device *mdsi)
 {
 
        d->mdsi = mdsi;
        if (d->mcde)
-               d->mcde->mdsi = mdsi;
+               mcde_dsi_attach_to_mcde(d);
 
        return 0;
 }
        d->mcde = mcde;
        /* If the display attached before binding, set this up */
        if (d->mdsi)
-               d->mcde->mdsi = d->mdsi;
+               mcde_dsi_attach_to_mcde(d);
 
        /* Obtain the clocks */
        d->hs_clk = devm_clk_get(dev, "hs");