diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c index 4ab5bfc236477..ac21b40008358 100644 --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c @@ -147,11 +147,13 @@ static void decon_commit(struct exynos_drm_crtc *crtc) val = CMU_CLKGAGE_MODE_SFR_F | CMU_CLKGAGE_MODE_MEM_F; writel(val, ctx->addr + DECON_CMU); + if (ctx->out_type & (IFTYPE_I80 | I80_HW_TRG)) + decon_setup_trigger(ctx); + /* lcd on and use command if */ val = VIDOUT_LCD_ON; if (ctx->out_type & IFTYPE_I80) { val |= VIDOUT_COMMAND_IF; - decon_setup_trigger(ctx); } else { val |= VIDOUT_RGB_IF; } @@ -376,9 +378,6 @@ static void decon_swreset(struct decon_context *ctx) writel(VIDCON1_VCLK_RUN_VDEN_DISABLE, ctx->addr + DECON_VIDCON1); writel(CRCCTRL_CRCEN | CRCCTRL_CRCSTART_F | CRCCTRL_CRCCLKEN, ctx->addr + DECON_CRCCTRL); - - if (ctx->out_type & IFTYPE_I80) - decon_setup_trigger(ctx); } static void decon_enable(struct exynos_drm_crtc *crtc) @@ -434,13 +433,12 @@ static void decon_te_irq_handler(struct exynos_drm_crtc *crtc) { struct decon_context *ctx = crtc->ctx; - if (!test_bit(BIT_CLKS_ENABLED, &ctx->flags)) + if (!test_bit(BIT_CLKS_ENABLED, &ctx->flags) || + (ctx->out_type & I80_HW_TRG)) return; if (test_and_clear_bit(BIT_WIN_UPDATED, &ctx->flags)) decon_set_bits(ctx, DECON_TRIGCON, TRIGCON_SWTRIGCMD, ~0); - - drm_crtc_handle_vblank(&ctx->crtc->base); } static void decon_clear_channels(struct exynos_drm_crtc *crtc) @@ -573,6 +571,7 @@ static irqreturn_t decon_irq_handler(int irq, void *dev_id) /* clear */ writel(val, ctx->addr + DECON_VIDINTCON1); + drm_crtc_handle_vblank(&ctx->crtc->base); } out: @@ -648,9 +647,8 @@ static int exynos5433_decon_probe(struct platform_device *pdev) if (ctx->out_type & IFTYPE_HDMI) { ctx->first_win = 1; - ctx->out_type = IFTYPE_I80; } else if (of_get_child_by_name(dev->of_node, "i80-if-timings")) { - ctx->out_type = IFTYPE_I80; + ctx->out_type |= IFTYPE_I80; } for (i = 0; i < ARRAY_SIZE(decon_clks_name); i++) { diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index 50dd33d5045d6..785ffa6cc3097 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c @@ -233,20 +233,15 @@ void exynos_drm_crtc_cancel_page_flip(struct drm_crtc *crtc, unsigned long flags; spin_lock_irqsave(&crtc->dev->event_lock, flags); + e = exynos_crtc->event; if (e && e->base.file_priv == file) { exynos_crtc->event = NULL; - /* - * event will be destroyed by core part - * so below line should be removed later with core changes - */ - e->base.destroy(&e->base); - /* - * event_space will be increased by core part - * so below line should be removed later with core changes. - */ - file->event_space += sizeof(e->event); atomic_dec(&exynos_crtc->pending_update); } + spin_unlock_irqrestore(&crtc->dev->event_lock, flags); + + if (e && e->base.file_priv == file) + drm_event_cancel_free(crtc->dev, &e->base); } diff --git a/drivers/gpu/drm/exynos/exynos_drm_dpi.c b/drivers/gpu/drm/exynos/exynos_drm_dpi.c index 75e570f45259d..5e38e749ac17e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dpi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dpi.c @@ -15,6 +15,7 @@ #include #include +#include #include #include