mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-06 06:37:59 +00:00
drm/radeon: only enable audio streams if the monitor supports it
Selectively enable which packets we send based on monitor caps. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
This commit is contained in:
parent
0f55db36d4
commit
38aef1549b
2 changed files with 21 additions and 12 deletions
|
@ -1761,17 +1761,15 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)
|
||||||
struct drm_device *dev = encoder->dev;
|
struct drm_device *dev = encoder->dev;
|
||||||
struct radeon_device *rdev = dev->dev_private;
|
struct radeon_device *rdev = dev->dev_private;
|
||||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||||
struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
|
|
||||||
int encoder_mode = atombios_get_encoder_mode(encoder);
|
int encoder_mode = atombios_get_encoder_mode(encoder);
|
||||||
|
|
||||||
DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n",
|
DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n",
|
||||||
radeon_encoder->encoder_id, mode, radeon_encoder->devices,
|
radeon_encoder->encoder_id, mode, radeon_encoder->devices,
|
||||||
radeon_encoder->active_device);
|
radeon_encoder->active_device);
|
||||||
|
|
||||||
if (connector && (radeon_audio != 0) &&
|
if ((radeon_audio != 0) &&
|
||||||
((encoder_mode == ATOM_ENCODER_MODE_HDMI) ||
|
((encoder_mode == ATOM_ENCODER_MODE_HDMI) ||
|
||||||
(ENCODER_MODE_IS_DP(encoder_mode) &&
|
ENCODER_MODE_IS_DP(encoder_mode)))
|
||||||
drm_detect_monitor_audio(radeon_connector_edid(connector)))))
|
|
||||||
radeon_audio_dpms(encoder, mode);
|
radeon_audio_dpms(encoder, mode);
|
||||||
|
|
||||||
switch (radeon_encoder->encoder_id) {
|
switch (radeon_encoder->encoder_id) {
|
||||||
|
|
|
@ -398,6 +398,9 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
|
struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
|
||||||
|
|
||||||
|
if (drm_detect_monitor_audio(radeon_connector_edid(connector))) {
|
||||||
WREG32(HDMI_INFOFRAME_CONTROL0 + dig->afmt->offset,
|
WREG32(HDMI_INFOFRAME_CONTROL0 + dig->afmt->offset,
|
||||||
HDMI_AVI_INFO_SEND | /* enable AVI info frames */
|
HDMI_AVI_INFO_SEND | /* enable AVI info frames */
|
||||||
HDMI_AVI_INFO_CONT | /* required for audio info values to be updated */
|
HDMI_AVI_INFO_CONT | /* required for audio info values to be updated */
|
||||||
|
@ -405,6 +408,13 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable)
|
||||||
HDMI_AUDIO_INFO_CONT); /* required for audio info values to be updated */
|
HDMI_AUDIO_INFO_CONT); /* required for audio info values to be updated */
|
||||||
WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset,
|
WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset,
|
||||||
AFMT_AUDIO_SAMPLE_SEND);
|
AFMT_AUDIO_SAMPLE_SEND);
|
||||||
|
} else {
|
||||||
|
WREG32(HDMI_INFOFRAME_CONTROL0 + dig->afmt->offset,
|
||||||
|
HDMI_AVI_INFO_SEND | /* enable AVI info frames */
|
||||||
|
HDMI_AVI_INFO_CONT); /* required for audio info values to be updated */
|
||||||
|
WREG32_AND(AFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset,
|
||||||
|
~AFMT_AUDIO_SAMPLE_SEND);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
WREG32_AND(AFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset,
|
WREG32_AND(AFMT_AUDIO_PACKET_CONTROL + dig->afmt->offset,
|
||||||
~AFMT_AUDIO_SAMPLE_SEND);
|
~AFMT_AUDIO_SAMPLE_SEND);
|
||||||
|
@ -423,11 +433,12 @@ void evergreen_dp_enable(struct drm_encoder *encoder, bool enable)
|
||||||
struct radeon_device *rdev = dev->dev_private;
|
struct radeon_device *rdev = dev->dev_private;
|
||||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||||
struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
|
||||||
|
struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
|
||||||
|
|
||||||
if (!dig || !dig->afmt)
|
if (!dig || !dig->afmt)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (enable) {
|
if (enable && drm_detect_monitor_audio(radeon_connector_edid(connector))) {
|
||||||
struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
|
struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
|
||||||
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
|
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
|
||||||
struct radeon_connector_atom_dig *dig_connector;
|
struct radeon_connector_atom_dig *dig_connector;
|
||||||
|
|
Loading…
Add table
Reference in a new issue