Because the HDLCD lacks a hardware counter for vsync signal, the DRM
framework expects that the vsync interrupts are left running to feed
the internal software counter. Currently the HDLCD is masking/unmasking
the vsync interrupt on vblank enable/disable calls, which break that
expectation. Fix that.

Signed-off-by: Liviu Dudau <Liviu.Dudau at arm.com>
---
 drivers/gpu/drm/arm/hdlcd_drv.c | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c
index fb172d2..3f92dfa 100644
--- a/drivers/gpu/drm/arm/hdlcd_drv.c
+++ b/drivers/gpu/drm/arm/hdlcd_drv.c
@@ -183,9 +183,13 @@ static int hdlcd_irq_postinstall(struct drm_device *drm)

        /* enable debug interrupts */
        irq_mask |= HDLCD_DEBUG_INT_MASK;
+#endif
+
+       /* enable vsync interrupts */
+       irq_mask |= HDLCD_INTERRUPT_VSYNC;

        hdlcd_write(hdlcd, HDLCD_REG_INT_MASK, irq_mask);
-#endif
+
        return 0;
 }

@@ -208,20 +212,11 @@ static void hdlcd_irq_uninstall(struct drm_device *drm)

 static int hdlcd_enable_vblank(struct drm_device *drm, unsigned int crtc)
 {
-       struct hdlcd_drm_private *hdlcd = drm->dev_private;
-       unsigned int mask = hdlcd_read(hdlcd, HDLCD_REG_INT_MASK);
-
-       hdlcd_write(hdlcd, HDLCD_REG_INT_MASK, mask | HDLCD_INTERRUPT_VSYNC);
-
        return 0;
 }

 static void hdlcd_disable_vblank(struct drm_device *drm, unsigned int crtc)
 {
-       struct hdlcd_drm_private *hdlcd = drm->dev_private;
-       unsigned int mask = hdlcd_read(hdlcd, HDLCD_REG_INT_MASK);
-
-       hdlcd_write(hdlcd, HDLCD_REG_INT_MASK, mask & ~HDLCD_INTERRUPT_VSYNC);
 }

 #ifdef CONFIG_DEBUG_FS
-- 
2.8.2

Reply via email to