diff options
Diffstat (limited to 'drivers/gpu/drm/radeon')
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_encoders.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/dce6_afmt.c | 62 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_audio.c | 204 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_audio.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 2 |
7 files changed, 149 insertions, 150 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index dd39f434b4a7..c3872598b85a 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -2299,8 +2299,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
2299 | encoder_mode = atombios_get_encoder_mode(encoder); | 2299 | encoder_mode = atombios_get_encoder_mode(encoder); |
2300 | if (connector && (radeon_audio != 0) && | 2300 | if (connector && (radeon_audio != 0) && |
2301 | ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || | 2301 | ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || |
2302 | (ENCODER_MODE_IS_DP(encoder_mode) && | 2302 | ENCODER_MODE_IS_DP(encoder_mode))) |
2303 | drm_detect_monitor_audio(radeon_connector_edid(connector))))) | ||
2304 | radeon_audio_mode_set(encoder, adjusted_mode); | 2303 | radeon_audio_mode_set(encoder, adjusted_mode); |
2305 | } | 2304 | } |
2306 | 2305 | ||
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c index 68fd9fc677e3..44480c1b9738 100644 --- a/drivers/gpu/drm/radeon/dce6_afmt.c +++ b/drivers/gpu/drm/radeon/dce6_afmt.c | |||
@@ -93,30 +93,26 @@ void dce6_afmt_select_pin(struct drm_encoder *encoder) | |||
93 | struct radeon_device *rdev = encoder->dev->dev_private; | 93 | struct radeon_device *rdev = encoder->dev->dev_private; |
94 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 94 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
95 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 95 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
96 | u32 offset; | ||
97 | 96 | ||
98 | if (!dig || !dig->afmt || !dig->afmt->pin) | 97 | if (!dig || !dig->afmt || !dig->pin) |
99 | return; | 98 | return; |
100 | 99 | ||
101 | offset = dig->afmt->offset; | 100 | WREG32(AFMT_AUDIO_SRC_CONTROL + dig->afmt->offset, |
102 | 101 | AFMT_AUDIO_SRC_SELECT(dig->pin->id)); | |
103 | WREG32(AFMT_AUDIO_SRC_CONTROL + offset, | ||
104 | AFMT_AUDIO_SRC_SELECT(dig->afmt->pin->id)); | ||
105 | } | 102 | } |
106 | 103 | ||
107 | void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, | 104 | void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, |
108 | struct drm_connector *connector, struct drm_display_mode *mode) | 105 | struct drm_connector *connector, |
106 | struct drm_display_mode *mode) | ||
109 | { | 107 | { |
110 | struct radeon_device *rdev = encoder->dev->dev_private; | 108 | struct radeon_device *rdev = encoder->dev->dev_private; |
111 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 109 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
112 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 110 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
113 | u32 tmp = 0, offset; | 111 | u32 tmp = 0; |
114 | 112 | ||
115 | if (!dig || !dig->afmt || !dig->afmt->pin) | 113 | if (!dig || !dig->afmt || !dig->pin) |
116 | return; | 114 | return; |
117 | 115 | ||
118 | offset = dig->afmt->pin->offset; | ||
119 | |||
120 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) { | 116 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) { |
121 | if (connector->latency_present[1]) | 117 | if (connector->latency_present[1]) |
122 | tmp = VIDEO_LIPSYNC(connector->video_latency[1]) | | 118 | tmp = VIDEO_LIPSYNC(connector->video_latency[1]) | |
@@ -130,24 +126,24 @@ void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, | |||
130 | else | 126 | else |
131 | tmp = VIDEO_LIPSYNC(0) | AUDIO_LIPSYNC(0); | 127 | tmp = VIDEO_LIPSYNC(0) | AUDIO_LIPSYNC(0); |
132 | } | 128 | } |
133 | WREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, tmp); | 129 | WREG32_ENDPOINT(dig->pin->offset, |
130 | AZ_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, tmp); | ||
134 | } | 131 | } |
135 | 132 | ||
136 | void dce6_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder, | 133 | void dce6_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder, |
137 | u8 *sadb, int sad_count) | 134 | u8 *sadb, int sad_count) |
138 | { | 135 | { |
139 | struct radeon_device *rdev = encoder->dev->dev_private; | 136 | struct radeon_device *rdev = encoder->dev->dev_private; |
140 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 137 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
141 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 138 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
142 | u32 offset, tmp; | 139 | u32 tmp; |
143 | 140 | ||
144 | if (!dig || !dig->afmt || !dig->afmt->pin) | 141 | if (!dig || !dig->afmt || !dig->pin) |
145 | return; | 142 | return; |
146 | 143 | ||
147 | offset = dig->afmt->pin->offset; | ||
148 | |||
149 | /* program the speaker allocation */ | 144 | /* program the speaker allocation */ |
150 | tmp = RREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER); | 145 | tmp = RREG32_ENDPOINT(dig->pin->offset, |
146 | AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER); | ||
151 | tmp &= ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK); | 147 | tmp &= ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK); |
152 | /* set HDMI mode */ | 148 | /* set HDMI mode */ |
153 | tmp |= HDMI_CONNECTION; | 149 | tmp |= HDMI_CONNECTION; |
@@ -155,24 +151,24 @@ void dce6_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder, | |||
155 | tmp |= SPEAKER_ALLOCATION(sadb[0]); | 151 | tmp |= SPEAKER_ALLOCATION(sadb[0]); |
156 | else | 152 | else |
157 | tmp |= SPEAKER_ALLOCATION(5); /* stereo */ | 153 | tmp |= SPEAKER_ALLOCATION(5); /* stereo */ |
158 | WREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, tmp); | 154 | WREG32_ENDPOINT(dig->pin->offset, |
155 | AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, tmp); | ||
159 | } | 156 | } |
160 | 157 | ||
161 | void dce6_afmt_dp_write_speaker_allocation(struct drm_encoder *encoder, | 158 | void dce6_afmt_dp_write_speaker_allocation(struct drm_encoder *encoder, |
162 | u8 *sadb, int sad_count) | 159 | u8 *sadb, int sad_count) |
163 | { | 160 | { |
164 | struct radeon_device *rdev = encoder->dev->dev_private; | 161 | struct radeon_device *rdev = encoder->dev->dev_private; |
165 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 162 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
166 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 163 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
167 | u32 offset, tmp; | 164 | u32 tmp; |
168 | 165 | ||
169 | if (!dig || !dig->afmt || !dig->afmt->pin) | 166 | if (!dig || !dig->afmt || !dig->pin) |
170 | return; | 167 | return; |
171 | 168 | ||
172 | offset = dig->afmt->pin->offset; | ||
173 | |||
174 | /* program the speaker allocation */ | 169 | /* program the speaker allocation */ |
175 | tmp = RREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER); | 170 | tmp = RREG32_ENDPOINT(dig->pin->offset, |
171 | AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER); | ||
176 | tmp &= ~(HDMI_CONNECTION | SPEAKER_ALLOCATION_MASK); | 172 | tmp &= ~(HDMI_CONNECTION | SPEAKER_ALLOCATION_MASK); |
177 | /* set DP mode */ | 173 | /* set DP mode */ |
178 | tmp |= DP_CONNECTION; | 174 | tmp |= DP_CONNECTION; |
@@ -180,13 +176,13 @@ void dce6_afmt_dp_write_speaker_allocation(struct drm_encoder *encoder, | |||
180 | tmp |= SPEAKER_ALLOCATION(sadb[0]); | 176 | tmp |= SPEAKER_ALLOCATION(sadb[0]); |
181 | else | 177 | else |
182 | tmp |= SPEAKER_ALLOCATION(5); /* stereo */ | 178 | tmp |= SPEAKER_ALLOCATION(5); /* stereo */ |
183 | WREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, tmp); | 179 | WREG32_ENDPOINT(dig->pin->offset, |
180 | AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, tmp); | ||
184 | } | 181 | } |
185 | 182 | ||
186 | void dce6_afmt_write_sad_regs(struct drm_encoder *encoder, | 183 | void dce6_afmt_write_sad_regs(struct drm_encoder *encoder, |
187 | struct cea_sad *sads, int sad_count) | 184 | struct cea_sad *sads, int sad_count) |
188 | { | 185 | { |
189 | u32 offset; | ||
190 | int i; | 186 | int i; |
191 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 187 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
192 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 188 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
@@ -206,11 +202,9 @@ void dce6_afmt_write_sad_regs(struct drm_encoder *encoder, | |||
206 | { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO }, | 202 | { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO }, |
207 | }; | 203 | }; |
208 | 204 | ||
209 | if (!dig || !dig->afmt || !dig->afmt->pin) | 205 | if (!dig || !dig->afmt || !dig->pin) |
210 | return; | 206 | return; |
211 | 207 | ||
212 | offset = dig->afmt->pin->offset; | ||
213 | |||
214 | for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) { | 208 | for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) { |
215 | u32 value = 0; | 209 | u32 value = 0; |
216 | u8 stereo_freqs = 0; | 210 | u8 stereo_freqs = 0; |
@@ -237,7 +231,7 @@ void dce6_afmt_write_sad_regs(struct drm_encoder *encoder, | |||
237 | 231 | ||
238 | value |= SUPPORTED_FREQUENCIES_STEREO(stereo_freqs); | 232 | value |= SUPPORTED_FREQUENCIES_STEREO(stereo_freqs); |
239 | 233 | ||
240 | WREG32_ENDPOINT(offset, eld_reg_to_type[i][0], value); | 234 | WREG32_ENDPOINT(dig->pin->offset, eld_reg_to_type[i][0], value); |
241 | } | 235 | } |
242 | } | 236 | } |
243 | 237 | ||
@@ -253,7 +247,7 @@ void dce6_audio_enable(struct radeon_device *rdev, | |||
253 | } | 247 | } |
254 | 248 | ||
255 | void dce6_hdmi_audio_set_dto(struct radeon_device *rdev, | 249 | void dce6_hdmi_audio_set_dto(struct radeon_device *rdev, |
256 | struct radeon_crtc *crtc, unsigned int clock) | 250 | struct radeon_crtc *crtc, unsigned int clock) |
257 | { | 251 | { |
258 | /* Two dtos; generally use dto0 for HDMI */ | 252 | /* Two dtos; generally use dto0 for HDMI */ |
259 | u32 value = 0; | 253 | u32 value = 0; |
@@ -272,7 +266,7 @@ void dce6_hdmi_audio_set_dto(struct radeon_device *rdev, | |||
272 | } | 266 | } |
273 | 267 | ||
274 | void dce6_dp_audio_set_dto(struct radeon_device *rdev, | 268 | void dce6_dp_audio_set_dto(struct radeon_device *rdev, |
275 | struct radeon_crtc *crtc, unsigned int clock) | 269 | struct radeon_crtc *crtc, unsigned int clock) |
276 | { | 270 | { |
277 | /* Two dtos; generally use dto1 for DP */ | 271 | /* Two dtos; generally use dto1 for DP */ |
278 | u32 value = 0; | 272 | u32 value = 0; |
diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c index fa719c53449b..fbc8d88d6e5d 100644 --- a/drivers/gpu/drm/radeon/radeon_audio.c +++ b/drivers/gpu/drm/radeon/radeon_audio.c | |||
@@ -245,6 +245,28 @@ static struct radeon_audio_funcs dce6_dp_funcs = { | |||
245 | static void radeon_audio_enable(struct radeon_device *rdev, | 245 | static void radeon_audio_enable(struct radeon_device *rdev, |
246 | struct r600_audio_pin *pin, u8 enable_mask) | 246 | struct r600_audio_pin *pin, u8 enable_mask) |
247 | { | 247 | { |
248 | struct drm_encoder *encoder; | ||
249 | struct radeon_encoder *radeon_encoder; | ||
250 | struct radeon_encoder_atom_dig *dig; | ||
251 | int pin_count = 0; | ||
252 | |||
253 | if (!pin) | ||
254 | return; | ||
255 | |||
256 | if (rdev->mode_info.mode_config_initialized) { | ||
257 | list_for_each_entry(encoder, &rdev->ddev->mode_config.encoder_list, head) { | ||
258 | if (radeon_encoder_is_digital(encoder)) { | ||
259 | radeon_encoder = to_radeon_encoder(encoder); | ||
260 | dig = radeon_encoder->enc_priv; | ||
261 | if (dig->pin == pin) | ||
262 | pin_count++; | ||
263 | } | ||
264 | } | ||
265 | |||
266 | if ((pin_count > 1) && (enable_mask == 0)) | ||
267 | return; | ||
268 | } | ||
269 | |||
248 | if (rdev->audio.funcs->enable) | 270 | if (rdev->audio.funcs->enable) |
249 | rdev->audio.funcs->enable(rdev, pin, enable_mask); | 271 | rdev->audio.funcs->enable(rdev, pin, enable_mask); |
250 | } | 272 | } |
@@ -336,24 +358,13 @@ void radeon_audio_endpoint_wreg(struct radeon_device *rdev, u32 offset, | |||
336 | 358 | ||
337 | static void radeon_audio_write_sad_regs(struct drm_encoder *encoder) | 359 | static void radeon_audio_write_sad_regs(struct drm_encoder *encoder) |
338 | { | 360 | { |
339 | struct radeon_encoder *radeon_encoder; | 361 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
340 | struct drm_connector *connector; | 362 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
341 | struct radeon_connector *radeon_connector = NULL; | ||
342 | struct cea_sad *sads; | 363 | struct cea_sad *sads; |
343 | int sad_count; | 364 | int sad_count; |
344 | 365 | ||
345 | list_for_each_entry(connector, | 366 | if (!connector) |
346 | &encoder->dev->mode_config.connector_list, head) { | ||
347 | if (connector->encoder == encoder) { | ||
348 | radeon_connector = to_radeon_connector(connector); | ||
349 | break; | ||
350 | } | ||
351 | } | ||
352 | |||
353 | if (!radeon_connector) { | ||
354 | DRM_ERROR("Couldn't find encoder's connector\n"); | ||
355 | return; | 367 | return; |
356 | } | ||
357 | 368 | ||
358 | sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads); | 369 | sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads); |
359 | if (sad_count <= 0) { | 370 | if (sad_count <= 0) { |
@@ -362,8 +373,6 @@ static void radeon_audio_write_sad_regs(struct drm_encoder *encoder) | |||
362 | } | 373 | } |
363 | BUG_ON(!sads); | 374 | BUG_ON(!sads); |
364 | 375 | ||
365 | radeon_encoder = to_radeon_encoder(encoder); | ||
366 | |||
367 | if (radeon_encoder->audio && radeon_encoder->audio->write_sad_regs) | 376 | if (radeon_encoder->audio && radeon_encoder->audio->write_sad_regs) |
368 | radeon_encoder->audio->write_sad_regs(encoder, sads, sad_count); | 377 | radeon_encoder->audio->write_sad_regs(encoder, sads, sad_count); |
369 | 378 | ||
@@ -372,27 +381,16 @@ static void radeon_audio_write_sad_regs(struct drm_encoder *encoder) | |||
372 | 381 | ||
373 | static void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder) | 382 | static void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder) |
374 | { | 383 | { |
384 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
375 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 385 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
376 | struct drm_connector *connector; | ||
377 | struct radeon_connector *radeon_connector = NULL; | ||
378 | u8 *sadb = NULL; | 386 | u8 *sadb = NULL; |
379 | int sad_count; | 387 | int sad_count; |
380 | 388 | ||
381 | list_for_each_entry(connector, | 389 | if (!connector) |
382 | &encoder->dev->mode_config.connector_list, head) { | ||
383 | if (connector->encoder == encoder) { | ||
384 | radeon_connector = to_radeon_connector(connector); | ||
385 | break; | ||
386 | } | ||
387 | } | ||
388 | |||
389 | if (!radeon_connector) { | ||
390 | DRM_ERROR("Couldn't find encoder's connector\n"); | ||
391 | return; | 390 | return; |
392 | } | ||
393 | 391 | ||
394 | sad_count = drm_edid_to_speaker_allocation( | 392 | sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector), |
395 | radeon_connector_edid(connector), &sadb); | 393 | &sadb); |
396 | if (sad_count < 0) { | 394 | if (sad_count < 0) { |
397 | DRM_DEBUG("Couldn't read Speaker Allocation Data Block: %d\n", | 395 | DRM_DEBUG("Couldn't read Speaker Allocation Data Block: %d\n", |
398 | sad_count); | 396 | sad_count); |
@@ -406,26 +404,13 @@ static void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder) | |||
406 | } | 404 | } |
407 | 405 | ||
408 | static void radeon_audio_write_latency_fields(struct drm_encoder *encoder, | 406 | static void radeon_audio_write_latency_fields(struct drm_encoder *encoder, |
409 | struct drm_display_mode *mode) | 407 | struct drm_display_mode *mode) |
410 | { | 408 | { |
411 | struct radeon_encoder *radeon_encoder; | 409 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
412 | struct drm_connector *connector; | 410 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
413 | struct radeon_connector *radeon_connector = 0; | ||
414 | |||
415 | list_for_each_entry(connector, | ||
416 | &encoder->dev->mode_config.connector_list, head) { | ||
417 | if (connector->encoder == encoder) { | ||
418 | radeon_connector = to_radeon_connector(connector); | ||
419 | break; | ||
420 | } | ||
421 | } | ||
422 | 411 | ||
423 | if (!radeon_connector) { | 412 | if (!connector) |
424 | DRM_ERROR("Couldn't find encoder's connector\n"); | ||
425 | return; | 413 | return; |
426 | } | ||
427 | |||
428 | radeon_encoder = to_radeon_encoder(encoder); | ||
429 | 414 | ||
430 | if (radeon_encoder->audio && radeon_encoder->audio->write_latency_fields) | 415 | if (radeon_encoder->audio && radeon_encoder->audio->write_latency_fields) |
431 | radeon_encoder->audio->write_latency_fields(encoder, connector, mode); | 416 | radeon_encoder->audio->write_latency_fields(encoder, connector, mode); |
@@ -451,29 +436,23 @@ static void radeon_audio_select_pin(struct drm_encoder *encoder) | |||
451 | } | 436 | } |
452 | 437 | ||
453 | void radeon_audio_detect(struct drm_connector *connector, | 438 | void radeon_audio_detect(struct drm_connector *connector, |
439 | struct drm_encoder *encoder, | ||
454 | enum drm_connector_status status) | 440 | enum drm_connector_status status) |
455 | { | 441 | { |
456 | struct radeon_device *rdev; | 442 | struct drm_device *dev = connector->dev; |
457 | struct radeon_encoder *radeon_encoder; | 443 | struct radeon_device *rdev = dev->dev_private; |
444 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
458 | struct radeon_encoder_atom_dig *dig; | 445 | struct radeon_encoder_atom_dig *dig; |
459 | 446 | ||
460 | if (!connector || !connector->encoder) | 447 | if (!radeon_audio_chipset_supported(rdev)) |
461 | return; | 448 | return; |
462 | 449 | ||
463 | rdev = connector->encoder->dev->dev_private; | 450 | if (!radeon_encoder_is_digital(encoder)) |
464 | |||
465 | if (!radeon_audio_chipset_supported(rdev)) | ||
466 | return; | 451 | return; |
467 | 452 | ||
468 | radeon_encoder = to_radeon_encoder(connector->encoder); | ||
469 | dig = radeon_encoder->enc_priv; | 453 | dig = radeon_encoder->enc_priv; |
470 | 454 | ||
471 | if (status == connector_status_connected) { | 455 | if (status == connector_status_connected) { |
472 | if (!drm_detect_monitor_audio(radeon_connector_edid(connector))) { | ||
473 | radeon_encoder->audio = NULL; | ||
474 | return; | ||
475 | } | ||
476 | |||
477 | if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { | 456 | if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { |
478 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 457 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
479 | 458 | ||
@@ -486,11 +465,17 @@ void radeon_audio_detect(struct drm_connector *connector, | |||
486 | radeon_encoder->audio = rdev->audio.hdmi_funcs; | 465 | radeon_encoder->audio = rdev->audio.hdmi_funcs; |
487 | } | 466 | } |
488 | 467 | ||
489 | dig->afmt->pin = radeon_audio_get_pin(connector->encoder); | 468 | if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { |
490 | radeon_audio_enable(rdev, dig->afmt->pin, 0xf); | 469 | if (!dig->pin) |
470 | dig->pin = radeon_audio_get_pin(encoder); | ||
471 | radeon_audio_enable(rdev, dig->pin, 0xf); | ||
472 | } else { | ||
473 | radeon_audio_enable(rdev, dig->pin, 0); | ||
474 | dig->pin = NULL; | ||
475 | } | ||
491 | } else { | 476 | } else { |
492 | radeon_audio_enable(rdev, dig->afmt->pin, 0); | 477 | radeon_audio_enable(rdev, dig->pin, 0); |
493 | dig->afmt->pin = NULL; | 478 | dig->pin = NULL; |
494 | } | 479 | } |
495 | } | 480 | } |
496 | 481 | ||
@@ -518,29 +503,18 @@ static void radeon_audio_set_dto(struct drm_encoder *encoder, unsigned int clock | |||
518 | } | 503 | } |
519 | 504 | ||
520 | static int radeon_audio_set_avi_packet(struct drm_encoder *encoder, | 505 | static int radeon_audio_set_avi_packet(struct drm_encoder *encoder, |
521 | struct drm_display_mode *mode) | 506 | struct drm_display_mode *mode) |
522 | { | 507 | { |
523 | struct radeon_device *rdev = encoder->dev->dev_private; | 508 | struct radeon_device *rdev = encoder->dev->dev_private; |
524 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 509 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
525 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 510 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
526 | struct drm_connector *connector; | 511 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
527 | struct radeon_connector *radeon_connector = NULL; | ||
528 | u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE]; | 512 | u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE]; |
529 | struct hdmi_avi_infoframe frame; | 513 | struct hdmi_avi_infoframe frame; |
530 | int err; | 514 | int err; |
531 | 515 | ||
532 | list_for_each_entry(connector, | 516 | if (!connector) |
533 | &encoder->dev->mode_config.connector_list, head) { | 517 | return -EINVAL; |
534 | if (connector->encoder == encoder) { | ||
535 | radeon_connector = to_radeon_connector(connector); | ||
536 | break; | ||
537 | } | ||
538 | } | ||
539 | |||
540 | if (!radeon_connector) { | ||
541 | DRM_ERROR("Couldn't find encoder's connector\n"); | ||
542 | return -ENOENT; | ||
543 | } | ||
544 | 518 | ||
545 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); | 519 | err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); |
546 | if (err < 0) { | 520 | if (err < 0) { |
@@ -563,8 +537,8 @@ static int radeon_audio_set_avi_packet(struct drm_encoder *encoder, | |||
563 | return err; | 537 | return err; |
564 | } | 538 | } |
565 | 539 | ||
566 | if (dig && dig->afmt && | 540 | if (dig && dig->afmt && radeon_encoder->audio && |
567 | radeon_encoder->audio && radeon_encoder->audio->set_avi_packet) | 541 | radeon_encoder->audio->set_avi_packet) |
568 | radeon_encoder->audio->set_avi_packet(rdev, dig->afmt->offset, | 542 | radeon_encoder->audio->set_avi_packet(rdev, dig->afmt->offset, |
569 | buffer, sizeof(buffer)); | 543 | buffer, sizeof(buffer)); |
570 | 544 | ||
@@ -722,30 +696,41 @@ static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder, | |||
722 | { | 696 | { |
723 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 697 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
724 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 698 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
699 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
725 | 700 | ||
726 | if (!dig || !dig->afmt) | 701 | if (!dig || !dig->afmt) |
727 | return; | 702 | return; |
728 | 703 | ||
729 | radeon_audio_set_mute(encoder, true); | 704 | if (!connector) |
705 | return; | ||
730 | 706 | ||
731 | radeon_audio_write_speaker_allocation(encoder); | 707 | if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { |
732 | radeon_audio_write_sad_regs(encoder); | 708 | radeon_audio_set_mute(encoder, true); |
733 | radeon_audio_write_latency_fields(encoder, mode); | ||
734 | radeon_audio_set_dto(encoder, mode->clock); | ||
735 | radeon_audio_set_vbi_packet(encoder); | ||
736 | radeon_hdmi_set_color_depth(encoder); | ||
737 | radeon_audio_update_acr(encoder, mode->clock); | ||
738 | radeon_audio_set_audio_packet(encoder); | ||
739 | radeon_audio_select_pin(encoder); | ||
740 | 709 | ||
741 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | 710 | radeon_audio_write_speaker_allocation(encoder); |
742 | return; | 711 | radeon_audio_write_sad_regs(encoder); |
712 | radeon_audio_write_latency_fields(encoder, mode); | ||
713 | radeon_audio_set_dto(encoder, mode->clock); | ||
714 | radeon_audio_set_vbi_packet(encoder); | ||
715 | radeon_hdmi_set_color_depth(encoder); | ||
716 | radeon_audio_update_acr(encoder, mode->clock); | ||
717 | radeon_audio_set_audio_packet(encoder); | ||
718 | radeon_audio_select_pin(encoder); | ||
719 | |||
720 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | ||
721 | return; | ||
743 | 722 | ||
744 | radeon_audio_set_mute(encoder, false); | 723 | radeon_audio_set_mute(encoder, false); |
724 | } else { | ||
725 | radeon_hdmi_set_color_depth(encoder); | ||
726 | |||
727 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | ||
728 | return; | ||
729 | } | ||
745 | } | 730 | } |
746 | 731 | ||
747 | static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, | 732 | static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, |
748 | struct drm_display_mode *mode) | 733 | struct drm_display_mode *mode) |
749 | { | 734 | { |
750 | struct drm_device *dev = encoder->dev; | 735 | struct drm_device *dev = encoder->dev; |
751 | struct radeon_device *rdev = dev->dev_private; | 736 | struct radeon_device *rdev = dev->dev_private; |
@@ -759,22 +744,27 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, | |||
759 | if (!dig || !dig->afmt) | 744 | if (!dig || !dig->afmt) |
760 | return; | 745 | return; |
761 | 746 | ||
762 | radeon_audio_write_speaker_allocation(encoder); | 747 | if (!connector) |
763 | radeon_audio_write_sad_regs(encoder); | ||
764 | radeon_audio_write_latency_fields(encoder, mode); | ||
765 | if (rdev->clock.dp_extclk || ASIC_IS_DCE5(rdev)) | ||
766 | radeon_audio_set_dto(encoder, rdev->clock.default_dispclk * 10); | ||
767 | else | ||
768 | radeon_audio_set_dto(encoder, dig_connector->dp_clock); | ||
769 | radeon_audio_set_audio_packet(encoder); | ||
770 | radeon_audio_select_pin(encoder); | ||
771 | |||
772 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | ||
773 | return; | 748 | return; |
749 | |||
750 | if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { | ||
751 | radeon_audio_write_speaker_allocation(encoder); | ||
752 | radeon_audio_write_sad_regs(encoder); | ||
753 | radeon_audio_write_latency_fields(encoder, mode); | ||
754 | if (rdev->clock.dp_extclk || ASIC_IS_DCE5(rdev)) | ||
755 | radeon_audio_set_dto(encoder, rdev->clock.default_dispclk * 10); | ||
756 | else | ||
757 | radeon_audio_set_dto(encoder, dig_connector->dp_clock); | ||
758 | radeon_audio_set_audio_packet(encoder); | ||
759 | radeon_audio_select_pin(encoder); | ||
760 | |||
761 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | ||
762 | return; | ||
763 | } | ||
774 | } | 764 | } |
775 | 765 | ||
776 | void radeon_audio_mode_set(struct drm_encoder *encoder, | 766 | void radeon_audio_mode_set(struct drm_encoder *encoder, |
777 | struct drm_display_mode *mode) | 767 | struct drm_display_mode *mode) |
778 | { | 768 | { |
779 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 769 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
780 | 770 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_audio.h b/drivers/gpu/drm/radeon/radeon_audio.h index 8438304f7139..059cc3012062 100644 --- a/drivers/gpu/drm/radeon/radeon_audio.h +++ b/drivers/gpu/drm/radeon/radeon_audio.h | |||
@@ -68,7 +68,8 @@ struct radeon_audio_funcs | |||
68 | 68 | ||
69 | int radeon_audio_init(struct radeon_device *rdev); | 69 | int radeon_audio_init(struct radeon_device *rdev); |
70 | void radeon_audio_detect(struct drm_connector *connector, | 70 | void radeon_audio_detect(struct drm_connector *connector, |
71 | enum drm_connector_status status); | 71 | struct drm_encoder *encoder, |
72 | enum drm_connector_status status); | ||
72 | u32 radeon_audio_endpoint_rreg(struct radeon_device *rdev, | 73 | u32 radeon_audio_endpoint_rreg(struct radeon_device *rdev, |
73 | u32 offset, u32 reg); | 74 | u32 offset, u32 reg); |
74 | void radeon_audio_endpoint_wreg(struct radeon_device *rdev, | 75 | void radeon_audio_endpoint_wreg(struct radeon_device *rdev, |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 3e5f6b71f3ad..c097d3a82bda 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
@@ -1255,10 +1255,15 @@ struct radeon_encoder_lvds *radeon_combios_get_lvds_info(struct radeon_encoder | |||
1255 | 1255 | ||
1256 | if ((RBIOS16(tmp) == lvds->native_mode.hdisplay) && | 1256 | if ((RBIOS16(tmp) == lvds->native_mode.hdisplay) && |
1257 | (RBIOS16(tmp + 2) == lvds->native_mode.vdisplay)) { | 1257 | (RBIOS16(tmp + 2) == lvds->native_mode.vdisplay)) { |
1258 | u32 hss = (RBIOS16(tmp + 21) - RBIOS16(tmp + 19) - 1) * 8; | ||
1259 | |||
1260 | if (hss > lvds->native_mode.hdisplay) | ||
1261 | hss = (10 - 1) * 8; | ||
1262 | |||
1258 | lvds->native_mode.htotal = lvds->native_mode.hdisplay + | 1263 | lvds->native_mode.htotal = lvds->native_mode.hdisplay + |
1259 | (RBIOS16(tmp + 17) - RBIOS16(tmp + 19)) * 8; | 1264 | (RBIOS16(tmp + 17) - RBIOS16(tmp + 19)) * 8; |
1260 | lvds->native_mode.hsync_start = lvds->native_mode.hdisplay + | 1265 | lvds->native_mode.hsync_start = lvds->native_mode.hdisplay + |
1261 | (RBIOS16(tmp + 21) - RBIOS16(tmp + 19) - 1) * 8; | 1266 | hss; |
1262 | lvds->native_mode.hsync_end = lvds->native_mode.hsync_start + | 1267 | lvds->native_mode.hsync_end = lvds->native_mode.hsync_start + |
1263 | (RBIOS8(tmp + 23) * 8); | 1268 | (RBIOS8(tmp + 23) * 8); |
1264 | 1269 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index cebb65e07e1d..94b21ae70ef7 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -1379,8 +1379,16 @@ out: | |||
1379 | /* updated in get modes as well since we need to know if it's analog or digital */ | 1379 | /* updated in get modes as well since we need to know if it's analog or digital */ |
1380 | radeon_connector_update_scratch_regs(connector, ret); | 1380 | radeon_connector_update_scratch_regs(connector, ret); |
1381 | 1381 | ||
1382 | if (radeon_audio != 0) | 1382 | if ((radeon_audio != 0) && radeon_connector->use_digital) { |
1383 | radeon_audio_detect(connector, ret); | 1383 | const struct drm_connector_helper_funcs *connector_funcs = |
1384 | connector->helper_private; | ||
1385 | |||
1386 | encoder = connector_funcs->best_encoder(connector); | ||
1387 | if (encoder && (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)) { | ||
1388 | radeon_connector_get_edid(connector); | ||
1389 | radeon_audio_detect(connector, encoder, ret); | ||
1390 | } | ||
1391 | } | ||
1384 | 1392 | ||
1385 | exit: | 1393 | exit: |
1386 | pm_runtime_mark_last_busy(connector->dev->dev); | 1394 | pm_runtime_mark_last_busy(connector->dev->dev); |
@@ -1717,8 +1725,10 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | |||
1717 | 1725 | ||
1718 | radeon_connector_update_scratch_regs(connector, ret); | 1726 | radeon_connector_update_scratch_regs(connector, ret); |
1719 | 1727 | ||
1720 | if (radeon_audio != 0) | 1728 | if ((radeon_audio != 0) && encoder) { |
1721 | radeon_audio_detect(connector, ret); | 1729 | radeon_connector_get_edid(connector); |
1730 | radeon_audio_detect(connector, encoder, ret); | ||
1731 | } | ||
1722 | 1732 | ||
1723 | out: | 1733 | out: |
1724 | pm_runtime_mark_last_busy(connector->dev->dev); | 1734 | pm_runtime_mark_last_busy(connector->dev->dev); |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 07909d817381..aecc3e3dec0c 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -237,7 +237,6 @@ struct radeon_afmt { | |||
237 | int offset; | 237 | int offset; |
238 | bool last_buffer_filled_status; | 238 | bool last_buffer_filled_status; |
239 | int id; | 239 | int id; |
240 | struct r600_audio_pin *pin; | ||
241 | }; | 240 | }; |
242 | 241 | ||
243 | struct radeon_mode_info { | 242 | struct radeon_mode_info { |
@@ -439,6 +438,7 @@ struct radeon_encoder_atom_dig { | |||
439 | uint8_t backlight_level; | 438 | uint8_t backlight_level; |
440 | int panel_mode; | 439 | int panel_mode; |
441 | struct radeon_afmt *afmt; | 440 | struct radeon_afmt *afmt; |
441 | struct r600_audio_pin *pin; | ||
442 | int active_mst_links; | 442 | int active_mst_links; |
443 | }; | 443 | }; |
444 | 444 | ||