aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_audio.c
diff options
context:
space:
mode:
authorSlava Grigorev <slava.grigorev@amd.com>2014-12-11 13:11:29 -0500
committerAlex Deucher <alexander.deucher@amd.com>2015-01-22 10:42:18 -0500
commitccd4be7eb7ef2aac076b604c716f36aa926651e3 (patch)
treeaadf49eff0326a5369b80d7504f053063f620605 /drivers/gpu/drm/radeon/radeon_audio.c
parent6f945693be7eea24b1a8e5ce252a96df98d55a5c (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.c78
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
305void 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
337u32 radeon_audio_endpoint_rreg(struct radeon_device *rdev, u32 offset, u32 reg) 305u32 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
443void 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
475void radeon_audio_fini(struct radeon_device *rdev) 486void 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;