]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/bridge: add function interface for DisplayPort audio implementation
authorDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Fri, 14 Mar 2025 09:36:49 +0000 (11:36 +0200)
committerDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Mon, 7 Apr 2025 12:49:17 +0000 (15:49 +0300)
It is common for the DisplayPort bridges to implement audio support. In
preparation to providing a generic framework for DP audio, add
corresponding interface to struct drm_bridge. As suggested by Maxime
for now this is mostly c&p of the corresponding HDMI audio API.

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

index a6fa9bdf10a374459b6b45a4eeaf73c00f5d7110..4e418a29a9ff9d014d6ac0910a5d9bcf7118195e 100644 (file)
@@ -737,6 +737,65 @@ struct drm_bridge_funcs {
                                      struct drm_bridge *bridge,
                                      bool enable, int direction);
 
+       /**
+        * @dp_audio_startup:
+        *
+        * Called when ASoC starts a DisplayPort audio stream setup.
+        *
+        * This callback is optional, it can be implemented by bridges that
+        * set the @DRM_BRIDGE_OP_DP_AUDIO flag in their &drm_bridge->ops.
+        *
+        * Returns:
+        * 0 on success, a negative error code otherwise
+        */
+       int (*dp_audio_startup)(struct drm_connector *connector,
+                               struct drm_bridge *bridge);
+
+       /**
+        * @dp_audio_prepare:
+        * Configures DisplayPort audio stream. Can be called multiple
+        * times for each setup.
+        *
+        * This callback is optional but it must be implemented by bridges that
+        * set the @DRM_BRIDGE_OP_DP_AUDIO flag in their &drm_bridge->ops.
+        *
+        * Returns:
+        * 0 on success, a negative error code otherwise
+        */
+       int (*dp_audio_prepare)(struct drm_connector *connector,
+                               struct drm_bridge *bridge,
+                               struct hdmi_codec_daifmt *fmt,
+                               struct hdmi_codec_params *hparms);
+
+       /**
+        * @dp_audio_shutdown:
+        *
+        * Shut down the DisplayPort audio stream.
+        *
+        * This callback is optional but it must be implemented by bridges that
+        * set the @DRM_BRIDGE_OP_DP_AUDIO flag in their &drm_bridge->ops.
+        *
+        * Returns:
+        * 0 on success, a negative error code otherwise
+        */
+       void (*dp_audio_shutdown)(struct drm_connector *connector,
+                                 struct drm_bridge *bridge);
+
+       /**
+        * @dp_audio_mute_stream:
+        *
+        * Mute/unmute DisplayPort audio stream.
+        *
+        * This callback is optional, it can be implemented by bridges that
+        * set the @DRM_BRIDGE_OP_DP_AUDIO flag in their &drm_bridge->ops.
+        *
+        * Returns:
+        * 0 on success, a negative error code otherwise
+        */
+       int (*dp_audio_mute_stream)(struct drm_connector *connector,
+                                   struct drm_bridge *bridge,
+                                   bool enable, int direction);
+
        /**
         * @debugfs_init:
         *
@@ -830,9 +889,24 @@ enum drm_bridge_ops {
         *
         * Note: currently there can be at most one bridge in a chain that sets
         * this bit. This is to simplify corresponding glue code in connector
-        * drivers.
+        * drivers. Also it is not possible to have a bridge in the chain that
+        * sets @DRM_BRIDGE_OP_DP_AUDIO if there is a bridge that sets this
+        * flag.
         */
        DRM_BRIDGE_OP_HDMI_AUDIO = BIT(5),
+       /**
+        * @DRM_BRIDGE_OP_DP_AUDIO: The bridge provides DisplayPort audio operations.
+        * Bridges that set this flag must implement the
+        * &drm_bridge_funcs->dp_audio_prepare and
+        * &drm_bridge_funcs->dp_audio_shutdown callbacks.
+        *
+        * Note: currently there can be at most one bridge in a chain that sets
+        * this bit. This is to simplify corresponding glue code in connector
+        * drivers. Also it is not possible to have a bridge in the chain that
+        * sets @DRM_BRIDGE_OP_HDMI_AUDIO if there is a bridge that sets this
+        * flag.
+        */
+       DRM_BRIDGE_OP_DP_AUDIO = BIT(6),
 };
 
 /**
@@ -946,25 +1020,27 @@ struct drm_bridge {
 
        /**
         * @hdmi_audio_dev: device to be used as a parent for the HDMI Codec if
-        * @DRM_BRIDGE_OP_HDMI_AUDIO is set.
+        * either of @DRM_BRIDGE_OP_HDMI_AUDIO or @DRM_BRIDGE_OP_DP_AUDIO is set.
         */
        struct device *hdmi_audio_dev;
 
        /**
         * @hdmi_audio_max_i2s_playback_channels: maximum number of playback
-        * I2S channels for the bridge that sets @DRM_BRIDGE_OP_HDMI_AUDIO.
+        * I2S channels for the @DRM_BRIDGE_OP_HDMI_AUDIO or
+        * @DRM_BRIDGE_OP_DP_AUDIO.
         */
        int hdmi_audio_max_i2s_playback_channels;
 
        /**
         * @hdmi_audio_spdif_playback: set if this bridge has S/PDIF playback
-        * port for @DRM_BRIDGE_OP_HDMI_AUDIO
+        * port for @DRM_BRIDGE_OP_HDMI_AUDIO or @DRM_BRIDGE_OP_DP_AUDIO.
         */
        unsigned int hdmi_audio_spdif_playback : 1;
 
        /**
-        * @hdmi_audio_dai_port: sound DAI port for @DRM_BRIDGE_OP_HDMI_AUDIO,
-        * -1 if it is not used.
+        * @hdmi_audio_dai_port: sound DAI port for either of
+        * @DRM_BRIDGE_OP_HDMI_AUDIO and @DRM_BRIDGE_OP_DP_AUDIO, -1 if it is
+        * not used.
         */
        int hdmi_audio_dai_port;
 };