]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/exynos: exynos7_drm_decon: remove ctx->suspended
authorKaustabh Chakraborty <kauschluss@disroot.org>
Sun, 6 Jul 2025 17:29:46 +0000 (22:59 +0530)
committerInki Dae <inki.dae@samsung.com>
Mon, 15 Sep 2025 11:19:21 +0000 (20:19 +0900)
Condition guards are found to be redundant, as the call flow is properly
managed now, as also observed in the Exynos5433 DECON driver. Since
state checking is no longer necessary, remove it.

This also fixes an issue which prevented decon_commit() from
decon_atomic_enable() due to an incorrect state change setting.

Fixes: 96976c3d9aff ("drm/exynos: Add DECON driver")
Cc: stable@vger.kernel.org
Suggested-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kaustabh Chakraborty <kauschluss@disroot.org>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos7_drm_decon.c

index 805aa28c1723000354bb50f348dbc91ab1dffa2b..b8d9b72513199e36a0d09afd12a78370373b4d91 100644 (file)
@@ -69,7 +69,6 @@ struct decon_context {
        void __iomem                    *regs;
        unsigned long                   irq_flags;
        bool                            i80_if;
-       bool                            suspended;
        wait_queue_head_t               wait_vsync_queue;
        atomic_t                        wait_vsync_event;
 
@@ -132,9 +131,6 @@ static void decon_shadow_protect_win(struct decon_context *ctx,
 
 static void decon_wait_for_vblank(struct decon_context *ctx)
 {
-       if (ctx->suspended)
-               return;
-
        atomic_set(&ctx->wait_vsync_event, 1);
 
        /*
@@ -210,9 +206,6 @@ static void decon_commit(struct exynos_drm_crtc *crtc)
        struct drm_display_mode *mode = &crtc->base.state->adjusted_mode;
        u32 val, clkdiv;
 
-       if (ctx->suspended)
-               return;
-
        /* nothing to do if we haven't set the mode yet */
        if (mode->htotal == 0 || mode->vtotal == 0)
                return;
@@ -274,9 +267,6 @@ static int decon_enable_vblank(struct exynos_drm_crtc *crtc)
        struct decon_context *ctx = crtc->ctx;
        u32 val;
 
-       if (ctx->suspended)
-               return -EPERM;
-
        if (!test_and_set_bit(0, &ctx->irq_flags)) {
                val = readl(ctx->regs + VIDINTCON0);
 
@@ -299,9 +289,6 @@ static void decon_disable_vblank(struct exynos_drm_crtc *crtc)
        struct decon_context *ctx = crtc->ctx;
        u32 val;
 
-       if (ctx->suspended)
-               return;
-
        if (test_and_clear_bit(0, &ctx->irq_flags)) {
                val = readl(ctx->regs + VIDINTCON0);
 
@@ -404,9 +391,6 @@ static void decon_atomic_begin(struct exynos_drm_crtc *crtc)
        struct decon_context *ctx = crtc->ctx;
        int i;
 
-       if (ctx->suspended)
-               return;
-
        for (i = 0; i < WINDOWS_NR; i++)
                decon_shadow_protect_win(ctx, i, true);
 }
@@ -427,9 +411,6 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
        unsigned int pitch = fb->pitches[0];
        unsigned int vidw_addr0_base = ctx->data->vidw_buf_start_base;
 
-       if (ctx->suspended)
-               return;
-
        /*
         * SHADOWCON/PRTCON register is used for enabling timing.
         *
@@ -517,9 +498,6 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc,
        unsigned int win = plane->index;
        u32 val;
 
-       if (ctx->suspended)
-               return;
-
        /* protect windows */
        decon_shadow_protect_win(ctx, win, true);
 
@@ -538,9 +516,6 @@ static void decon_atomic_flush(struct exynos_drm_crtc *crtc)
        struct decon_context *ctx = crtc->ctx;
        int i;
 
-       if (ctx->suspended)
-               return;
-
        for (i = 0; i < WINDOWS_NR; i++)
                decon_shadow_protect_win(ctx, i, false);
        exynos_crtc_handle_event(crtc);
@@ -568,9 +543,6 @@ static void decon_atomic_enable(struct exynos_drm_crtc *crtc)
        struct decon_context *ctx = crtc->ctx;
        int ret;
 
-       if (!ctx->suspended)
-               return;
-
        ret = pm_runtime_resume_and_get(ctx->dev);
        if (ret < 0) {
                DRM_DEV_ERROR(ctx->dev, "failed to enable DECON device.\n");
@@ -584,8 +556,6 @@ static void decon_atomic_enable(struct exynos_drm_crtc *crtc)
                decon_enable_vblank(ctx->crtc);
 
        decon_commit(ctx->crtc);
-
-       ctx->suspended = false;
 }
 
 static void decon_atomic_disable(struct exynos_drm_crtc *crtc)
@@ -593,9 +563,6 @@ static void decon_atomic_disable(struct exynos_drm_crtc *crtc)
        struct decon_context *ctx = crtc->ctx;
        int i;
 
-       if (ctx->suspended)
-               return;
-
        /*
         * We need to make sure that all windows are disabled before we
         * suspend that connector. Otherwise we might try to scan from
@@ -605,8 +572,6 @@ static void decon_atomic_disable(struct exynos_drm_crtc *crtc)
                decon_disable_plane(crtc, &ctx->planes[i]);
 
        pm_runtime_put_sync(ctx->dev);
-
-       ctx->suspended = true;
 }
 
 static const struct exynos_drm_crtc_ops decon_crtc_ops = {
@@ -727,7 +692,6 @@ static int decon_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        ctx->dev = dev;
-       ctx->suspended = true;
        ctx->data = of_device_get_match_data(dev);
 
        i80_if_timings = of_get_child_by_name(dev->of_node, "i80-if-timings");