drm/exynos/decon5433: merge interrupt handlers
authorAndrzej Hajda <a.hajda@samsung.com>
Wed, 6 Jul 2016 06:13:12 +0000 (08:13 +0200)
committerInki Dae <inki.dae@samsung.com>
Fri, 8 Jul 2016 09:40:06 +0000 (18:40 +0900)
Both interrupt handlers do almost the same things, merging will simplify
the code.

Change-Id: I53fc1fbc0fa4ca00fdb5aa266b959427bd7f1f2a
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
drivers/gpu/drm/exynos/exynos5433_drm_decon.c

index 873481e4a5abed0b104a75304aada1d24da17878..fb32d662dd5d75f9093344b6d65eee66271cc821 100644 (file)
@@ -730,7 +730,7 @@ static const struct component_ops decon_component_ops = {
        .unbind = decon_unbind,
 };
 
-static irqreturn_t decon_vsync_irq_handler(int irq, void *dev_id)
+static irqreturn_t decon_irq_handler(int irq, void *dev_id)
 {
        struct decon_context *ctx = dev_id;
        u32 val;
@@ -739,37 +739,11 @@ static irqreturn_t decon_vsync_irq_handler(int irq, void *dev_id)
                goto out;
 
        val = readl(ctx->addr + DECON_VIDINTCON1);
-       if (val & VIDINTCON1_INTFRMPEND) {
+       val &= ctx->i80_if ? VIDINTCON1_INTFRMDONEPEND : VIDINTCON1_INTFRMPEND;
+       if (val) {
+               writel(val, ctx->addr + DECON_VIDINTCON1);
                drm_handle_vblank(ctx->drm_dev, ctx->pipe);
                exynos_drm_crtc_finish_pageflip(ctx->drm_dev, ctx->pipe);
-
-               /* clear */
-               writel(VIDINTCON1_INTFRMPEND, ctx->addr + DECON_VIDINTCON1);
-       }
-
-out:
-       /* set wait vsync event to zero and wake up queue. */
-       if (atomic_read(&ctx->wait_vsync_event)) {
-               atomic_set(&ctx->wait_vsync_event, 0);
-               wake_up(&ctx->wait_vsync_queue);
-       }
-
-       return IRQ_HANDLED;
-}
-
-static irqreturn_t decon_lcd_sys_irq_handler(int irq, void *dev_id)
-{
-       struct decon_context *ctx = dev_id;
-       u32 val;
-
-       if (!test_bit(BIT_CLKS_ENABLED, &ctx->enabled))
-               goto out;
-
-       val = readl(ctx->addr + DECON_VIDINTCON1);
-       if (val & VIDINTCON1_INTFRMDONEPEND) {
-               drm_handle_vblank(ctx->drm_dev, ctx->pipe);
-               exynos_drm_crtc_finish_pageflip(ctx->drm_dev, ctx->pipe);
-               writel(VIDINTCON1_INTFRMDONEPEND, ctx->addr + DECON_VIDINTCON1);
        }
 
 out:
@@ -848,8 +822,7 @@ static int exynos5433_decon_probe(struct platform_device *pdev)
                return -ENXIO;
        }
 
-       ret = devm_request_irq(dev, res->start, ctx->i80_if ?
-                       decon_lcd_sys_irq_handler : decon_vsync_irq_handler, 0,
+       ret = devm_request_irq(dev, res->start, decon_irq_handler, 0,
                        "drm_decon", ctx);
        if (ret < 0) {
                dev_err(dev, "lcd_sys irq request failed\n");