diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2013-04-18 09:23:12 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-04-22 10:39:12 -0400 |
commit | d3418eacad403033e95e49dc14afa37c2112c134 (patch) | |
tree | 58781b82934fbbe63a1ed262c47abebdd08c54dd /drivers/gpu/drm/radeon/evergreen_hdmi.c | |
parent | d5169fc4ccfecbfdf3b882be0d2cdf8b057b2eae (diff) |
drm/radeon/evergreen: setup HDMI before enabling it
Closed source driver fglrx seems to enable infoframes and audio packets
at the end, which makes sense, do the same.
Signed-off-by: Rafał Miłecki <zajec5@gmail.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 | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 4fdecc2b4040..0879355815d9 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
@@ -116,7 +116,6 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
116 | HDMI_AUDIO_PACKETS_PER_LINE(3)); /* should be suffient for all audio modes and small enough for all hblanks */ | 116 | HDMI_AUDIO_PACKETS_PER_LINE(3)); /* should be suffient for all audio modes and small enough for all hblanks */ |
117 | 117 | ||
118 | WREG32(AFMT_AUDIO_PACKET_CONTROL + offset, | 118 | WREG32(AFMT_AUDIO_PACKET_CONTROL + offset, |
119 | AFMT_AUDIO_SAMPLE_SEND | /* send audio packets */ | ||
120 | AFMT_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */ | 119 | AFMT_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */ |
121 | 120 | ||
122 | WREG32(HDMI_ACR_PACKET_CONTROL + offset, | 121 | WREG32(HDMI_ACR_PACKET_CONTROL + offset, |
@@ -129,8 +128,6 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
129 | HDMI_GC_CONT); /* send general control packets every frame */ | 128 | HDMI_GC_CONT); /* send general control packets every frame */ |
130 | 129 | ||
131 | WREG32(HDMI_INFOFRAME_CONTROL0 + offset, | 130 | WREG32(HDMI_INFOFRAME_CONTROL0 + offset, |
132 | HDMI_AVI_INFO_SEND | /* enable AVI info frames */ | ||
133 | HDMI_AVI_INFO_CONT | /* send AVI info frames every frame/field */ | ||
134 | HDMI_AUDIO_INFO_SEND | /* enable audio info frames (frames won't be set until audio is enabled) */ | 131 | HDMI_AUDIO_INFO_SEND | /* enable audio info frames (frames won't be set until audio is enabled) */ |
135 | HDMI_AUDIO_INFO_CONT); /* required for audio info values to be updated */ | 132 | HDMI_AUDIO_INFO_CONT); /* required for audio info values to be updated */ |
136 | 133 | ||
@@ -138,7 +135,6 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
138 | AFMT_AUDIO_INFO_UPDATE); /* required for audio info values to be updated */ | 135 | AFMT_AUDIO_INFO_UPDATE); /* required for audio info values to be updated */ |
139 | 136 | ||
140 | WREG32(HDMI_INFOFRAME_CONTROL1 + offset, | 137 | WREG32(HDMI_INFOFRAME_CONTROL1 + offset, |
141 | HDMI_AVI_INFO_LINE(2) | /* anything other than 0 */ | ||
142 | HDMI_AUDIO_INFO_LINE(2)); /* anything other than 0 */ | 138 | HDMI_AUDIO_INFO_LINE(2)); /* anything other than 0 */ |
143 | 139 | ||
144 | WREG32(HDMI_GC + offset, 0); /* unset HDMI_GC_AVMUTE */ | 140 | WREG32(HDMI_GC + offset, 0); /* unset HDMI_GC_AVMUTE */ |
@@ -158,6 +154,17 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
158 | evergreen_hdmi_update_avi_infoframe(encoder, buffer, sizeof(buffer)); | 154 | evergreen_hdmi_update_avi_infoframe(encoder, buffer, sizeof(buffer)); |
159 | evergreen_hdmi_update_ACR(encoder, mode->clock); | 155 | evergreen_hdmi_update_ACR(encoder, mode->clock); |
160 | 156 | ||
157 | WREG32_OR(HDMI_INFOFRAME_CONTROL0 + offset, | ||
158 | HDMI_AVI_INFO_SEND | /* enable AVI info frames */ | ||
159 | HDMI_AVI_INFO_CONT); /* required for audio info values to be updated */ | ||
160 | |||
161 | WREG32_P(HDMI_INFOFRAME_CONTROL1 + offset, | ||
162 | HDMI_AVI_INFO_LINE(2), /* anything other than 0 */ | ||
163 | ~HDMI_AVI_INFO_LINE_MASK); | ||
164 | |||
165 | WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + offset, | ||
166 | AFMT_AUDIO_SAMPLE_SEND); /* send audio packets */ | ||
167 | |||
161 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ | 168 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ |
162 | WREG32(AFMT_RAMP_CONTROL0 + offset, 0x00FFFFFF); | 169 | WREG32(AFMT_RAMP_CONTROL0 + offset, 0x00FFFFFF); |
163 | WREG32(AFMT_RAMP_CONTROL1 + offset, 0x007FFFFF); | 170 | WREG32(AFMT_RAMP_CONTROL1 + offset, 0x007FFFFF); |