aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_audio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_audio.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_audio.c242
1 files changed, 116 insertions, 126 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c
index 25191f126f3b..fbc8d88d6e5d 100644
--- a/drivers/gpu/drm/radeon/radeon_audio.c
+++ b/drivers/gpu/drm/radeon/radeon_audio.c
@@ -242,6 +242,35 @@ static struct radeon_audio_funcs dce6_dp_funcs = {
242 .dpms = evergreen_dp_enable, 242 .dpms = evergreen_dp_enable,
243}; 243};
244 244
245static void radeon_audio_enable(struct radeon_device *rdev,
246 struct r600_audio_pin *pin, u8 enable_mask)
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
270 if (rdev->audio.funcs->enable)
271 rdev->audio.funcs->enable(rdev, pin, enable_mask);
272}
273
245static void radeon_audio_interface_init(struct radeon_device *rdev) 274static void radeon_audio_interface_init(struct radeon_device *rdev)
246{ 275{
247 if (ASIC_IS_DCE6(rdev)) { 276 if (ASIC_IS_DCE6(rdev)) {
@@ -307,7 +336,7 @@ int radeon_audio_init(struct radeon_device *rdev)
307 336
308 /* disable audio. it will be set up later */ 337 /* disable audio. it will be set up later */
309 for (i = 0; i < rdev->audio.num_pins; i++) 338 for (i = 0; i < rdev->audio.num_pins; i++)
310 radeon_audio_enable(rdev, &rdev->audio.pin[i], false); 339 radeon_audio_enable(rdev, &rdev->audio.pin[i], 0);
311 340
312 return 0; 341 return 0;
313} 342}
@@ -329,24 +358,13 @@ void radeon_audio_endpoint_wreg(struct radeon_device *rdev, u32 offset,
329 358
330static void radeon_audio_write_sad_regs(struct drm_encoder *encoder) 359static void radeon_audio_write_sad_regs(struct drm_encoder *encoder)
331{ 360{
332 struct radeon_encoder *radeon_encoder; 361 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
333 struct drm_connector *connector; 362 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
334 struct radeon_connector *radeon_connector = NULL;
335 struct cea_sad *sads; 363 struct cea_sad *sads;
336 int sad_count; 364 int sad_count;
337 365
338 list_for_each_entry(connector, 366 if (!connector)
339 &encoder->dev->mode_config.connector_list, head) {
340 if (connector->encoder == encoder) {
341 radeon_connector = to_radeon_connector(connector);
342 break;
343 }
344 }
345
346 if (!radeon_connector) {
347 DRM_ERROR("Couldn't find encoder's connector\n");
348 return; 367 return;
349 }
350 368
351 sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads); 369 sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads);
352 if (sad_count <= 0) { 370 if (sad_count <= 0) {
@@ -355,8 +373,6 @@ static void radeon_audio_write_sad_regs(struct drm_encoder *encoder)
355 } 373 }
356 BUG_ON(!sads); 374 BUG_ON(!sads);
357 375
358 radeon_encoder = to_radeon_encoder(encoder);
359
360 if (radeon_encoder->audio && radeon_encoder->audio->write_sad_regs) 376 if (radeon_encoder->audio && radeon_encoder->audio->write_sad_regs)
361 radeon_encoder->audio->write_sad_regs(encoder, sads, sad_count); 377 radeon_encoder->audio->write_sad_regs(encoder, sads, sad_count);
362 378
@@ -365,27 +381,16 @@ static void radeon_audio_write_sad_regs(struct drm_encoder *encoder)
365 381
366static void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder) 382static void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder)
367{ 383{
384 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
368 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 385 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
369 struct drm_connector *connector;
370 struct radeon_connector *radeon_connector = NULL;
371 u8 *sadb = NULL; 386 u8 *sadb = NULL;
372 int sad_count; 387 int sad_count;
373 388
374 list_for_each_entry(connector, 389 if (!connector)
375 &encoder->dev->mode_config.connector_list, head) {
376 if (connector->encoder == encoder) {
377 radeon_connector = to_radeon_connector(connector);
378 break;
379 }
380 }
381
382 if (!radeon_connector) {
383 DRM_ERROR("Couldn't find encoder's connector\n");
384 return; 390 return;
385 }
386 391
387 sad_count = drm_edid_to_speaker_allocation( 392 sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector),
388 radeon_connector_edid(connector), &sadb); 393 &sadb);
389 if (sad_count < 0) { 394 if (sad_count < 0) {
390 DRM_DEBUG("Couldn't read Speaker Allocation Data Block: %d\n", 395 DRM_DEBUG("Couldn't read Speaker Allocation Data Block: %d\n",
391 sad_count); 396 sad_count);
@@ -399,26 +404,13 @@ static void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder)
399} 404}
400 405
401static void radeon_audio_write_latency_fields(struct drm_encoder *encoder, 406static void radeon_audio_write_latency_fields(struct drm_encoder *encoder,
402 struct drm_display_mode *mode) 407 struct drm_display_mode *mode)
403{ 408{
404 struct radeon_encoder *radeon_encoder; 409 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
405 struct drm_connector *connector; 410 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
406 struct radeon_connector *radeon_connector = 0;
407
408 list_for_each_entry(connector,
409 &encoder->dev->mode_config.connector_list, head) {
410 if (connector->encoder == encoder) {
411 radeon_connector = to_radeon_connector(connector);
412 break;
413 }
414 }
415 411
416 if (!radeon_connector) { 412 if (!connector)
417 DRM_ERROR("Couldn't find encoder's connector\n");
418 return; 413 return;
419 }
420
421 radeon_encoder = to_radeon_encoder(encoder);
422 414
423 if (radeon_encoder->audio && radeon_encoder->audio->write_latency_fields) 415 if (radeon_encoder->audio && radeon_encoder->audio->write_latency_fields)
424 radeon_encoder->audio->write_latency_fields(encoder, connector, mode); 416 radeon_encoder->audio->write_latency_fields(encoder, connector, mode);
@@ -443,54 +435,47 @@ static void radeon_audio_select_pin(struct drm_encoder *encoder)
443 radeon_encoder->audio->select_pin(encoder); 435 radeon_encoder->audio->select_pin(encoder);
444} 436}
445 437
446void radeon_audio_enable(struct radeon_device *rdev,
447 struct r600_audio_pin *pin, u8 enable_mask)
448{
449 if (rdev->audio.funcs->enable)
450 rdev->audio.funcs->enable(rdev, pin, enable_mask);
451}
452
453void radeon_audio_detect(struct drm_connector *connector, 438void 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 struct radeon_connector *radeon_connector; 456 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
473 int sink_type; 457 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
474 458
475 if (!drm_detect_monitor_audio(radeon_connector_edid(connector))) { 459 if (radeon_dp_getsinktype(radeon_connector) ==
476 radeon_encoder->audio = NULL; 460 CONNECTOR_OBJECT_ID_DISPLAYPORT)
477 return; 461 radeon_encoder->audio = rdev->audio.dp_funcs;
478 } 462 else
479 463 radeon_encoder->audio = rdev->audio.hdmi_funcs;
480 radeon_connector = to_radeon_connector(connector); 464 } else {
481 sink_type = radeon_dp_getsinktype(radeon_connector);
482
483 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort &&
484 sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT)
485 radeon_encoder->audio = rdev->audio.dp_funcs;
486 else
487 radeon_encoder->audio = rdev->audio.hdmi_funcs; 465 radeon_encoder->audio = rdev->audio.hdmi_funcs;
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
@@ -502,7 +487,7 @@ void radeon_audio_fini(struct radeon_device *rdev)
502 return; 487 return;
503 488
504 for (i = 0; i < rdev->audio.num_pins; i++) 489 for (i = 0; i < rdev->audio.num_pins; i++)
505 radeon_audio_enable(rdev, &rdev->audio.pin[i], false); 490 radeon_audio_enable(rdev, &rdev->audio.pin[i], 0);
506 491
507 rdev->audio.enabled = false; 492 rdev->audio.enabled = false;
508} 493}
@@ -518,29 +503,18 @@ static void radeon_audio_set_dto(struct drm_encoder *encoder, unsigned int clock
518} 503}
519 504
520static int radeon_audio_set_avi_packet(struct drm_encoder *encoder, 505static 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;
706
707 if (drm_detect_monitor_audio(radeon_connector_edid(connector))) {
708 radeon_audio_set_mute(encoder, true);
730 709
731 radeon_audio_write_speaker_allocation(encoder); 710 radeon_audio_write_speaker_allocation(encoder);
732 radeon_audio_write_sad_regs(encoder); 711 radeon_audio_write_sad_regs(encoder);
733 radeon_audio_write_latency_fields(encoder, mode); 712 radeon_audio_write_latency_fields(encoder, mode);
734 radeon_audio_set_dto(encoder, mode->clock); 713 radeon_audio_set_dto(encoder, mode->clock);
735 radeon_audio_set_vbi_packet(encoder); 714 radeon_audio_set_vbi_packet(encoder);
736 radeon_hdmi_set_color_depth(encoder); 715 radeon_hdmi_set_color_depth(encoder);
737 radeon_audio_update_acr(encoder, mode->clock); 716 radeon_audio_update_acr(encoder, mode->clock);
738 radeon_audio_set_audio_packet(encoder); 717 radeon_audio_set_audio_packet(encoder);
739 radeon_audio_select_pin(encoder); 718 radeon_audio_select_pin(encoder);
740 719
741 if (radeon_audio_set_avi_packet(encoder, mode) < 0) 720 if (radeon_audio_set_avi_packet(encoder, mode) < 0)
742 return; 721 return;
722
723 radeon_audio_set_mute(encoder, false);
724 } else {
725 radeon_hdmi_set_color_depth(encoder);
743 726
744 radeon_audio_set_mute(encoder, false); 727 if (radeon_audio_set_avi_packet(encoder, mode) < 0)
728 return;
729 }
745} 730}
746 731
747static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, 732static 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
776void radeon_audio_mode_set(struct drm_encoder *encoder, 766void 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