aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/evergreen_hdmi.c
diff options
context:
space:
mode:
authorSlava Grigorev <slava.grigorev@amd.com>2014-12-08 18:28:33 -0500
committerAlex Deucher <alexander.deucher@amd.com>2015-01-22 10:42:14 -0500
commitbaa7d8e451f030c049f83f943b9995620d6d6bd3 (patch)
treee93677344e3d6e7be4ff9bd62fc946153092c163 /drivers/gpu/drm/radeon/evergreen_hdmi.c
parent8ffea8570d5a7e9dd3c10349ebc3bd79487ae30b (diff)
radeon/audio: set_avi_packet() function cleanup
Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Slava Grigorev <slava.grigorev@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen_hdmi.c')
-rw-r--r--drivers/gpu/drm/radeon/evergreen_hdmi.c34
1 files changed, 10 insertions, 24 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index 454f656a79d0..6d22da986aa6 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -205,7 +205,7 @@ void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder,
205/* 205/*
206 * build a AVI Info Frame 206 * build a AVI Info Frame
207 */ 207 */
208void evergreen_update_avi_infoframe(struct radeon_device *rdev, u32 offset, 208void evergreen_set_avi_packet(struct radeon_device *rdev, u32 offset,
209 unsigned char *buffer, size_t size) 209 unsigned char *buffer, size_t size)
210{ 210{
211 uint8_t *frame = buffer + 3; 211 uint8_t *frame = buffer + 3;
@@ -218,6 +218,14 @@ void evergreen_update_avi_infoframe(struct radeon_device *rdev, u32 offset,
218 frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24)); 218 frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24));
219 WREG32(AFMT_AVI_INFO3 + offset, 219 WREG32(AFMT_AVI_INFO3 + offset,
220 frame[0xC] | (frame[0xD] << 8) | (buffer[1] << 24)); 220 frame[0xC] | (frame[0xD] << 8) | (buffer[1] << 24));
221
222 WREG32_OR(HDMI_INFOFRAME_CONTROL0 + offset,
223 HDMI_AVI_INFO_SEND | /* enable AVI info frames */
224 HDMI_AVI_INFO_CONT); /* required for audio info values to be updated */
225
226 WREG32_P(HDMI_INFOFRAME_CONTROL1 + offset,
227 HDMI_AVI_INFO_LINE(2), /* anything other than 0 */
228 ~HDMI_AVI_INFO_LINE_MASK);
221} 229}
222 230
223void dce4_hdmi_audio_set_dto(struct radeon_device *rdev, 231void dce4_hdmi_audio_set_dto(struct radeon_device *rdev,
@@ -346,10 +354,7 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
346 struct radeon_device *rdev = dev->dev_private; 354 struct radeon_device *rdev = dev->dev_private;
347 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 355 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
348 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 356 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
349 u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
350 struct hdmi_avi_infoframe frame;
351 uint32_t offset; 357 uint32_t offset;
352 ssize_t err;
353 358
354 if (!dig || !dig->afmt) 359 if (!dig || !dig->afmt)
355 return; 360 return;
@@ -415,27 +420,8 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
415 radeon_audio_write_sad_regs(encoder); 420 radeon_audio_write_sad_regs(encoder);
416 radeon_audio_write_latency_fields(encoder, mode); 421 radeon_audio_write_latency_fields(encoder, mode);
417 422
418 err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); 423 if (radeon_audio_set_avi_packet(encoder, mode) < 0)
419 if (err < 0) {
420 DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
421 return;
422 }
423
424 err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer));
425 if (err < 0) {
426 DRM_ERROR("failed to pack AVI infoframe: %zd\n", err);
427 return; 424 return;
428 }
429
430 radeon_update_avi_infoframe(encoder, buffer, sizeof(buffer));
431
432 WREG32_OR(HDMI_INFOFRAME_CONTROL0 + offset,
433 HDMI_AVI_INFO_SEND | /* enable AVI info frames */
434 HDMI_AVI_INFO_CONT); /* required for audio info values to be updated */
435
436 WREG32_P(HDMI_INFOFRAME_CONTROL1 + offset,
437 HDMI_AVI_INFO_LINE(2), /* anything other than 0 */
438 ~HDMI_AVI_INFO_LINE_MASK);
439 425
440 WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + offset, 426 WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + offset,
441 AFMT_AUDIO_SAMPLE_SEND); /* send audio packets */ 427 AFMT_AUDIO_SAMPLE_SEND); /* send audio packets */