drm/i915/tc: Fix target TC mode for a disconnected legacy port
authorImre Deak <imre.deak@intel.com>
Thu, 16 Mar 2023 13:17:17 +0000 (15:17 +0200)
committerImre Deak <imre.deak@intel.com>
Wed, 22 Mar 2023 18:31:11 +0000 (20:31 +0200)
Atm, the target TC mode - which the PHY should be switched to at any
point it's used - is TBT in case there is no sink connected. However
legacy ports are only used in the legacy mode regardless of the sink
connected state. Fix the mode returned by
intel_tc_port_get_target_mode() accordingly.

Despite of the above issue, the PHY got disconnected as expected in
response to a sink disconnect event, causing only a redundant
PHY disconnect->reconnect sequence whenever the port was used.

Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230316131724.359612-8-imre.deak@intel.com
drivers/gpu/drm/i915/display/intel_tc.c

index 002e142cc746f1b22e358b2fa2ca3797bae0661b..e39c8a870df06d7b833c72b1271d8bd2b5f36a83 100644 (file)
@@ -635,15 +635,23 @@ intel_tc_port_get_current_mode(struct intel_digital_port *dig_port)
        return mode;
 }
 
+static enum tc_port_mode default_tc_mode(struct intel_digital_port *dig_port)
+{
+       if (dig_port->tc_legacy_port)
+               return TC_PORT_LEGACY;
+
+       return TC_PORT_TBT_ALT;
+}
+
 static enum tc_port_mode
-hpd_mask_to_target_mode(u32 live_status_mask)
+hpd_mask_to_target_mode(struct intel_digital_port *dig_port, u32 live_status_mask)
 {
        enum tc_port_mode mode = hpd_mask_to_tc_mode(live_status_mask);
 
        if (mode != TC_PORT_DISCONNECTED)
                return mode;
 
-       return TC_PORT_TBT_ALT;
+       return default_tc_mode(dig_port);
 }
 
 static enum tc_port_mode
@@ -651,7 +659,7 @@ intel_tc_port_get_target_mode(struct intel_digital_port *dig_port)
 {
        u32 live_status_mask = tc_port_live_status_mask(dig_port);
 
-       return hpd_mask_to_target_mode(live_status_mask);
+       return hpd_mask_to_target_mode(dig_port, live_status_mask);
 }
 
 static void intel_tc_port_reset_mode(struct intel_digital_port *dig_port,