@@ -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
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@arm.com> --- drivers/gpu/drm/arm/hdlcd_drv.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-)