Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7726e72b authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/radeon: rework audio modeset to handle non-audio hdmi features



Need to setup the deep color and avi packets regardless of
audio setup.

Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent d0ea397e
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -2299,8 +2299,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
	encoder_mode = atombios_get_encoder_mode(encoder);
	if (connector && (radeon_audio != 0) &&
	    ((encoder_mode == ATOM_ENCODER_MODE_HDMI) ||
	     (ENCODER_MODE_IS_DP(encoder_mode) &&
	      drm_detect_monitor_audio(radeon_connector_edid(connector)))))
	     ENCODER_MODE_IS_DP(encoder_mode)))
		radeon_audio_mode_set(encoder, adjusted_mode);
}

+39 −26
Original line number Diff line number Diff line
@@ -696,10 +696,15 @@ static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder,
{
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);

	if (!dig || !dig->afmt)
		return;

	if (!connector)
		return;

	if (drm_detect_monitor_audio(radeon_connector_edid(connector))) {
		radeon_audio_set_mute(encoder, true);

		radeon_audio_write_speaker_allocation(encoder);
@@ -716,6 +721,12 @@ static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder,
			return;

		radeon_audio_set_mute(encoder, false);
	} else {
		radeon_hdmi_set_color_depth(encoder);

		if (radeon_audio_set_avi_packet(encoder, mode) < 0)
			return;
	}
}

static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
@@ -730,12 +741,13 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
	struct radeon_connector_atom_dig *dig_connector =
		radeon_connector->con_priv;

	if (!connector)
	if (!dig || !dig->afmt)
		return;

	if (!dig || !dig->afmt)
	if (!connector)
		return;

	if (drm_detect_monitor_audio(radeon_connector_edid(connector))) {
		radeon_audio_write_speaker_allocation(encoder);
		radeon_audio_write_sad_regs(encoder);
		radeon_audio_write_latency_fields(encoder, mode);
@@ -749,6 +761,7 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
		if (radeon_audio_set_avi_packet(encoder, mode) < 0)
			return;
	}
}

void radeon_audio_mode_set(struct drm_encoder *encoder,
			   struct drm_display_mode *mode)