Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/bridge-connector: hook DisplayPort audio support

Reuse existing code plumbing HDMI audio support and the existing HDMI
audio helpers that register HDMI codec device and plumb in the
DisplayPort audio interfaces to be handled by the drm_bridge_connector.

Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://lore.kernel.org/r/20250314-dp-hdmi-audio-v6-3-dbd228fa73d7@oss.qualcomm.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>

+93 -24
+93 -24
drivers/gpu/drm/display/drm_bridge_connector.c
··· 105 105 * HDMI Audio infrastructure, if any (see &DRM_BRIDGE_OP_HDMI_AUDIO). 106 106 */ 107 107 struct drm_bridge *bridge_hdmi_audio; 108 + /** 109 + * @bridge_dp_audio: 110 + * 111 + * The bridge in the chain that implements necessary support for the 112 + * DisplayPort Audio infrastructure, if any (see 113 + * &DRM_BRIDGE_OP_DP_AUDIO). 114 + */ 115 + struct drm_bridge *bridge_dp_audio; 108 116 }; 109 117 110 118 #define to_drm_bridge_connector(x) \ ··· 448 440 to_drm_bridge_connector(connector); 449 441 struct drm_bridge *bridge; 450 442 451 - bridge = bridge_connector->bridge_hdmi_audio; 452 - if (!bridge) 453 - return -EINVAL; 443 + if (bridge_connector->bridge_hdmi_audio) { 444 + bridge = bridge_connector->bridge_hdmi_audio; 454 445 455 - if (!bridge->funcs->hdmi_audio_startup) 456 - return 0; 446 + if (!bridge->funcs->hdmi_audio_startup) 447 + return 0; 457 448 458 - return bridge->funcs->hdmi_audio_startup(connector, bridge); 449 + return bridge->funcs->hdmi_audio_startup(connector, bridge); 450 + } 451 + 452 + if (bridge_connector->bridge_dp_audio) { 453 + bridge = bridge_connector->bridge_dp_audio; 454 + 455 + if (!bridge->funcs->dp_audio_startup) 456 + return 0; 457 + 458 + return bridge->funcs->dp_audio_startup(connector, bridge); 459 + } 460 + 461 + return -EINVAL; 459 462 } 460 463 461 464 static int drm_bridge_connector_audio_prepare(struct drm_connector *connector, ··· 477 458 to_drm_bridge_connector(connector); 478 459 struct drm_bridge *bridge; 479 460 480 - bridge = bridge_connector->bridge_hdmi_audio; 481 - if (!bridge) 482 - return -EINVAL; 461 + if (bridge_connector->bridge_hdmi_audio) { 462 + bridge = bridge_connector->bridge_hdmi_audio; 483 463 484 - return bridge->funcs->hdmi_audio_prepare(connector, bridge, fmt, hparms); 464 + return bridge->funcs->hdmi_audio_prepare(connector, bridge, fmt, hparms); 465 + } 466 + 467 + if (bridge_connector->bridge_dp_audio) { 468 + bridge = bridge_connector->bridge_dp_audio; 469 + 470 + return bridge->funcs->dp_audio_prepare(connector, bridge, fmt, hparms); 471 + } 472 + 473 + return -EINVAL; 485 474 } 486 475 487 476 static void drm_bridge_connector_audio_shutdown(struct drm_connector *connector) ··· 498 471 to_drm_bridge_connector(connector); 499 472 struct drm_bridge *bridge; 500 473 501 - bridge = bridge_connector->bridge_hdmi_audio; 502 - if (!bridge) 503 - return; 474 + if (bridge_connector->bridge_hdmi_audio) { 475 + bridge = bridge_connector->bridge_hdmi_audio; 476 + bridge->funcs->hdmi_audio_shutdown(connector, bridge); 477 + } 504 478 505 - bridge->funcs->hdmi_audio_shutdown(connector, bridge); 479 + if (bridge_connector->bridge_dp_audio) { 480 + bridge = bridge_connector->bridge_dp_audio; 481 + bridge->funcs->dp_audio_shutdown(connector, bridge); 482 + } 506 483 } 507 484 508 485 static int drm_bridge_connector_audio_mute_stream(struct drm_connector *connector, ··· 516 485 to_drm_bridge_connector(connector); 517 486 struct drm_bridge *bridge; 518 487 519 - bridge = bridge_connector->bridge_hdmi_audio; 520 - if (!bridge) 521 - return -EINVAL; 488 + if (bridge_connector->bridge_hdmi_audio) { 489 + bridge = bridge_connector->bridge_hdmi_audio; 522 490 523 - if (bridge->funcs->hdmi_audio_mute_stream) 491 + if (!bridge->funcs->hdmi_audio_mute_stream) 492 + return -ENOTSUPP; 493 + 524 494 return bridge->funcs->hdmi_audio_mute_stream(connector, bridge, 525 495 enable, direction); 526 - else 527 - return -ENOTSUPP; 496 + } 497 + 498 + if (bridge_connector->bridge_dp_audio) { 499 + bridge = bridge_connector->bridge_dp_audio; 500 + 501 + if (!bridge->funcs->dp_audio_mute_stream) 502 + return -ENOTSUPP; 503 + 504 + return bridge->funcs->dp_audio_mute_stream(connector, bridge, 505 + enable, direction); 506 + } 507 + 508 + return -EINVAL; 528 509 } 529 510 530 511 static const struct drm_connector_hdmi_audio_funcs drm_bridge_connector_hdmi_audio_funcs = { ··· 630 587 if (bridge_connector->bridge_hdmi_audio) 631 588 return ERR_PTR(-EBUSY); 632 589 590 + if (bridge_connector->bridge_dp_audio) 591 + return ERR_PTR(-EBUSY); 592 + 633 593 if (!bridge->hdmi_audio_max_i2s_playback_channels && 634 594 !bridge->hdmi_audio_spdif_playback) 635 595 return ERR_PTR(-EINVAL); ··· 642 596 return ERR_PTR(-EINVAL); 643 597 644 598 bridge_connector->bridge_hdmi_audio = bridge; 599 + } 600 + 601 + if (bridge->ops & DRM_BRIDGE_OP_DP_AUDIO) { 602 + if (bridge_connector->bridge_dp_audio) 603 + return ERR_PTR(-EBUSY); 604 + 605 + if (bridge_connector->bridge_hdmi_audio) 606 + return ERR_PTR(-EBUSY); 607 + 608 + if (!bridge->hdmi_audio_max_i2s_playback_channels && 609 + !bridge->hdmi_audio_spdif_playback) 610 + return ERR_PTR(-EINVAL); 611 + 612 + if (!bridge->funcs->dp_audio_prepare || 613 + !bridge->funcs->dp_audio_shutdown) 614 + return ERR_PTR(-EINVAL); 615 + 616 + bridge_connector->bridge_dp_audio = bridge; 645 617 } 646 618 647 619 if (!drm_bridge_get_next_bridge(bridge)) ··· 705 641 return ERR_PTR(ret); 706 642 } 707 643 708 - if (bridge_connector->bridge_hdmi_audio) { 709 - bridge = bridge_connector->bridge_hdmi_audio; 644 + if (bridge_connector->bridge_hdmi_audio || 645 + bridge_connector->bridge_dp_audio) { 646 + struct device *dev; 710 647 711 - ret = drm_connector_hdmi_audio_init(connector, 712 - bridge->hdmi_audio_dev, 648 + if (bridge_connector->bridge_hdmi_audio) 649 + dev = bridge_connector->bridge_hdmi_audio->hdmi_audio_dev; 650 + else 651 + dev = bridge_connector->bridge_dp_audio->hdmi_audio_dev; 652 + 653 + ret = drm_connector_hdmi_audio_init(connector, dev, 713 654 &drm_bridge_connector_hdmi_audio_funcs, 714 655 bridge->hdmi_audio_max_i2s_playback_channels, 715 656 bridge->hdmi_audio_spdif_playback,