drm/nouveau: fix suspend/resume when in headless mode
authorBen Skeggs <bskeggs@redhat.com>
Thu, 1 Nov 2012 06:16:31 +0000 (16:16 +1000)
committerBen Hutchings <ben@decadent.org.uk>
Fri, 16 Nov 2012 16:46:47 +0000 (16:46 +0000)
commit 9430738d80223a1cd791a2baa74fa170d3df1262 upstream.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
[jrnieder@gmail.com: backport to 3.2: make fbcon suspend/resume
 handling conditional in a vague hope that this will approximate what
 the original does for 3.3+]
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/gpu/drm/nouveau/nouveau_drv.c

index 9791d13..4ab35b5 100644 (file)
@@ -178,8 +178,10 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
        if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
                return 0;
 
-       NV_INFO(dev, "Disabling fbcon acceleration...\n");
-       nouveau_fbcon_save_disable_accel(dev);
+       if (dev->mode_config.num_crtc) {
+               NV_INFO(dev, "Disabling fbcon acceleration...\n");
+               nouveau_fbcon_save_disable_accel(dev);
+       }
 
        NV_INFO(dev, "Unpinning framebuffer(s)...\n");
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
@@ -246,10 +248,12 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
                pci_set_power_state(pdev, PCI_D3hot);
        }
 
-       console_lock();
-       nouveau_fbcon_set_suspend(dev, 1);
-       console_unlock();
-       nouveau_fbcon_restore_accel(dev);
+       if (dev->mode_config.num_crtc) {
+               console_lock();
+               nouveau_fbcon_set_suspend(dev, 1);
+               console_unlock();
+               nouveau_fbcon_restore_accel(dev);
+       }
        return 0;
 
 out_abort:
@@ -275,7 +279,8 @@ nouveau_pci_resume(struct pci_dev *pdev)
        if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
                return 0;
 
-       nouveau_fbcon_save_disable_accel(dev);
+       if (dev->mode_config.num_crtc)
+               nouveau_fbcon_save_disable_accel(dev);
 
        NV_INFO(dev, "We're back, enabling device...\n");
        pci_set_power_state(pdev, PCI_D0);
@@ -376,15 +381,18 @@ nouveau_pci_resume(struct pci_dev *pdev)
                nv_crtc->lut.depth = 0;
        }
 
-       console_lock();
-       nouveau_fbcon_set_suspend(dev, 0);
-       console_unlock();
+       if (dev->mode_config.num_crtc) {
+               console_lock();
+               nouveau_fbcon_set_suspend(dev, 0);
+               console_unlock();
 
-       nouveau_fbcon_zfill_all(dev);
+               nouveau_fbcon_zfill_all(dev);
+       }
 
        drm_helper_resume_force_mode(dev);
 
-       nouveau_fbcon_restore_accel(dev);
+       if (dev->mode_config.num_crtc)
+               nouveau_fbcon_restore_accel(dev);
        return 0;
 }