drm: omapdrm: Fix race condition between GO and vblank IRQ
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 13 Jan 2015 07:14:53 +0000 (09:14 +0200)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Fri, 20 Mar 2015 12:30:18 +0000 (14:30 +0200)
The vblank interrupt is used by the driver as a completion signal when
applying new settings.

A race condition exist between enabling the vblank interrupt and
applying new settings to the hardware by setting the GO bit. If a vblank
interrupt occurs in-between, the driver will incorrectly consider the
new settings to be applied. Fix this by enabling the interrupt after
setting the GO bit.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
drivers/gpu/drm/omapdrm/omap_crtc.c

index c7d3e1eec6cb11235735a4fe12fbf81790d8c318..3f811186c8914c9225c89e52820c40774bd7ec5a 100644 (file)
@@ -501,8 +501,8 @@ static void apply_worker(struct work_struct *work)
                DBG("%s: GO", omap_crtc->name);
 
                if (dispc_mgr_is_enabled(channel)) {
-                       omap_irq_register(dev, &omap_crtc->apply_irq);
                        dispc_mgr_go(channel);
+                       omap_irq_register(dev, &omap_crtc->apply_irq);
                } else {
                        struct omap_drm_private *priv = dev->dev_private;
                        queue_work(priv->wq, &omap_crtc->apply_work);