drm/nouveau: Queue hpd_work on (runtime) resume
authorHans de Goede <hdegoede@redhat.com>
Mon, 21 Nov 2016 16:50:55 +0000 (17:50 +0100)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 28 Nov 2016 05:39:35 +0000 (15:39 +1000)
We need to call drm_helper_hpd_irq_event() on resume to properly detect
monitor connection / disconnection on some laptops, use hpd_work for
this to avoid deadlocks.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_drm.c

index 9876e6fcfcf06428e405ff67ead10c4ee0791ca1..064a925ed69abc633605101b1793a7bd978e82c1 100644 (file)
@@ -699,7 +699,12 @@ nouveau_pmops_resume(struct device *dev)
                return ret;
        pci_set_master(pdev);
 
-       return nouveau_do_resume(drm_dev, false);
+       ret = nouveau_do_resume(drm_dev, false);
+
+       /* Monitors may have been connected / disconnected during suspend */
+       schedule_work(&nouveau_drm(drm_dev)->hpd_work);
+
+       return ret;
 }
 
 static int
@@ -773,6 +778,10 @@ nouveau_pmops_runtime_resume(struct device *dev)
        nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25));
        vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON);
        drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
+
+       /* Monitors may have been connected / disconnected during suspend */
+       schedule_work(&nouveau_drm(drm_dev)->hpd_work);
+
        return ret;
 }