]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/mcde: Provide vblank handling unconditionally
authorStephan Gerhold <stephan@gerhold.net>
Wed, 6 Nov 2019 16:58:29 +0000 (17:58 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Sat, 9 Nov 2019 21:18:21 +0000 (22:18 +0100)
At the moment, vblank handling is only enabled together with
TE synchronization. However, the vblank IRQ is also working with
on displays without TE synchronization (e.g. DSI video mode panels).
It seems like the vblank IRQ is actually generated by the
MCDE hardware for the channel.

Therefore, the vblank handling should be working correctly in
all the cases and we can enable it unconditionally.

Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20191106165835.2863-2-stephan@gerhold.net
drivers/gpu/drm/mcde/mcde_display.c
drivers/gpu/drm/mcde/mcde_drv.c

index 751454ae3cd10e473978393426dd1922d9e84d7e..65522481b36721789821bb665ece400d5c081913 100644 (file)
@@ -934,10 +934,10 @@ static void mcde_display_enable(struct drm_simple_display_pipe *pipe,
                val = readl(mcde->regs + MCDE_CRC);
                val |= MCDE_CRC_SYCEN0;
                writel(val, mcde->regs + MCDE_CRC);
-
-               drm_crtc_vblank_on(crtc);
        }
 
+       drm_crtc_vblank_on(crtc);
+
        dev_info(drm->dev, "MCDE display is enabled\n");
 }
 
@@ -947,8 +947,7 @@ static void mcde_display_disable(struct drm_simple_display_pipe *pipe)
        struct drm_device *drm = crtc->dev;
        struct mcde *mcde = drm->dev_private;
 
-       if (mcde->te_sync)
-               drm_crtc_vblank_off(crtc);
+       drm_crtc_vblank_off(crtc);
 
        /* Disable FIFO A flow */
        mcde_disable_fifo(mcde, MCDE_FIFO_A, true);
@@ -1097,6 +1096,8 @@ static struct drm_simple_display_pipe_funcs mcde_display_funcs = {
        .enable = mcde_display_enable,
        .disable = mcde_display_disable,
        .update = mcde_display_update,
+       .enable_vblank = mcde_display_enable_vblank,
+       .disable_vblank = mcde_display_disable_vblank,
        .prepare_fb = drm_gem_fb_simple_display_pipe_prepare_fb,
 };
 
@@ -1123,12 +1124,6 @@ int mcde_display_init(struct drm_device *drm)
                DRM_FORMAT_YUV422,
        };
 
-       /* Provide vblank only when we have TE enabled */
-       if (mcde->te_sync) {
-               mcde_display_funcs.enable_vblank = mcde_display_enable_vblank;
-               mcde_display_funcs.disable_vblank = mcde_display_disable_vblank;
-       }
-
        ret = drm_simple_display_pipe_init(drm, &mcde->pipe,
                                           &mcde_display_funcs,
                                           formats, ARRAY_SIZE(formats),
index 5649887d2b90126d17ea37c89fd699ab1b3d6777..0ccd3b0308c2fbfdb8255dd3203fd76ba4451b5a 100644 (file)
@@ -179,18 +179,10 @@ static int mcde_modeset_init(struct drm_device *drm)
        mode_config->min_height = 1;
        mode_config->max_height = 1080;
 
-       /*
-        * Currently we only support vblank handling on the DSI bridge, using
-        * TE synchronization. If TE sync is not set up, it is still possible
-        * to push out a single update on demand, but this is hard for DRM to
-        * exploit.
-        */
-       if (mcde->te_sync) {
-               ret = drm_vblank_init(drm, 1);
-               if (ret) {
-                       dev_err(drm->dev, "failed to init vblank\n");
-                       goto out_config;
-               }
+       ret = drm_vblank_init(drm, 1);
+       if (ret) {
+               dev_err(drm->dev, "failed to init vblank\n");
+               goto out_config;
        }
 
        ret = mcde_display_init(drm);