drm/nouveau/kms: move drm_crtc_force_disable_all() earlier
authorBen Skeggs <bskeggs@redhat.com>
Fri, 4 Nov 2016 07:20:35 +0000 (17:20 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 7 Nov 2016 04:04:45 +0000 (14:04 +1000)
nouveau_display_fini() is responsible for quiescing the hardware, so
this is where such actions belong.

More than that, nouveau_display_fini() switches off the receiving of
sink irqs, which MST will require while shutting down an active head.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_display.h
drivers/gpu/drm/nouveau/nouveau_drm.c

index 2b9e486796622f8adcb1e653da97736e8c1b968f..081af3a4a5ca070f5efe836a090e1d6119d1e000 100644 (file)
@@ -382,13 +382,16 @@ nouveau_display_init(struct drm_device *dev)
 }
 
 void
-nouveau_display_fini(struct drm_device *dev)
+nouveau_display_fini(struct drm_device *dev, bool suspend)
 {
        struct nouveau_display *disp = nouveau_display(dev);
        struct nouveau_drm *drm = nouveau_drm(dev);
        struct drm_connector *connector;
        int head;
 
+       if (!suspend)
+               drm_crtc_force_disable_all(dev);
+
        /* Make sure that drm and hw vblank irqs get properly disabled. */
        for (head = 0; head < dev->mode_config.num_crtc; head++)
                drm_vblank_off(dev, head);
@@ -553,7 +556,6 @@ nouveau_display_destroy(struct drm_device *dev)
        nouveau_display_vblank_fini(dev);
 
        drm_kms_helper_poll_fini(dev);
-       drm_crtc_force_disable_all(dev);
        drm_mode_config_cleanup(dev);
 
        if (disp->dtor)
@@ -570,7 +572,7 @@ nouveau_display_suspend(struct drm_device *dev, bool runtime)
 {
        struct drm_crtc *crtc;
 
-       nouveau_display_fini(dev);
+       nouveau_display_fini(dev, true);
 
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                struct nouveau_framebuffer *nouveau_fb;
index 7866df8c5c1300d83325e5d60fea73253ba9cba6..3760f0e758fdc854079c32d5d9f325f70bb89890 100644 (file)
@@ -64,7 +64,7 @@ nouveau_display(struct drm_device *dev)
 int  nouveau_display_create(struct drm_device *dev);
 void nouveau_display_destroy(struct drm_device *dev);
 int  nouveau_display_init(struct drm_device *dev);
-void nouveau_display_fini(struct drm_device *dev);
+void nouveau_display_fini(struct drm_device *dev, bool suspend);
 int  nouveau_display_suspend(struct drm_device *dev, bool runtime);
 void nouveau_display_resume(struct drm_device *dev, bool runtime);
 int  nouveau_display_vblank_enable(struct drm_device *, unsigned int);
index 62288152c8423b55d0886463812497b5c27ce63b..9876e6fcfcf06428e405ff67ead10c4ee0791ca1 100644 (file)
@@ -519,7 +519,7 @@ nouveau_drm_unload(struct drm_device *dev)
        nouveau_debugfs_fini(drm);
 
        if (dev->mode_config.num_crtc)
-               nouveau_display_fini(dev);
+               nouveau_display_fini(dev, false);
        nouveau_display_destroy(dev);
 
        nouveau_bios_takedown(dev);