/* Only enable hotplug handling once the fbdev is fully set up. */
        intel_hpd_init(dev_priv);
 
-       drm_kms_helper_poll_init(dev);
-
        return 0;
 
 cleanup_gem:
         * cannot run before the connectors are registered.
         */
        intel_fbdev_initial_config_async(dev);
+
+       /*
+        * We need to coordinate the hotplugs with the asynchronous fbdev
+        * configuration, for which we use the fbdev->async_cookie.
+        */
+       if (INTEL_INFO(dev_priv)->num_pipes)
+               drm_kms_helper_poll_init(dev);
 }
 
 /**
        intel_fbdev_unregister(dev_priv);
        intel_audio_deinit(dev_priv);
 
+       /*
+        * After flushing the fbdev (incl. a late async config which will
+        * have delayed queuing of a hotplug event), then flush the hotplug
+        * events.
+        */
+       drm_kms_helper_poll_fini(&dev_priv->drm);
+
        intel_gpu_ips_teardown();
        acpi_video_unregister();
        intel_opregion_unregister(dev_priv);
 
        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. */
+       /* Kill all 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)