diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-04-18 10:50:55 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-04-23 18:03:53 -0400 |
commit | b1f6f47e3e33c4a74534f1301aca241ffabbb3a0 (patch) | |
tree | 22542b1fb96d0cf822c1bdbc4db76fe072260d93 /drivers/gpu/drm/radeon/evergreen_hdmi.c | |
parent | 26250e65fdabf4d406dc7846da7f948748cbb922 (diff) |
drm/radeon: clean up audio dto programming
Split into DCE2/3 and DCE4/5 variants. Still todo is to
calculate the DTO dividers properly. Add proper formula
to the comments.
Reviewed-by: Christian König <christian.koenig@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.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 380933bc1782..9fc22ee40f96 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
@@ -85,6 +85,30 @@ static void evergreen_hdmi_update_avi_infoframe(struct drm_encoder *encoder, | |||
85 | frame[0xC] | (frame[0xD] << 8)); | 85 | frame[0xC] | (frame[0xD] << 8)); |
86 | } | 86 | } |
87 | 87 | ||
88 | static void evergreen_audio_set_dto(struct drm_encoder *encoder, u32 clock) | ||
89 | { | ||
90 | struct drm_device *dev = encoder->dev; | ||
91 | struct radeon_device *rdev = dev->dev_private; | ||
92 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
93 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | ||
94 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); | ||
95 | u32 base_rate = 48000; | ||
96 | |||
97 | if (!dig || !dig->afmt) | ||
98 | return; | ||
99 | |||
100 | /* XXX: properly calculate this */ | ||
101 | /* XXX two dtos; generally use dto0 for hdmi */ | ||
102 | /* Express [24MHz / target pixel clock] as an exact rational | ||
103 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE | ||
104 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator | ||
105 | */ | ||
106 | WREG32(DCCG_AUDIO_DTO0_PHASE, (base_rate*50) & 0xffffff); | ||
107 | WREG32(DCCG_AUDIO_DTO0_MODULE, (clock*100) & 0xffffff); | ||
108 | WREG32(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL(radeon_crtc->crtc_id)); | ||
109 | } | ||
110 | |||
111 | |||
88 | /* | 112 | /* |
89 | * update the info frames with the data from the current display mode | 113 | * update the info frames with the data from the current display mode |
90 | */ | 114 | */ |
@@ -104,7 +128,7 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
104 | return; | 128 | return; |
105 | offset = dig->afmt->offset; | 129 | offset = dig->afmt->offset; |
106 | 130 | ||
107 | r600_audio_set_clock(encoder, mode->clock); | 131 | evergreen_audio_set_dto(encoder, mode->clock); |
108 | 132 | ||
109 | WREG32(HDMI_VBI_PACKET_CONTROL + offset, | 133 | WREG32(HDMI_VBI_PACKET_CONTROL + offset, |
110 | HDMI_NULL_SEND); /* send null packets when required */ | 134 | HDMI_NULL_SEND); /* send null packets when required */ |