diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_connectors.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 90 | 
1 files changed, 16 insertions, 74 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index dec6cbe6a0a..e7cb3ab0924 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c @@ -44,8 +44,6 @@ extern void  radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,  			     struct drm_connector *drm_connector); -bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector); -  void radeon_connector_hotplug(struct drm_connector *connector)  {  	struct drm_device *dev = connector->dev; @@ -432,55 +430,6 @@ int radeon_connector_set_property(struct drm_connector *connector, struct drm_pr  	return 0;  } -/* - * Some integrated ATI Radeon chipset implementations (e. g. - * Asus M2A-VM HDMI) may indicate the availability of a DDC, - * even when there's no monitor connected. For these connectors - * following DDC probe extension will be applied: check also for the - * availability of EDID with at least a correct EDID header. Only then, - * DDC is assumed to be available. This prevents drm_get_edid() and - * drm_edid_block_valid() from periodically dumping data and kernel - * errors into the logs and onto the terminal. - */ -static bool radeon_connector_needs_extended_probe(struct radeon_device *dev, -				     uint32_t supported_device, -				     int connector_type) -{ -	/* Asus M2A-VM HDMI board sends data to i2c bus even, -	 * if HDMI add-on card is not plugged in or HDMI is disabled in -	 * BIOS. Valid DDC can only be assumed, if also a valid EDID header -	 * can be retrieved via i2c bus during DDC probe */ -	if ((dev->pdev->device == 0x791e) && -	    (dev->pdev->subsystem_vendor == 0x1043) && -	    (dev->pdev->subsystem_device == 0x826d)) { -		if ((connector_type == DRM_MODE_CONNECTOR_HDMIA) && -		    (supported_device == ATOM_DEVICE_DFP2_SUPPORT)) -			return true; -	} -	/* ECS A740GM-M with ATI RADEON 2100 sends data to i2c bus -	 * for a DVI connector that is not implemented */ -	if ((dev->pdev->device == 0x796e) && -	    (dev->pdev->subsystem_vendor == 0x1019) && -	    (dev->pdev->subsystem_device == 0x2615)) { -		if ((connector_type == DRM_MODE_CONNECTOR_DVID) && -		    (supported_device == ATOM_DEVICE_DFP2_SUPPORT)) -			return true; -	} -	/* TOSHIBA Satellite L300D with ATI Mobility Radeon x1100 -	 * (RS690M) sends data to i2c bus for a HDMI connector that -	 * is not implemented */ -	if ((dev->pdev->device == 0x791f) && -	    (dev->pdev->subsystem_vendor == 0x1179) && -	    (dev->pdev->subsystem_device == 0xff68)) { -		if ((connector_type == DRM_MODE_CONNECTOR_HDMIA) && -		    (supported_device == ATOM_DEVICE_DFP2_SUPPORT)) -			return true; -	} - -	/* Default: no EDID header probe required for DDC probing */ -	return false; -} -  static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,  					  struct drm_connector *connector)  { @@ -721,8 +670,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force)  		ret = connector_status_disconnected;  	if (radeon_connector->ddc_bus) -		dret = radeon_ddc_probe(radeon_connector, -					radeon_connector->requires_extended_probe); +		dret = radeon_ddc_probe(radeon_connector);  	if (dret) {  		radeon_connector->detected_by_load = false;  		if (radeon_connector->edid) { @@ -764,7 +712,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force)  		if (radeon_connector->dac_load_detect && encoder) {  			encoder_funcs = encoder->helper_private;  			ret = encoder_funcs->detect(encoder, connector); -			if (ret == connector_status_connected) +			if (ret != connector_status_disconnected)  				radeon_connector->detected_by_load = true;  		}  	} @@ -904,8 +852,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)  	bool dret = false;  	if (radeon_connector->ddc_bus) -		dret = radeon_ddc_probe(radeon_connector, -					radeon_connector->requires_extended_probe); +		dret = radeon_ddc_probe(radeon_connector);  	if (dret) {  		radeon_connector->detected_by_load = false;  		if (radeon_connector->edid) { @@ -1005,8 +952,9 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)  					ret = encoder_funcs->detect(encoder, connector);  					if (ret == connector_status_connected) {  						radeon_connector->use_digital = false; -						radeon_connector->detected_by_load = true;  					} +					if (ret != connector_status_disconnected) +						radeon_connector->detected_by_load = true;  				}  				break;  			} @@ -1203,7 +1151,8 @@ static int radeon_dp_get_modes(struct drm_connector *connector)  		}  	} else {  		/* need to setup ddc on the bridge */ -		if (radeon_connector_encoder_is_dp_bridge(connector)) { +		if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != +			ENCODER_OBJECT_ID_NONE) {  			if (encoder)  				radeon_atom_ext_encoder_setup_ddc(encoder);  		} @@ -1213,13 +1162,12 @@ static int radeon_dp_get_modes(struct drm_connector *connector)  	return ret;  } -bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector) +u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector)  {  	struct drm_mode_object *obj;  	struct drm_encoder *encoder;  	struct radeon_encoder *radeon_encoder;  	int i; -	bool found = false;  	for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {  		if (connector->encoder_ids[i] == 0) @@ -1235,14 +1183,13 @@ bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector)  		switch (radeon_encoder->encoder_id) {  		case ENCODER_OBJECT_ID_TRAVIS:  		case ENCODER_OBJECT_ID_NUTMEG: -			found = true; -			break; +			return radeon_encoder->encoder_id;  		default:  			break;  		}  	} -	return found; +	return ENCODER_OBJECT_ID_NONE;  }  bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector) @@ -1319,7 +1266,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force)  		if (!radeon_dig_connector->edp_on)  			atombios_set_edp_panel_power(connector,  						     ATOM_TRANSMITTER_ACTION_POWER_OFF); -	} else if (radeon_connector_encoder_is_dp_bridge(connector)) { +	} else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != +		   ENCODER_OBJECT_ID_NONE) {  		/* DP bridges are always DP */  		radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;  		/* get the DPCD from the bridge */ @@ -1328,8 +1276,7 @@ radeon_dp_detect(struct drm_connector *connector, bool force)  		if (encoder) {  			/* setup ddc on the bridge */  			radeon_atom_ext_encoder_setup_ddc(encoder); -			if (radeon_ddc_probe(radeon_connector, -					     radeon_connector->requires_extended_probe)) /* try DDC */ +			if (radeon_ddc_probe(radeon_connector)) /* try DDC */  				ret = connector_status_connected;  			else if (radeon_connector->dac_load_detect) { /* try load detection */  				struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; @@ -1347,8 +1294,7 @@ radeon_dp_detect(struct drm_connector *connector, bool force)  				if (radeon_dp_getdpcd(radeon_connector))  					ret = connector_status_connected;  			} else { -				if (radeon_ddc_probe(radeon_connector, -						     radeon_connector->requires_extended_probe)) +				if (radeon_ddc_probe(radeon_connector))  					ret = connector_status_connected;  			}  		} @@ -1493,9 +1439,7 @@ radeon_add_atom_connector(struct drm_device *dev,  	radeon_connector->shared_ddc = shared_ddc;  	radeon_connector->connector_object_id = connector_object_id;  	radeon_connector->hpd = *hpd; -	radeon_connector->requires_extended_probe = -		radeon_connector_needs_extended_probe(rdev, supported_device, -							connector_type); +  	radeon_connector->router = *router;  	if (router->ddc_valid || router->cd_valid) {  		radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info); @@ -1842,9 +1786,7 @@ radeon_add_legacy_connector(struct drm_device *dev,  	radeon_connector->devices = supported_device;  	radeon_connector->connector_object_id = connector_object_id;  	radeon_connector->hpd = *hpd; -	radeon_connector->requires_extended_probe = -		radeon_connector_needs_extended_probe(rdev, supported_device, -							connector_type); +  	switch (connector_type) {  	case DRM_MODE_CONNECTOR_VGA:  		drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);  |