drm/armada: fix missing overlay wake-up
authorRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 15 Jun 2015 09:13:29 +0000 (10:13 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 15 Jul 2015 15:45:29 +0000 (16:45 +0100)
Nothing was waking up the overlay plane wait queue, so we were fully
reliant on the HZ/25 wait timing out to make progress.  Fix the lack
of wake-up.

We were also mis-handling the wait_event_timeout() return value - this
returns an unsigned integer of the remaining time, or zero on timeout
and the condition evaluated false.  Checking this for less than zero
is not sane.

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

index c5b06fdb459c4560c46dd68a9c52314f87c319b0..0abf785f5d0f183c8a0715613d023ec5ff0f526c 100644 (file)
@@ -85,6 +85,8 @@ static void armada_plane_vbl(struct armada_crtc *dcrtc, void *data)
 
        if (fb)
                armada_drm_queue_unref_work(dcrtc->crtc.dev, fb);
+
+       wake_up(&dplane->vbl.wait);
 }
 
 static unsigned armada_limit(int start, unsigned size, unsigned max)
@@ -150,11 +152,9 @@ armada_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
                               dcrtc->base + LCD_SPU_SRAM_PARA1);
        }
 
-       ret = wait_event_timeout(dplane->vbl.wait,
-                                list_empty(&dplane->vbl.update.node),
-                                HZ/25);
-       if (ret < 0)
-               return ret;
+       wait_event_timeout(dplane->vbl.wait,
+                          list_empty(&dplane->vbl.update.node),
+                          HZ/25);
 
        if (plane->fb != fb) {
                struct armada_gem_object *obj = drm_fb_obj(fb);