drm/sun4i: sun6i_mipi_dsi: Fix hsync_porch overflow
authorJagan Teki <jagan@amarulasolutions.com>
Sun, 12 May 2019 18:41:26 +0000 (00:11 +0530)
committerMaxime Ripard <maxime.ripard@bootlin.com>
Thu, 16 May 2019 08:59:19 +0000 (10:59 +0200)
Loop N1 instruction delay for burst mode devices are computed
based on horizontal sync and porch timing values.

The current driver is using u16 type for computing this hsync_porch
value, which would failed to fit within the u16 type for large sync
and porch timings devices. This would result in hsync_porch overflow
and eventually computed wrong instruction delay value.

Example, timings, where it produces the overflow
{
.hdisplay       = 1080,
.hsync_start    = 1080 + 408,
        .hsync_end      = 1080 + 408 + 4,
        .htotal         = 1080 + 408 + 4 + 38,
}

It reproduces the desired delay value 65487 but the correct working
value should be 7.

So, Fix it by computing hsync_porch value separately with u32 type.

Fixes: 1c1a7aa3663c ("drm/sun4i: dsi: Add burst support")
Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190512184128.13720-2-jagan@amarulasolutions.com
drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c

index 6ff585055a07bace5f66bc5ab7b1d2a527842762..bfa7e2b146dfbfa0787765464f52a537e76ab676 100644 (file)
@@ -457,8 +457,9 @@ static void sun6i_dsi_setup_inst_loop(struct sun6i_dsi *dsi,
        u16 delay = 50 - 1;
 
        if (device->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) {
-               delay = (mode->htotal - mode->hdisplay) * 150;
-               delay /= (mode->clock / 1000) * 8;
+               u32 hsync_porch = (mode->htotal - mode->hdisplay) * 150;
+
+               delay = (hsync_porch / ((mode->clock / 1000) * 8));
                delay -= 50;
        }