drm/tilcdc: Do not keep vblank interrupts enabled all the time
authorJyri Sarha <jsarha@ti.com>
Sat, 10 Oct 2020 17:00:58 +0000 (20:00 +0300)
committerJyri Sarha <jsarha@ti.com>
Sat, 10 Oct 2020 17:02:06 +0000 (20:02 +0300)
END_OF_FRAME interrupts have been enabled all the time since the
beginning of this driver. It is about time to add this feature.

Signed-off-by: Jyri Sarha <jsarha@ti.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/fb87adebaffe8c7cb4fe7e909a45d47af08d7c6e.1602349100.git.jsarha@ti.com
drivers/gpu/drm/tilcdc/tilcdc_crtc.c

index cf4ead0..0fd3daf 100644 (file)
@@ -147,12 +147,9 @@ static void tilcdc_crtc_enable_irqs(struct drm_device *dev)
                tilcdc_set(dev, LCDC_RASTER_CTRL_REG,
                        LCDC_V1_SYNC_LOST_INT_ENA | LCDC_V1_FRAME_DONE_INT_ENA |
                        LCDC_V1_UNDERFLOW_INT_ENA);
-               tilcdc_set(dev, LCDC_DMA_CTRL_REG,
-                       LCDC_V1_END_OF_FRAME_INT_ENA);
        } else {
                tilcdc_write(dev, LCDC_INT_ENABLE_SET_REG,
                        LCDC_V2_UNDERFLOW_INT_ENA |
-                       LCDC_V2_END_OF_FRAME0_INT_ENA |
                        LCDC_FRAME_DONE | LCDC_SYNC_LOST);
        }
 }
@@ -678,11 +675,44 @@ static int tilcdc_crtc_atomic_check(struct drm_crtc *crtc,
 
 static int tilcdc_crtc_enable_vblank(struct drm_crtc *crtc)
 {
+       struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+       struct tilcdc_drm_private *priv = dev->dev_private;
+       unsigned long flags;
+
+       spin_lock_irqsave(&tilcdc_crtc->irq_lock, flags);
+
+       tilcdc_clear_irqstatus(dev, LCDC_END_OF_FRAME0);
+
+       if (priv->rev == 1)
+               tilcdc_set(dev, LCDC_DMA_CTRL_REG,
+                          LCDC_V1_END_OF_FRAME_INT_ENA);
+       else
+               tilcdc_set(dev, LCDC_INT_ENABLE_SET_REG,
+                          LCDC_V2_END_OF_FRAME0_INT_ENA);
+
+       spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
+
        return 0;
 }
 
 static void tilcdc_crtc_disable_vblank(struct drm_crtc *crtc)
 {
+       struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+       struct tilcdc_drm_private *priv = dev->dev_private;
+       unsigned long flags;
+
+       spin_lock_irqsave(&tilcdc_crtc->irq_lock, flags);
+
+       if (priv->rev == 1)
+               tilcdc_clear(dev, LCDC_DMA_CTRL_REG,
+                            LCDC_V1_END_OF_FRAME_INT_ENA);
+       else
+               tilcdc_clear(dev, LCDC_INT_ENABLE_SET_REG,
+                            LCDC_V2_END_OF_FRAME0_INT_ENA);
+
+       spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
 }
 
 static void tilcdc_crtc_reset(struct drm_crtc *crtc)