430,6 → 430,45 |
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; |
} |
|
/* 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) |
{ |
661,7 → 700,8 |
ret = connector_status_disconnected; |
|
if (radeon_connector->ddc_bus) |
dret = radeon_ddc_probe(radeon_connector); |
dret = radeon_ddc_probe(radeon_connector, |
radeon_connector->requires_extended_probe); |
if (dret) { |
if (radeon_connector->edid) { |
kfree(radeon_connector->edid); |
833,7 → 873,8 |
bool dret = false; |
|
if (radeon_connector->ddc_bus) |
dret = radeon_ddc_probe(radeon_connector); |
dret = radeon_ddc_probe(radeon_connector, |
radeon_connector->requires_extended_probe); |
if (dret) { |
if (radeon_connector->edid) { |
kfree(radeon_connector->edid); |
1251,7 → 1292,8 |
if (radeon_dp_getdpcd(radeon_connector)) |
ret = connector_status_connected; |
} else { |
if (radeon_ddc_probe(radeon_connector)) |
if (radeon_ddc_probe(radeon_connector, |
radeon_connector->requires_extended_probe)) |
ret = connector_status_connected; |
} |
} |
1406,6 → 1448,9 |
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); |
1752,6 → 1797,9 |
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); |