diff options
author | Niels Ole Salscheider <niels_ole@salscheider-online.de> | 2013-01-03 13:09:28 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-01-03 15:04:38 -0500 |
commit | 0a9069d34918659bc8a89e21e69e60b2b83291a3 (patch) | |
tree | 9339581977e2ebdd73007edb1aeb260c96dfe47f /drivers/gpu | |
parent | 64c56e8ce377842c8c8ff41054530480c7128c0b (diff) |
drm/radeon: Properly handle DDC probe for DP bridges
DDC information can be accessed using AUX CH
Fixes failure to probe monitors on some systems with
DP bridge chips.
agd5f: minor fixes
Signed-off-by: Niels Ole Salscheider <niels_ole@salscheider-online.de>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_i2c.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 2 |
4 files changed, 24 insertions, 11 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 47bf162ab9c6..2399f25ec037 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -741,7 +741,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force) | |||
741 | ret = connector_status_disconnected; | 741 | ret = connector_status_disconnected; |
742 | 742 | ||
743 | if (radeon_connector->ddc_bus) | 743 | if (radeon_connector->ddc_bus) |
744 | dret = radeon_ddc_probe(radeon_connector); | 744 | dret = radeon_ddc_probe(radeon_connector, false); |
745 | if (dret) { | 745 | if (dret) { |
746 | radeon_connector->detected_by_load = false; | 746 | radeon_connector->detected_by_load = false; |
747 | if (radeon_connector->edid) { | 747 | if (radeon_connector->edid) { |
@@ -947,7 +947,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | |||
947 | return connector->status; | 947 | return connector->status; |
948 | 948 | ||
949 | if (radeon_connector->ddc_bus) | 949 | if (radeon_connector->ddc_bus) |
950 | dret = radeon_ddc_probe(radeon_connector); | 950 | dret = radeon_ddc_probe(radeon_connector, false); |
951 | if (dret) { | 951 | if (dret) { |
952 | radeon_connector->detected_by_load = false; | 952 | radeon_connector->detected_by_load = false; |
953 | if (radeon_connector->edid) { | 953 | if (radeon_connector->edid) { |
@@ -1401,7 +1401,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | |||
1401 | if (encoder) { | 1401 | if (encoder) { |
1402 | /* setup ddc on the bridge */ | 1402 | /* setup ddc on the bridge */ |
1403 | radeon_atom_ext_encoder_setup_ddc(encoder); | 1403 | radeon_atom_ext_encoder_setup_ddc(encoder); |
1404 | if (radeon_ddc_probe(radeon_connector)) /* try DDC */ | 1404 | /* bridge chips are always aux */ |
1405 | if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */ | ||
1405 | ret = connector_status_connected; | 1406 | ret = connector_status_connected; |
1406 | else if (radeon_connector->dac_load_detect) { /* try load detection */ | 1407 | else if (radeon_connector->dac_load_detect) { /* try load detection */ |
1407 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; | 1408 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; |
@@ -1419,7 +1420,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | |||
1419 | if (radeon_dp_getdpcd(radeon_connector)) | 1420 | if (radeon_dp_getdpcd(radeon_connector)) |
1420 | ret = connector_status_connected; | 1421 | ret = connector_status_connected; |
1421 | } else { | 1422 | } else { |
1422 | if (radeon_ddc_probe(radeon_connector)) | 1423 | /* try non-aux ddc (DP to DVI/HMDI/etc. adapter) */ |
1424 | if (radeon_ddc_probe(radeon_connector, false)) | ||
1423 | ret = connector_status_connected; | 1425 | ret = connector_status_connected; |
1424 | } | 1426 | } |
1425 | } | 1427 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 310c0e5254ba..1da2386d7cf7 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -699,10 +699,15 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) | |||
699 | if (radeon_connector->router.ddc_valid) | 699 | if (radeon_connector->router.ddc_valid) |
700 | radeon_router_select_ddc_port(radeon_connector); | 700 | radeon_router_select_ddc_port(radeon_connector); |
701 | 701 | ||
702 | if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || | 702 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) != |
703 | (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) || | 703 | ENCODER_OBJECT_ID_NONE) { |
704 | (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) != | 704 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; |
705 | ENCODER_OBJECT_ID_NONE)) { | 705 | |
706 | if (dig->dp_i2c_bus) | ||
707 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, | ||
708 | &dig->dp_i2c_bus->adapter); | ||
709 | } else if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || | ||
710 | (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) { | ||
706 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | 711 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; |
707 | 712 | ||
708 | if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || | 713 | if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || |
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index c5bddd630eb9..fc60b74ee304 100644 --- a/drivers/gpu/drm/radeon/radeon_i2c.c +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | |||
@@ -39,7 +39,7 @@ extern u32 radeon_atom_hw_i2c_func(struct i2c_adapter *adap); | |||
39 | * radeon_ddc_probe | 39 | * radeon_ddc_probe |
40 | * | 40 | * |
41 | */ | 41 | */ |
42 | bool radeon_ddc_probe(struct radeon_connector *radeon_connector) | 42 | bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux) |
43 | { | 43 | { |
44 | u8 out = 0x0; | 44 | u8 out = 0x0; |
45 | u8 buf[8]; | 45 | u8 buf[8]; |
@@ -63,7 +63,13 @@ bool radeon_ddc_probe(struct radeon_connector *radeon_connector) | |||
63 | if (radeon_connector->router.ddc_valid) | 63 | if (radeon_connector->router.ddc_valid) |
64 | radeon_router_select_ddc_port(radeon_connector); | 64 | radeon_router_select_ddc_port(radeon_connector); |
65 | 65 | ||
66 | ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); | 66 | if (use_aux) { |
67 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | ||
68 | ret = i2c_transfer(&dig->dp_i2c_bus->adapter, msgs, 2); | ||
69 | } else { | ||
70 | ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); | ||
71 | } | ||
72 | |||
67 | if (ret != 2) | 73 | if (ret != 2) |
68 | /* Couldn't find an accessible DDC on this connector */ | 74 | /* Couldn't find an accessible DDC on this connector */ |
69 | return false; | 75 | return false; |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index ed8a0fadb6de..4003f5a68c09 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -559,7 +559,7 @@ extern void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c, | |||
559 | u8 val); | 559 | u8 val); |
560 | extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); | 560 | extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); |
561 | extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); | 561 | extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); |
562 | extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector); | 562 | extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux); |
563 | extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); | 563 | extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); |
564 | 564 | ||
565 | extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); | 565 | extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); |