]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - drivers/gpu/drm/i915/display/intel_lspcon.c
drm/i915: Init lspcon after HPD in intel_dp_detect()
[mirror_ubuntu-jammy-kernel.git] / drivers / gpu / drm / i915 / display / intel_lspcon.c
index dc1b35559afdf863669319c8a6f0e026c91757c0..db2e1e938572946b3d03209a08247905d14a6767 100644 (file)
@@ -525,26 +525,6 @@ u32 lspcon_infoframes_enabled(struct intel_encoder *encoder,
        return 0;
 }
 
-void lspcon_resume(struct intel_lspcon *lspcon)
-{
-       enum drm_lspcon_mode expected_mode;
-
-       if (lspcon_wake_native_aux_ch(lspcon)) {
-               expected_mode = DRM_LSPCON_MODE_PCON;
-               lspcon_resume_in_pcon_wa(lspcon);
-       } else {
-               expected_mode = DRM_LSPCON_MODE_LS;
-       }
-
-       if (lspcon_wait_mode(lspcon, expected_mode) == DRM_LSPCON_MODE_PCON)
-               return;
-
-       if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON))
-               DRM_ERROR("LSPCON resume failed\n");
-       else
-               DRM_DEBUG_KMS("LSPCON resume success\n");
-}
-
 void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon)
 {
        lspcon_wait_mode(lspcon, DRM_LSPCON_MODE_PCON);
@@ -554,15 +534,8 @@ bool lspcon_init(struct intel_digital_port *dig_port)
 {
        struct intel_dp *dp = &dig_port->dp;
        struct intel_lspcon *lspcon = &dig_port->lspcon;
-       struct drm_device *dev = dig_port->base.base.dev;
-       struct drm_i915_private *dev_priv = to_i915(dev);
        struct drm_connector *connector = &dp->attached_connector->base;
 
-       if (!HAS_LSPCON(dev_priv)) {
-               DRM_ERROR("LSPCON is not supported on this platform\n");
-               return false;
-       }
-
        lspcon->active = false;
        lspcon->mode = DRM_LSPCON_MODE_INVALID;
 
@@ -586,3 +559,37 @@ bool lspcon_init(struct intel_digital_port *dig_port)
        DRM_DEBUG_KMS("Success: LSPCON init\n");
        return true;
 }
+
+void lspcon_resume(struct intel_digital_port *dig_port)
+{
+       struct intel_lspcon *lspcon = &dig_port->lspcon;
+       struct drm_device *dev = dig_port->base.base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       enum drm_lspcon_mode expected_mode;
+
+       if (!intel_bios_is_lspcon_present(dev_priv, dig_port->base.port))
+               return;
+
+       if (!lspcon->active) {
+               if (!lspcon_init(dig_port)) {
+                       DRM_ERROR("LSPCON init failed on port %c\n",
+                                 port_name(dig_port->base.port));
+                       return;
+               }
+       }
+
+       if (lspcon_wake_native_aux_ch(lspcon)) {
+               expected_mode = DRM_LSPCON_MODE_PCON;
+               lspcon_resume_in_pcon_wa(lspcon);
+       } else {
+               expected_mode = DRM_LSPCON_MODE_LS;
+       }
+
+       if (lspcon_wait_mode(lspcon, expected_mode) == DRM_LSPCON_MODE_PCON)
+               return;
+
+       if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON))
+               DRM_ERROR("LSPCON resume failed\n");
+       else
+               DRM_DEBUG_KMS("LSPCON resume success\n");
+}