Skip to content

Commit 231aded

Browse files
committed
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>
1 parent d87ecc2 commit 231aded

1 file changed

Lines changed: 93 additions & 24 deletions

File tree

drivers/gpu/drm/display/drm_bridge_connector.c

Lines changed: 93 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,14 @@ struct drm_bridge_connector {
105105
* HDMI Audio infrastructure, if any (see &DRM_BRIDGE_OP_HDMI_AUDIO).
106106
*/
107107
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;
108116
};
109117

110118
#define to_drm_bridge_connector(x) \
@@ -440,14 +448,25 @@ static int drm_bridge_connector_audio_startup(struct drm_connector *connector)
440448
to_drm_bridge_connector(connector);
441449
struct drm_bridge *bridge;
442450

443-
bridge = bridge_connector->bridge_hdmi_audio;
444-
if (!bridge)
445-
return -EINVAL;
451+
if (bridge_connector->bridge_hdmi_audio) {
452+
bridge = bridge_connector->bridge_hdmi_audio;
446453

447-
if (!bridge->funcs->hdmi_audio_startup)
448-
return 0;
454+
if (!bridge->funcs->hdmi_audio_startup)
455+
return 0;
449456

450-
return bridge->funcs->hdmi_audio_startup(connector, bridge);
457+
return bridge->funcs->hdmi_audio_startup(connector, bridge);
458+
}
459+
460+
if (bridge_connector->bridge_dp_audio) {
461+
bridge = bridge_connector->bridge_dp_audio;
462+
463+
if (!bridge->funcs->dp_audio_startup)
464+
return 0;
465+
466+
return bridge->funcs->dp_audio_startup(connector, bridge);
467+
}
468+
469+
return -EINVAL;
451470
}
452471

453472
static int drm_bridge_connector_audio_prepare(struct drm_connector *connector,
@@ -458,11 +477,19 @@ static int drm_bridge_connector_audio_prepare(struct drm_connector *connector,
458477
to_drm_bridge_connector(connector);
459478
struct drm_bridge *bridge;
460479

461-
bridge = bridge_connector->bridge_hdmi_audio;
462-
if (!bridge)
463-
return -EINVAL;
480+
if (bridge_connector->bridge_hdmi_audio) {
481+
bridge = bridge_connector->bridge_hdmi_audio;
482+
483+
return bridge->funcs->hdmi_audio_prepare(connector, bridge, fmt, hparms);
484+
}
485+
486+
if (bridge_connector->bridge_dp_audio) {
487+
bridge = bridge_connector->bridge_dp_audio;
488+
489+
return bridge->funcs->dp_audio_prepare(connector, bridge, fmt, hparms);
490+
}
464491

465-
return bridge->funcs->hdmi_audio_prepare(connector, bridge, fmt, hparms);
492+
return -EINVAL;
466493
}
467494

468495
static void drm_bridge_connector_audio_shutdown(struct drm_connector *connector)
@@ -471,11 +498,15 @@ static void drm_bridge_connector_audio_shutdown(struct drm_connector *connector)
471498
to_drm_bridge_connector(connector);
472499
struct drm_bridge *bridge;
473500

474-
bridge = bridge_connector->bridge_hdmi_audio;
475-
if (!bridge)
476-
return;
501+
if (bridge_connector->bridge_hdmi_audio) {
502+
bridge = bridge_connector->bridge_hdmi_audio;
503+
bridge->funcs->hdmi_audio_shutdown(connector, bridge);
504+
}
477505

478-
bridge->funcs->hdmi_audio_shutdown(connector, bridge);
506+
if (bridge_connector->bridge_dp_audio) {
507+
bridge = bridge_connector->bridge_dp_audio;
508+
bridge->funcs->dp_audio_shutdown(connector, bridge);
509+
}
479510
}
480511

481512
static int drm_bridge_connector_audio_mute_stream(struct drm_connector *connector,
@@ -485,15 +516,27 @@ static int drm_bridge_connector_audio_mute_stream(struct drm_connector *connecto
485516
to_drm_bridge_connector(connector);
486517
struct drm_bridge *bridge;
487518

488-
bridge = bridge_connector->bridge_hdmi_audio;
489-
if (!bridge)
490-
return -EINVAL;
519+
if (bridge_connector->bridge_hdmi_audio) {
520+
bridge = bridge_connector->bridge_hdmi_audio;
521+
522+
if (!bridge->funcs->hdmi_audio_mute_stream)
523+
return -ENOTSUPP;
491524

492-
if (bridge->funcs->hdmi_audio_mute_stream)
493525
return bridge->funcs->hdmi_audio_mute_stream(connector, bridge,
494526
enable, direction);
495-
else
496-
return -ENOTSUPP;
527+
}
528+
529+
if (bridge_connector->bridge_dp_audio) {
530+
bridge = bridge_connector->bridge_dp_audio;
531+
532+
if (!bridge->funcs->dp_audio_mute_stream)
533+
return -ENOTSUPP;
534+
535+
return bridge->funcs->dp_audio_mute_stream(connector, bridge,
536+
enable, direction);
537+
}
538+
539+
return -EINVAL;
497540
}
498541

499542
static const struct drm_connector_hdmi_audio_funcs drm_bridge_connector_hdmi_audio_funcs = {
@@ -587,6 +630,9 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
587630
if (bridge_connector->bridge_hdmi_audio)
588631
return ERR_PTR(-EBUSY);
589632

633+
if (bridge_connector->bridge_dp_audio)
634+
return ERR_PTR(-EBUSY);
635+
590636
if (!bridge->hdmi_audio_max_i2s_playback_channels &&
591637
!bridge->hdmi_audio_spdif_playback)
592638
return ERR_PTR(-EINVAL);
@@ -598,6 +644,24 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
598644
bridge_connector->bridge_hdmi_audio = bridge;
599645
}
600646

647+
if (bridge->ops & DRM_BRIDGE_OP_DP_AUDIO) {
648+
if (bridge_connector->bridge_dp_audio)
649+
return ERR_PTR(-EBUSY);
650+
651+
if (bridge_connector->bridge_hdmi_audio)
652+
return ERR_PTR(-EBUSY);
653+
654+
if (!bridge->hdmi_audio_max_i2s_playback_channels &&
655+
!bridge->hdmi_audio_spdif_playback)
656+
return ERR_PTR(-EINVAL);
657+
658+
if (!bridge->funcs->dp_audio_prepare ||
659+
!bridge->funcs->dp_audio_shutdown)
660+
return ERR_PTR(-EINVAL);
661+
662+
bridge_connector->bridge_dp_audio = bridge;
663+
}
664+
601665
if (!drm_bridge_get_next_bridge(bridge))
602666
connector_type = bridge->type;
603667

@@ -641,11 +705,16 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
641705
return ERR_PTR(ret);
642706
}
643707

644-
if (bridge_connector->bridge_hdmi_audio) {
645-
bridge = bridge_connector->bridge_hdmi_audio;
708+
if (bridge_connector->bridge_hdmi_audio ||
709+
bridge_connector->bridge_dp_audio) {
710+
struct device *dev;
711+
712+
if (bridge_connector->bridge_hdmi_audio)
713+
dev = bridge_connector->bridge_hdmi_audio->hdmi_audio_dev;
714+
else
715+
dev = bridge_connector->bridge_dp_audio->hdmi_audio_dev;
646716

647-
ret = drm_connector_hdmi_audio_init(connector,
648-
bridge->hdmi_audio_dev,
717+
ret = drm_connector_hdmi_audio_init(connector, dev,
649718
&drm_bridge_connector_hdmi_audio_funcs,
650719
bridge->hdmi_audio_max_i2s_playback_channels,
651720
bridge->hdmi_audio_spdif_playback,

0 commit comments

Comments
 (0)