Merge tag 'drm-for-v4.15' of git://people.freedesktop.org/~airlied/linux
[sfrench/cifs-2.6.git] / drivers / gpu / drm / i915 / intel_display.c
index f4a9a182868f50dc0cd3f04c69de73909e94216a..878acc432a4b0c7ad3ea4774696928309756b207 100644 (file)
@@ -15196,6 +15196,23 @@ void intel_connector_unregister(struct drm_connector *connector)
        intel_panel_destroy_backlight(connector);
 }
 
+static void intel_hpd_poll_fini(struct drm_device *dev)
+{
+       struct intel_connector *connector;
+       struct drm_connector_list_iter conn_iter;
+
+       /* First disable polling... */
+       drm_kms_helper_poll_fini(dev);
+
+       /* Then kill the work that may have been queued by hpd. */
+       drm_connector_list_iter_begin(dev, &conn_iter);
+       for_each_intel_connector_iter(connector, &conn_iter) {
+               if (connector->modeset_retry_work.func)
+                       cancel_work_sync(&connector->modeset_retry_work);
+       }
+       drm_connector_list_iter_end(&conn_iter);
+}
+
 void intel_modeset_cleanup(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
@@ -15216,7 +15233,7 @@ void intel_modeset_cleanup(struct drm_device *dev)
         * Due to the hpd irq storm handling the hotplug work can re-arm the
         * poll handlers. Hence disable polling after hpd handling is shut down.
         */
-       drm_kms_helper_poll_fini(dev);
+       intel_hpd_poll_fini(dev);
 
        /* poll work can call into fbdev, hence clean that up afterwards */
        intel_fbdev_fini(dev_priv);