drm/imx: disable planes before DC
authorLucas Stach <l.stach@pengutronix.de>
Tue, 8 Nov 2016 16:04:10 +0000 (17:04 +0100)
committerPhilipp Zabel <p.zabel@pengutronix.de>
Wed, 9 Nov 2016 09:35:50 +0000 (10:35 +0100)
If the DC clock is disabled before the attached IDMACs are properly
stopped the IDMACs may hang the IPU or even the whole system.

Make sure the IDMACs are in safe state by disabling the planes before
removal of the DC clock.

Also set the atomic parameter to false to stop calling the atomic_begin
hook, which does nothing useful as we immediately afterwards turn off
vblank interrupts and possibly send the pending vblank event.

Fixes: 33f14235302f (drm/imx: atomic phase 1: Use transitional atomic
                     CRTC and plane helpers)
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
drivers/gpu/drm/imx/ipuv3-crtc.c

index 4e1ae3fc462dc65591d2fa5b3f6dffe3ee8a4ad4..6be515a9fb694b5fdac53d880430ba218b08e544 100644 (file)
@@ -68,6 +68,12 @@ static void ipu_crtc_atomic_disable(struct drm_crtc *crtc,
 
        ipu_dc_disable_channel(ipu_crtc->dc);
        ipu_di_disable(ipu_crtc->di);
+       /*
+        * Planes must be disabled before DC clock is removed, as otherwise the
+        * attached IDMACs will be left in undefined state, possibly hanging
+        * the IPU or even system.
+        */
+       drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, false);
        ipu_dc_disable(ipu);
 
        spin_lock_irq(&crtc->dev->event_lock);
@@ -77,9 +83,6 @@ static void ipu_crtc_atomic_disable(struct drm_crtc *crtc,
        }
        spin_unlock_irq(&crtc->dev->event_lock);
 
-       /* always disable planes on the CRTC */
-       drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, true);
-
        drm_crtc_vblank_off(crtc);
 }