OSDN Git Service

drm/vc4: crtc: Create vblank reporting function
authorMaxime Ripard <maxime@cerno.tech>
Mon, 11 Jul 2022 17:38:44 +0000 (19:38 +0200)
committerMaxime Ripard <maxime@cerno.tech>
Wed, 13 Jul 2022 08:46:06 +0000 (10:46 +0200)
We'll need that code in the HVS driver, so let's create a shared function
to reuse it.

Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Link: https://lore.kernel.org/r/20220711173939.1132294-15-maxime@cerno.tech
drivers/gpu/drm/vc4/vc4_crtc.c
drivers/gpu/drm/vc4/vc4_drv.h

index 029be98..faad9e5 100644 (file)
@@ -544,6 +544,20 @@ int vc4_crtc_disable_at_boot(struct drm_crtc *crtc)
        return 0;
 }
 
+void vc4_crtc_send_vblank(struct drm_crtc *crtc)
+{
+       struct drm_device *dev = crtc->dev;
+       unsigned long flags;
+
+       if (!crtc->state || !crtc->state->event)
+               return;
+
+       spin_lock_irqsave(&dev->event_lock, flags);
+       drm_crtc_send_vblank_event(crtc, crtc->state->event);
+       crtc->state->event = NULL;
+       spin_unlock_irqrestore(&dev->event_lock, flags);
+}
+
 static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
                                    struct drm_atomic_state *state)
 {
@@ -567,14 +581,7 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
         * Make sure we issue a vblank event after disabling the CRTC if
         * someone was waiting it.
         */
-       if (crtc->state->event) {
-               unsigned long flags;
-
-               spin_lock_irqsave(&dev->event_lock, flags);
-               drm_crtc_send_vblank_event(crtc, crtc->state->event);
-               crtc->state->event = NULL;
-               spin_unlock_irqrestore(&dev->event_lock, flags);
-       }
+       vc4_crtc_send_vblank(crtc);
 }
 
 static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
index 950056b..de326cf 100644 (file)
@@ -862,6 +862,7 @@ void vc4_crtc_destroy_state(struct drm_crtc *crtc,
                            struct drm_crtc_state *state);
 void vc4_crtc_reset(struct drm_crtc *crtc);
 void vc4_crtc_handle_vblank(struct vc4_crtc *crtc);
+void vc4_crtc_send_vblank(struct drm_crtc *crtc);
 void vc4_crtc_get_margins(struct drm_crtc_state *state,
                          unsigned int *left, unsigned int *right,
                          unsigned int *top, unsigned int *bottom);