drm/armada: move overlay plane work out from under spinlock
authorRussell King <rmk+kernel@armlinux.org.uk>
Sat, 8 Jul 2017 09:16:48 +0000 (10:16 +0100)
committerRussell King <rmk+kernel@armlinux.org.uk>
Fri, 8 Dec 2017 12:18:46 +0000 (12:18 +0000)
Move the overlay plane work out from under the spinlock so that both the
primary and overlay planes run their work in the same context.  This is
necessary so that we can use frame works with the overlay plane.

However, we must update the CRTC registers under the spinlock, so fix up
the overlay code for that.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
drivers/gpu/drm/armada/armada_crtc.c
drivers/gpu/drm/armada/armada_overlay.c

index bedcaed81ffa4ec140415f0c6e097ce79ed107fb..be3fd82ef516a52e5d5a611747c64e0080e0506a 100644 (file)
@@ -471,11 +471,11 @@ static void armada_drm_crtc_irq(struct armada_crtc *dcrtc, u32 stat)
        if (stat & VSYNC_IRQ)
                drm_crtc_handle_vblank(&dcrtc->crtc);
 
-       spin_lock(&dcrtc->irq_lock);
        ovl_plane = dcrtc->plane;
        if (ovl_plane)
                armada_drm_plane_work_run(dcrtc, ovl_plane);
 
+       spin_lock(&dcrtc->irq_lock);
        if (stat & GRA_FRAME_IRQ && dcrtc->interlaced) {
                int i = stat & GRA_FRAME_IRQ0 ? 0 : 1;
                uint32_t val;
index 995463cd542d8f20cf3aaf09465735745ae03086..04746ade74e643d869e87c5fbfbf602265ffd2d7 100644 (file)
@@ -84,10 +84,14 @@ static void armada_ovl_plane_work(struct armada_crtc *dcrtc,
 {
        struct armada_ovl_plane *dplane = container_of(work->plane,
                                        struct armada_ovl_plane, base.base);
+       unsigned long flags;
 
        trace_armada_ovl_plane_work(&dcrtc->crtc, work->plane);
 
+       spin_lock_irqsave(&dcrtc->irq_lock, flags);
        armada_drm_crtc_update_regs(dcrtc, dplane->vbl.regs);
+       spin_unlock_irqrestore(&dcrtc->irq_lock, flags);
+
        armada_ovl_retire_fb(dplane, NULL);
 }