u32 reg;
 
        if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
+               int byte_clk_khz = dsi->burst_clk_rate / 1000 / 8;
+               int hfp = (m->hsync_start - m->hdisplay) * byte_clk_khz / m->clock;
+               int hbp = (m->htotal - m->hsync_end) * byte_clk_khz / m->clock;
+               int hsa = (m->hsync_end - m->hsync_start) * byte_clk_khz / m->clock;
+
+               /* remove packet overhead when possible */
+               hfp = max(hfp - 6, 0);
+               hbp = max(hbp - 6, 0);
+               hsa = max(hsa - 6, 0);
+
+               dev_dbg(dsi->dev, "calculated hfp: %u, hbp: %u, hsa: %u",
+                       hfp, hbp, hsa);
+
                reg = DSIM_CMD_ALLOW(0xf)
                        | DSIM_STABLE_VFP(m->vsync_start - m->vdisplay)
                        | DSIM_MAIN_VBP(m->vtotal - m->vsync_end);
                samsung_dsim_write(dsi, DSIM_MVPORCH_REG, reg);
 
-               reg = DSIM_MAIN_HFP(m->hsync_start - m->hdisplay)
-                       | DSIM_MAIN_HBP(m->htotal - m->hsync_end);
+               reg = DSIM_MAIN_HFP(hfp) | DSIM_MAIN_HBP(hbp);
                samsung_dsim_write(dsi, DSIM_MHPORCH_REG, reg);
 
                reg = DSIM_MAIN_VSA(m->vsync_end - m->vsync_start)
-                       | DSIM_MAIN_HSA(m->hsync_end - m->hsync_start);
+                       | DSIM_MAIN_HSA(hsa);
                samsung_dsim_write(dsi, DSIM_MSYNC_REG, reg);
        }
        reg =  DSIM_MAIN_HRESOL(m->hdisplay, num_bits_resol) |