diff options
author | Slava Grigorev <slava.grigorev@amd.com> | 2014-12-11 13:11:29 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-01-22 10:42:18 -0500 |
commit | ccd4be7eb7ef2aac076b604c716f36aa926651e3 (patch) | |
tree | aadf49eff0326a5369b80d7504f053063f620605 /drivers/gpu/drm/radeon/radeon_audio.c | |
parent | 6f945693be7eea24b1a8e5ce252a96df98d55a5c (diff) |
radeon/audio: moved audio caps programming to audio_hotplug() function
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/radeon_audio.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_audio.c | 78 |
1 files changed, 43 insertions, 35 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c index 4a2774ac7827..f1e22a857da9 100644 --- a/drivers/gpu/drm/radeon/radeon_audio.c +++ b/drivers/gpu/drm/radeon/radeon_audio.c | |||
@@ -302,38 +302,6 @@ int radeon_audio_init(struct radeon_device *rdev) | |||
302 | return 0; | 302 | return 0; |
303 | } | 303 | } |
304 | 304 | ||
305 | void radeon_audio_detect(struct drm_connector *connector, | ||
306 | enum drm_connector_status status) | ||
307 | { | ||
308 | if (!connector || !connector->encoder) | ||
309 | return; | ||
310 | |||
311 | if (status == connector_status_connected) { | ||
312 | int sink_type; | ||
313 | struct radeon_device *rdev = connector->encoder->dev->dev_private; | ||
314 | struct radeon_connector *radeon_connector; | ||
315 | struct radeon_encoder *radeon_encoder = | ||
316 | to_radeon_encoder(connector->encoder); | ||
317 | |||
318 | if (!drm_detect_monitor_audio(radeon_connector_edid(connector))) { | ||
319 | radeon_encoder->audio = 0; | ||
320 | return; | ||
321 | } | ||
322 | |||
323 | radeon_connector = to_radeon_connector(connector); | ||
324 | sink_type = radeon_dp_getsinktype(radeon_connector); | ||
325 | |||
326 | if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort && | ||
327 | sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) | ||
328 | radeon_encoder->audio = rdev->audio.dp_funcs; | ||
329 | else | ||
330 | radeon_encoder->audio = rdev->audio.hdmi_funcs; | ||
331 | /* TODO: set up the sads, etc. and set the audio enable_mask */ | ||
332 | } else { | ||
333 | /* TODO: reset the audio enable_mask */ | ||
334 | } | ||
335 | } | ||
336 | |||
337 | u32 radeon_audio_endpoint_rreg(struct radeon_device *rdev, u32 offset, u32 reg) | 305 | u32 radeon_audio_endpoint_rreg(struct radeon_device *rdev, u32 offset, u32 reg) |
338 | { | 306 | { |
339 | if (rdev->audio.funcs->endpoint_rreg) | 307 | if (rdev->audio.funcs->endpoint_rreg) |
@@ -472,6 +440,49 @@ void radeon_audio_enable(struct radeon_device *rdev, | |||
472 | rdev->audio.funcs->enable(rdev, pin, enable_mask); | 440 | rdev->audio.funcs->enable(rdev, pin, enable_mask); |
473 | } | 441 | } |
474 | 442 | ||
443 | void radeon_audio_detect(struct drm_connector *connector, | ||
444 | enum drm_connector_status status) | ||
445 | { | ||
446 | struct radeon_device *rdev; | ||
447 | struct radeon_encoder *radeon_encoder; | ||
448 | struct radeon_encoder_atom_dig *dig; | ||
449 | |||
450 | if (!connector || !connector->encoder) | ||
451 | return; | ||
452 | |||
453 | rdev = connector->encoder->dev->dev_private; | ||
454 | radeon_encoder = to_radeon_encoder(connector->encoder); | ||
455 | dig = radeon_encoder->enc_priv; | ||
456 | |||
457 | if (status == connector_status_connected) { | ||
458 | struct radeon_connector *radeon_connector; | ||
459 | int sink_type; | ||
460 | |||
461 | if (!drm_detect_monitor_audio(radeon_connector_edid(connector))) { | ||
462 | radeon_encoder->audio = 0; | ||
463 | return; | ||
464 | } | ||
465 | |||
466 | radeon_connector = to_radeon_connector(connector); | ||
467 | sink_type = radeon_dp_getsinktype(radeon_connector); | ||
468 | |||
469 | if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort && | ||
470 | sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) | ||
471 | radeon_encoder->audio = rdev->audio.dp_funcs; | ||
472 | else | ||
473 | radeon_encoder->audio = rdev->audio.hdmi_funcs; | ||
474 | |||
475 | radeon_audio_write_speaker_allocation(connector->encoder); | ||
476 | radeon_audio_write_sad_regs(connector->encoder); | ||
477 | if (connector->encoder->crtc) | ||
478 | radeon_audio_write_latency_fields(connector->encoder, | ||
479 | &connector->encoder->crtc->mode); | ||
480 | radeon_audio_enable(rdev, dig->afmt->pin, 0xf); | ||
481 | } else { | ||
482 | radeon_audio_enable(rdev, dig->afmt->pin, 0); | ||
483 | } | ||
484 | } | ||
485 | |||
475 | void radeon_audio_fini(struct radeon_device *rdev) | 486 | void radeon_audio_fini(struct radeon_device *rdev) |
476 | { | 487 | { |
477 | int i; | 488 | int i; |
@@ -690,11 +701,8 @@ static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder, | |||
690 | radeon_hdmi_set_color_depth(encoder); | 701 | radeon_hdmi_set_color_depth(encoder); |
691 | radeon_audio_set_mute(encoder, false); | 702 | radeon_audio_set_mute(encoder, false); |
692 | radeon_audio_update_acr(encoder, mode->clock); | 703 | radeon_audio_update_acr(encoder, mode->clock); |
693 | radeon_audio_write_speaker_allocation(encoder); | ||
694 | radeon_audio_set_audio_packet(encoder); | 704 | radeon_audio_set_audio_packet(encoder); |
695 | radeon_audio_select_pin(encoder); | 705 | radeon_audio_select_pin(encoder); |
696 | radeon_audio_write_sad_regs(encoder); | ||
697 | radeon_audio_write_latency_fields(encoder, mode); | ||
698 | 706 | ||
699 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | 707 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) |
700 | return; | 708 | return; |