aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/atombios_encoders.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/atombios_encoders.c')
-rw-r--r--drivers/gpu/drm/radeon/atombios_encoders.c29
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)
664int 665int
665atombios_get_encoder_mode(struct drm_encoder *encoder) 666atombios_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
1715static void 1728static 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
2182static bool 2193static bool
@@ -2442,10 +2453,6 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
2442 2453
2443disable_done: 2454disable_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 }