diff options
-rw-r--r-- | drivers/gpu/drm/bridge/samsung-dsim.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c index 4f9c54d5cf7a..1ecbba2c5fca 100644 --- a/drivers/gpu/drm/bridge/samsung-dsim.c +++ b/drivers/gpu/drm/bridge/samsung-dsim.c @@ -736,27 +736,34 @@ static int samsung_dsim_init_link(struct samsung_dsim *dsi) return 0; } +#define MIPI_PKT_OVERHEAD 6 + static void samsung_dsim_set_display_mode(struct samsung_dsim *dsi) { struct drm_display_mode *m = &dsi->mode; unsigned int num_bits_resol = dsi->driver_data->num_bits_resol; - int bpp; u32 reg; if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { - bpp = mipi_dsi_pixel_format_to_bpp(dsi->format) / 8; + int bpp = mipi_dsi_pixel_format_to_bpp(dsi->format) / 8; + int hfp = (m->hsync_start - m->hdisplay) * bpp / dsi->lanes; + int hbp = (m->htotal - m->hsync_end) * bpp / dsi->lanes; + int hsa = (m->hsync_end - m->hsync_start) * bpp / dsi->lanes; + + hfp = max(hfp - MIPI_PKT_OVERHEAD, MIPI_PKT_OVERHEAD); + hbp = max(hbp - MIPI_PKT_OVERHEAD, MIPI_PKT_OVERHEAD); + hsa = max(hsa - MIPI_PKT_OVERHEAD, MIPI_PKT_OVERHEAD); 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) * bpp / dsi->lanes) - | DSIM_MAIN_HBP((m->htotal - m->hsync_end) * bpp / dsi->lanes); + 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) * bpp / dsi->lanes); + | DSIM_MAIN_HSA(hsa); samsung_dsim_write(dsi, DSIM_MSYNC_REG, reg); } reg = DSIM_MAIN_HRESOL(m->hdisplay, num_bits_resol) | |