diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/atombios_encoders.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_encoders.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index b8cd7975f797..7c9df1eac065 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <drm/drm_crtc_helper.h> | 27 | #include <drm/drm_crtc_helper.h> |
| 28 | #include <drm/radeon_drm.h> | 28 | #include <drm/radeon_drm.h> |
| 29 | #include "radeon.h" | 29 | #include "radeon.h" |
| 30 | #include "radeon_audio.h" | ||
| 30 | #include "atom.h" | 31 | #include "atom.h" |
| 31 | #include <linux/backlight.h> | 32 | #include <linux/backlight.h> |
| 32 | 33 | ||
| @@ -664,6 +665,8 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
| 664 | int | 665 | int |
| 665 | atombios_get_encoder_mode(struct drm_encoder *encoder) | 666 | atombios_get_encoder_mode(struct drm_encoder *encoder) |
| 666 | { | 667 | { |
| 668 | struct drm_device *dev = encoder->dev; | ||
| 669 | struct radeon_device *rdev = dev->dev_private; | ||
| 667 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 670 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 668 | struct drm_connector *connector; | 671 | struct drm_connector *connector; |
| 669 | struct radeon_connector *radeon_connector; | 672 | struct radeon_connector *radeon_connector; |
| @@ -728,6 +731,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 728 | dig_connector = radeon_connector->con_priv; | 731 | dig_connector = radeon_connector->con_priv; |
| 729 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || | 732 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
| 730 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { | 733 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { |
| 734 | if (radeon_audio != 0 && ASIC_IS_DCE4(rdev) && !ASIC_IS_DCE5(rdev)) | ||
| 735 | return ATOM_ENCODER_MODE_DP_AUDIO; | ||
| 731 | return ATOM_ENCODER_MODE_DP; | 736 | return ATOM_ENCODER_MODE_DP; |
| 732 | } else if (radeon_audio != 0) { | 737 | } else if (radeon_audio != 0) { |
| 733 | if (radeon_connector->audio == RADEON_AUDIO_ENABLE) | 738 | if (radeon_connector->audio == RADEON_AUDIO_ENABLE) |
| @@ -742,6 +747,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 742 | } | 747 | } |
| 743 | break; | 748 | break; |
| 744 | case DRM_MODE_CONNECTOR_eDP: | 749 | case DRM_MODE_CONNECTOR_eDP: |
| 750 | if (radeon_audio != 0 && ASIC_IS_DCE4(rdev) && !ASIC_IS_DCE5(rdev)) | ||
| 751 | return ATOM_ENCODER_MODE_DP_AUDIO; | ||
| 745 | return ATOM_ENCODER_MODE_DP; | 752 | return ATOM_ENCODER_MODE_DP; |
| 746 | case DRM_MODE_CONNECTOR_DVIA: | 753 | case DRM_MODE_CONNECTOR_DVIA: |
| 747 | case DRM_MODE_CONNECTOR_VGA: | 754 | case DRM_MODE_CONNECTOR_VGA: |
| @@ -1615,6 +1622,7 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1615 | struct radeon_connector *radeon_connector = NULL; | 1622 | struct radeon_connector *radeon_connector = NULL; |
| 1616 | struct radeon_connector_atom_dig *radeon_dig_connector = NULL; | 1623 | struct radeon_connector_atom_dig *radeon_dig_connector = NULL; |
| 1617 | bool travis_quirk = false; | 1624 | bool travis_quirk = false; |
| 1625 | int encoder_mode; | ||
| 1618 | 1626 | ||
| 1619 | if (connector) { | 1627 | if (connector) { |
| 1620 | radeon_connector = to_radeon_connector(connector); | 1628 | radeon_connector = to_radeon_connector(connector); |
| @@ -1710,6 +1718,11 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1710 | } | 1718 | } |
| 1711 | break; | 1719 | break; |
| 1712 | } | 1720 | } |
| 1721 | |||
| 1722 | encoder_mode = atombios_get_encoder_mode(encoder); | ||
| 1723 | if (radeon_audio != 0 && | ||
| 1724 | (encoder_mode == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(encoder_mode))) | ||
| 1725 | radeon_audio_dpms(encoder, mode); | ||
| 1713 | } | 1726 | } |
| 1714 | 1727 | ||
| 1715 | static void | 1728 | static void |
| @@ -2123,6 +2136,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 2123 | struct drm_device *dev = encoder->dev; | 2136 | struct drm_device *dev = encoder->dev; |
| 2124 | struct radeon_device *rdev = dev->dev_private; | 2137 | struct radeon_device *rdev = dev->dev_private; |
| 2125 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 2138 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 2139 | int encoder_mode; | ||
| 2126 | 2140 | ||
| 2127 | radeon_encoder->pixel_clock = adjusted_mode->clock; | 2141 | radeon_encoder->pixel_clock = adjusted_mode->clock; |
| 2128 | 2142 | ||
| @@ -2149,6 +2163,10 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 2149 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: | 2163 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: |
| 2150 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | 2164 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
| 2151 | /* handled in dpms */ | 2165 | /* handled in dpms */ |
| 2166 | encoder_mode = atombios_get_encoder_mode(encoder); | ||
| 2167 | if (radeon_audio != 0 && | ||
| 2168 | (encoder_mode == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(encoder_mode))) | ||
| 2169 | radeon_audio_mode_set(encoder, adjusted_mode); | ||
| 2152 | break; | 2170 | break; |
| 2153 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | 2171 | case ENCODER_OBJECT_ID_INTERNAL_DDI: |
| 2154 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: | 2172 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: |
| @@ -2170,13 +2188,6 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 2170 | } | 2188 | } |
| 2171 | 2189 | ||
| 2172 | atombios_apply_encoder_quirks(encoder, adjusted_mode); | 2190 | atombios_apply_encoder_quirks(encoder, adjusted_mode); |
| 2173 | |||
| 2174 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) { | ||
| 2175 | if (rdev->asic->display.hdmi_enable) | ||
| 2176 | radeon_hdmi_enable(rdev, encoder, true); | ||
| 2177 | if (rdev->asic->display.hdmi_setmode) | ||
| 2178 | radeon_hdmi_setmode(rdev, encoder, adjusted_mode); | ||
| 2179 | } | ||
| 2180 | } | 2191 | } |
| 2181 | 2192 | ||
| 2182 | static bool | 2193 | static bool |
| @@ -2442,10 +2453,6 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder) | |||
| 2442 | 2453 | ||
| 2443 | disable_done: | 2454 | disable_done: |
| 2444 | if (radeon_encoder_is_digital(encoder)) { | 2455 | if (radeon_encoder_is_digital(encoder)) { |
| 2445 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) { | ||
| 2446 | if (rdev->asic->display.hdmi_enable) | ||
| 2447 | radeon_hdmi_enable(rdev, encoder, false); | ||
| 2448 | } | ||
| 2449 | dig = radeon_encoder->enc_priv; | 2456 | dig = radeon_encoder->enc_priv; |
| 2450 | dig->dig_encoder = -1; | 2457 | dig->dig_encoder = -1; |
| 2451 | } | 2458 | } |
