drm/tilcdc: disable the lcd controller/dma engine when suspend invoked
authorDarren Etheridge <detheridge@ti.com>
Thu, 25 Sep 2014 00:59:32 +0000 (00:59 +0000)
committerJyri Sarha <jsarha@ti.com>
Thu, 25 Feb 2016 14:39:32 +0000 (16:39 +0200)
The LCD controller must be deactivated and all DMA transactions stopped
when the suspend power state is entered otherwise the PRCM causes the L3
bus to get stuck in transition state.

This commit forces the lcdc to be shut down and waits for all pending DMA
transactions to complete as part of the suspend handler for this driver.

Signed-off-by: Darren Etheridge <detheridge@ti.com>
Tested-by: Dave Gerlach <d-gerlach@ti.com>
Signed-off-by: Jyri Sarha <jsarha@ti.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/gpu/drm/tilcdc/tilcdc_crtc.c
drivers/gpu/drm/tilcdc/tilcdc_drv.c
drivers/gpu/drm/tilcdc/tilcdc_drv.h

index 6485e1c03fe31606a50492bba8a88469360d21c4..465fd047875a9972856321fa1dafe0c2802209c6 100644 (file)
@@ -138,7 +138,6 @@ static void stop(struct drm_crtc *crtc)
        tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE);
 }
 
-static void tilcdc_crtc_dpms(struct drm_crtc *crtc, int mode);
 static void tilcdc_crtc_destroy(struct drm_crtc *crtc)
 {
        struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
@@ -192,7 +191,7 @@ static int tilcdc_crtc_page_flip(struct drm_crtc *crtc,
        return 0;
 }
 
-static void tilcdc_crtc_dpms(struct drm_crtc *crtc, int mode)
+void tilcdc_crtc_dpms(struct drm_crtc *crtc, int mode)
 {
        struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
        struct drm_device *dev = crtc->dev;
index 7c39362c9455280ca1a9a955f9b2729504750c21..30d8ac61cc85fb212b2f2feae4d7e819f5a401c8 100644 (file)
@@ -592,6 +592,9 @@ static int tilcdc_pm_suspend(struct device *dev)
                return 0;
        }
 
+       /* Disable the LCDC controller, to avoid locking up the PRCM */
+       tilcdc_crtc_dpms(priv->crtc, DRM_MODE_DPMS_OFF);
+
        /* Save register state: */
        for (i = 0; i < ARRAY_SIZE(registers); i++)
                if (registers[i].save && (priv->rev >= registers[i].rev))
index 55d17b3466c47f108447f2211f29b4f72c463e75..95324f19d891905611873bfd2006c07a0928e0fb 100644 (file)
@@ -171,5 +171,6 @@ void tilcdc_crtc_set_simulate_vesa_sync(struct drm_crtc *crtc,
                                        bool simulate_vesa_sync);
 int tilcdc_crtc_mode_valid(struct drm_crtc *crtc, struct drm_display_mode *mode);
 int tilcdc_crtc_max_width(struct drm_crtc *crtc);
+void tilcdc_crtc_dpms(struct drm_crtc *crtc, int mode);
 
 #endif /* __TILCDC_DRV_H__ */