diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_tc.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_tc.c | 26 | 
1 files changed, 20 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c index dbd7d0d83a14..7784c30fe893 100644 --- a/drivers/gpu/drm/i915/display/intel_tc.c +++ b/drivers/gpu/drm/i915/display/intel_tc.c @@ -691,6 +691,8 @@ void intel_tc_port_sanitize(struct intel_digital_port *dig_port)  {  	struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);  	struct intel_encoder *encoder = &dig_port->base; +	intel_wakeref_t tc_cold_wref; +	enum intel_display_power_domain domain;  	int active_links = 0;  	mutex_lock(&dig_port->tc_lock); @@ -702,12 +704,11 @@ void intel_tc_port_sanitize(struct intel_digital_port *dig_port)  	drm_WARN_ON(&i915->drm, dig_port->tc_mode != TC_PORT_DISCONNECTED);  	drm_WARN_ON(&i915->drm, dig_port->tc_lock_wakeref); -	if (active_links) { -		enum intel_display_power_domain domain; -		intel_wakeref_t tc_cold_wref = tc_cold_block(dig_port, &domain); -		dig_port->tc_mode = intel_tc_port_get_current_mode(dig_port); +	tc_cold_wref = tc_cold_block(dig_port, &domain); +	dig_port->tc_mode = intel_tc_port_get_current_mode(dig_port); +	if (active_links) {  		if (!icl_tc_phy_is_connected(dig_port))  			drm_dbg_kms(&i915->drm,  				    "Port %s: PHY disconnected with %d active link(s)\n", @@ -716,10 +717,23 @@ void intel_tc_port_sanitize(struct intel_digital_port *dig_port)  		dig_port->tc_lock_wakeref = tc_cold_block(dig_port,  							  &dig_port->tc_lock_power_domain); - -		tc_cold_unblock(dig_port, domain, tc_cold_wref); +	} else { +		/* +		 * TBT-alt is the default mode in any case the PHY ownership is not +		 * held (regardless of the sink's connected live state), so +		 * we'll just switch to disconnected mode from it here without +		 * a note. +		 */ +		if (dig_port->tc_mode != TC_PORT_TBT_ALT) +			drm_dbg_kms(&i915->drm, +				    "Port %s: PHY left in %s mode on disabled port, disconnecting it\n", +				    dig_port->tc_port_name, +				    tc_port_mode_name(dig_port->tc_mode)); +		icl_tc_phy_disconnect(dig_port);  	} +	tc_cold_unblock(dig_port, domain, tc_cold_wref); +  	drm_dbg_kms(&i915->drm, "Port %s: sanitize mode (%s)\n",  		    dig_port->tc_port_name,  		    tc_port_mode_name(dig_port->tc_mode)); |