drm/exynos/decon5433: always do sw-trigger when vblanks enabled
authorAndrzej Hajda <a.hajda@samsung.com>
Wed, 5 Apr 2017 07:28:29 +0000 (09:28 +0200)
committerInki Dae <inki.dae@samsung.com>
Thu, 1 Jun 2017 07:21:36 +0000 (16:21 +0900)
When vblanks are enabled userspace and/or kernel can expect vblank
interrupt at declared period of time. To generate vblank interrupt
image transfer must be triggered. This patch fixes vblank timeouts
in case of sw-trigger mode.

Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos5433_drm_decon.c

index 42e8f8c74bb06824f366b9eb8cf10752aa777b49..028a6575f7d55de7e4a4749df142e558a66cfbf0 100644 (file)
@@ -49,6 +49,7 @@ static const char * const decon_clks_name[] = {
 
 enum decon_flag_bits {
        BIT_CLKS_ENABLED,
+       BIT_IRQS_ENABLED,
        BIT_WIN_UPDATED,
        BIT_SUSPENDED
 };
@@ -104,6 +105,7 @@ static int decon_enable_vblank(struct exynos_drm_crtc *crtc)
                val |= VIDINTCON0_INTFRMEN | VIDINTCON0_FRAMESEL_FP;
 
        writel(val, ctx->addr + DECON_VIDINTCON0);
+       set_bit(BIT_IRQS_ENABLED, &ctx->flags);
 
        return 0;
 }
@@ -112,6 +114,7 @@ static void decon_disable_vblank(struct exynos_drm_crtc *crtc)
 {
        struct decon_context *ctx = crtc->ctx;
 
+       clear_bit(BIT_IRQS_ENABLED, &ctx->flags);
        if (test_bit(BIT_SUSPENDED, &ctx->flags))
                return;
 
@@ -518,7 +521,8 @@ static void decon_te_irq_handler(struct exynos_drm_crtc *crtc)
            (ctx->out_type & I80_HW_TRG))
                return;
 
-       if (test_and_clear_bit(BIT_WIN_UPDATED, &ctx->flags))
+       if (test_and_clear_bit(BIT_WIN_UPDATED, &ctx->flags) ||
+           test_bit(BIT_IRQS_ENABLED, &ctx->flags))
                decon_set_bits(ctx, DECON_TRIGCON, TRIGCON_SWTRIGCMD, ~0);
 }