@@ -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
453472static 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
468495static 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
481512static 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
499542static 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