Add intel_display_driver_shutdown() to be called from the struct
pci_driver .shutdown path. Initially, only migrate i915, as there are
some subtle differences with xe that will be addressed later.

Pick up as much as we can at this point without making major functional
changes.

There's a slight functional change in that
intel_display_driver_shutdown() returns early for !HAS_DISPLAY(). Assume
this is what we want, and there are no cases where display engine is
present but all pipes have been fused off.

Signed-off-by: Jani Nikula <[email protected]>
---
 .../drm/i915/display/intel_display_driver.c   | 28 +++++++++++++++++++
 .../drm/i915/display/intel_display_driver.h   |  1 +
 drivers/gpu/drm/i915/i915_driver.c            | 24 +---------------
 3 files changed, 30 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c 
b/drivers/gpu/drm/i915/display/intel_display_driver.c
index 7f2d191b9ef0..90b2a62798c1 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -681,6 +681,34 @@ void intel_display_driver_unregister(struct intel_display 
*display)
        intel_vga_unregister(display);
 }
 
+void intel_display_driver_shutdown(struct intel_display *display)
+{
+       if (!HAS_DISPLAY(display))
+               return;
+
+       intel_display_power_disable(display);
+
+       drm_client_dev_suspend(display->drm);
+       drm_kms_helper_poll_disable(display->drm);
+
+       intel_display_driver_disable_user_access(display);
+
+       drm_atomic_helper_shutdown(display->drm);
+
+       flush_workqueue(display->wq.cleanup);
+
+       intel_dp_mst_suspend(display);
+
+       intel_encoder_block_all_hpds(display);
+
+       intel_hpd_cancel_work(display);
+
+       intel_display_driver_suspend_access(display);
+
+       intel_encoder_suspend_all(display);
+       intel_encoder_shutdown_all(display);
+}
+
 void intel_display_driver_shutdown_late(struct intel_display *display)
 {
        if (!HAS_DISPLAY(display))
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h 
b/drivers/gpu/drm/i915/display/intel_display_driver.h
index 61515577758b..7eca3d17dd82 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.h
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
@@ -24,6 +24,7 @@ void intel_display_driver_remove(struct intel_display 
*display);
 void intel_display_driver_remove_noirq(struct intel_display *display);
 void intel_display_driver_remove_nogem(struct intel_display *display);
 void intel_display_driver_unregister(struct intel_display *display);
+void intel_display_driver_shutdown(struct intel_display *display);
 void intel_display_driver_shutdown_late(struct intel_display *display);
 
 int intel_display_driver_pm_suspend(struct intel_display *display);
diff --git a/drivers/gpu/drm/i915/i915_driver.c 
b/drivers/gpu/drm/i915/i915_driver.c
index 140c562a8627..80313ee07b07 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -54,7 +54,6 @@
 #include "display/intel_bw.h"
 #include "display/intel_cdclk.h"
 #include "display/intel_crtc.h"
-#include "display/intel_display_core.h"
 #include "display/intel_display_device.h"
 #include "display/intel_display_driver.h"
 #include "display/intel_display_power.h"
@@ -1042,29 +1041,8 @@ void i915_driver_shutdown(struct drm_i915_private *i915)
 
        disable_rpm_wakeref_asserts(&i915->runtime_pm);
        intel_runtime_pm_disable(&i915->runtime_pm);
-       intel_display_power_disable(display);
 
-       drm_client_dev_suspend(&i915->drm);
-       if (intel_display_device_present(display)) {
-               drm_kms_helper_poll_disable(&i915->drm);
-               intel_display_driver_disable_user_access(display);
-
-               drm_atomic_helper_shutdown(&i915->drm);
-       }
-
-       flush_workqueue(display->wq.cleanup);
-
-       intel_dp_mst_suspend(display);
-
-       intel_encoder_block_all_hpds(display);
-
-       intel_hpd_cancel_work(display);
-
-       if (intel_display_device_present(display))
-               intel_display_driver_suspend_access(display);
-
-       intel_encoder_suspend_all(display);
-       intel_encoder_shutdown_all(display);
+       intel_display_driver_shutdown(display);
 
        intel_irq_suspend(i915);
 
-- 
2.47.3

Reply via email to