diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_connectors.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 105 | 
1 files changed, 61 insertions, 44 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 5012f5e47a1e..df9469a8fdb1 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c @@ -90,25 +90,18 @@ void radeon_connector_hotplug(struct drm_connector *connector)  		/* don't do anything if sink is not display port, i.e.,  		 * passive dp->(dvi|hdmi) adaptor  		 */ -		if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { -			int saved_dpms = connector->dpms; -			/* Only turn off the display if it's physically disconnected */ -			if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { -				drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); -			} else if (radeon_dp_needs_link_train(radeon_connector)) { -				/* Don't try to start link training before we -				 * have the dpcd */ -				if (!radeon_dp_getdpcd(radeon_connector)) -					return; - -				/* set it to OFF so that drm_helper_connector_dpms() -				 * won't return immediately since the current state -				 * is ON at this point. -				 */ -				connector->dpms = DRM_MODE_DPMS_OFF; -				drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); -			} -			connector->dpms = saved_dpms; +		if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT && +		    radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) && +		    radeon_dp_needs_link_train(radeon_connector)) { +			/* Don't start link training before we have the DPCD */ +			if (!radeon_dp_getdpcd(radeon_connector)) +				return; + +			/* Turn the connector off and back on immediately, which +			 * will trigger link training +			 */ +			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); +			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);  		}  	}  } @@ -899,9 +892,11 @@ radeon_lvds_detect(struct drm_connector *connector, bool force)  	enum drm_connector_status ret = connector_status_disconnected;  	int r; -	r = pm_runtime_get_sync(connector->dev->dev); -	if (r < 0) -		return connector_status_disconnected; +	if (!drm_kms_helper_is_poll_worker()) { +		r = pm_runtime_get_sync(connector->dev->dev); +		if (r < 0) +			return connector_status_disconnected; +	}  	if (encoder) {  		struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); @@ -924,8 +919,12 @@ radeon_lvds_detect(struct drm_connector *connector, bool force)  	/* check acpi lid status ??? */  	radeon_connector_update_scratch_regs(connector, ret); -	pm_runtime_mark_last_busy(connector->dev->dev); -	pm_runtime_put_autosuspend(connector->dev->dev); + +	if (!drm_kms_helper_is_poll_worker()) { +		pm_runtime_mark_last_busy(connector->dev->dev); +		pm_runtime_put_autosuspend(connector->dev->dev); +	} +  	return ret;  } @@ -1039,9 +1038,11 @@ radeon_vga_detect(struct drm_connector *connector, bool force)  	enum drm_connector_status ret = connector_status_disconnected;  	int r; -	r = pm_runtime_get_sync(connector->dev->dev); -	if (r < 0) -		return connector_status_disconnected; +	if (!drm_kms_helper_is_poll_worker()) { +		r = pm_runtime_get_sync(connector->dev->dev); +		if (r < 0) +			return connector_status_disconnected; +	}  	encoder = radeon_best_single_encoder(connector);  	if (!encoder) @@ -1108,8 +1109,10 @@ radeon_vga_detect(struct drm_connector *connector, bool force)  	radeon_connector_update_scratch_regs(connector, ret);  out: -	pm_runtime_mark_last_busy(connector->dev->dev); -	pm_runtime_put_autosuspend(connector->dev->dev); +	if (!drm_kms_helper_is_poll_worker()) { +		pm_runtime_mark_last_busy(connector->dev->dev); +		pm_runtime_put_autosuspend(connector->dev->dev); +	}  	return ret;  } @@ -1173,9 +1176,11 @@ radeon_tv_detect(struct drm_connector *connector, bool force)  	if (!radeon_connector->dac_load_detect)  		return ret; -	r = pm_runtime_get_sync(connector->dev->dev); -	if (r < 0) -		return connector_status_disconnected; +	if (!drm_kms_helper_is_poll_worker()) { +		r = pm_runtime_get_sync(connector->dev->dev); +		if (r < 0) +			return connector_status_disconnected; +	}  	encoder = radeon_best_single_encoder(connector);  	if (!encoder) @@ -1187,8 +1192,12 @@ radeon_tv_detect(struct drm_connector *connector, bool force)  	if (ret == connector_status_connected)  		ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, false);  	radeon_connector_update_scratch_regs(connector, ret); -	pm_runtime_mark_last_busy(connector->dev->dev); -	pm_runtime_put_autosuspend(connector->dev->dev); + +	if (!drm_kms_helper_is_poll_worker()) { +		pm_runtime_mark_last_busy(connector->dev->dev); +		pm_runtime_put_autosuspend(connector->dev->dev); +	} +  	return ret;  } @@ -1251,9 +1260,11 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)  	enum drm_connector_status ret = connector_status_disconnected;  	bool dret = false, broken_edid = false; -	r = pm_runtime_get_sync(connector->dev->dev); -	if (r < 0) -		return connector_status_disconnected; +	if (!drm_kms_helper_is_poll_worker()) { +		r = pm_runtime_get_sync(connector->dev->dev); +		if (r < 0) +			return connector_status_disconnected; +	}  	if (radeon_connector->detected_hpd_without_ddc) {  		force = true; @@ -1436,8 +1447,10 @@ out:  	}  exit: -	pm_runtime_mark_last_busy(connector->dev->dev); -	pm_runtime_put_autosuspend(connector->dev->dev); +	if (!drm_kms_helper_is_poll_worker()) { +		pm_runtime_mark_last_busy(connector->dev->dev); +		pm_runtime_put_autosuspend(connector->dev->dev); +	}  	return ret;  } @@ -1688,9 +1701,11 @@ radeon_dp_detect(struct drm_connector *connector, bool force)  	if (radeon_dig_connector->is_mst)  		return connector_status_disconnected; -	r = pm_runtime_get_sync(connector->dev->dev); -	if (r < 0) -		return connector_status_disconnected; +	if (!drm_kms_helper_is_poll_worker()) { +		r = pm_runtime_get_sync(connector->dev->dev); +		if (r < 0) +			return connector_status_disconnected; +	}  	if (!force && radeon_check_hpd_status_unchanged(connector)) {  		ret = connector->status; @@ -1777,8 +1792,10 @@ radeon_dp_detect(struct drm_connector *connector, bool force)  	}  out: -	pm_runtime_mark_last_busy(connector->dev->dev); -	pm_runtime_put_autosuspend(connector->dev->dev); +	if (!drm_kms_helper_is_poll_worker()) { +		pm_runtime_mark_last_busy(connector->dev->dev); +		pm_runtime_put_autosuspend(connector->dev->dev); +	}  	return ret;  }  | 

