]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/bridge: allow limiting I2S formats
authorDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Sat, 17 May 2025 01:59:38 +0000 (04:59 +0300)
committerDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tue, 20 May 2025 22:33:58 +0000 (01:33 +0300)
By default HDMI codec registers all formats supported on the I2S bus.
Allow bridges (and connectors) to limit the list of the PCM formats
supported by the HDMI codec.

Reviewed-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://lore.kernel.org/r/20250517-drm-hdmi-connector-cec-v6-2-35651db6f19b@oss.qualcomm.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
drivers/gpu/drm/display/drm_bridge_connector.c
drivers/gpu/drm/display/drm_hdmi_audio_helper.c
drivers/gpu/drm/vc4/vc4_hdmi.c
include/drm/display/drm_hdmi_audio_helper.h
include/drm/drm_bridge.h

index 7d2e499ea5dec2f710c1c67323bf9e6b177d3c9e..381a0f9d4259bf9f72d3a292b7dcc82e45c61bae 100644 (file)
@@ -717,6 +717,7 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
                ret = drm_connector_hdmi_audio_init(connector, dev,
                                                    &drm_bridge_connector_hdmi_audio_funcs,
                                                    bridge->hdmi_audio_max_i2s_playback_channels,
+                                                   bridge->hdmi_audio_i2s_formats,
                                                    bridge->hdmi_audio_spdif_playback,
                                                    bridge->hdmi_audio_dai_port);
                if (ret)
index 05afc9f0bdd6b6f00d74223a9d8875e6d16aea5f..21c93bdd8648cf70e691dbf0c92fae5823fd1828 100644 (file)
@@ -142,6 +142,7 @@ static const struct hdmi_codec_ops drm_connector_hdmi_audio_ops = {
  * @hdmi_codec_dev: device to be used as a parent for the HDMI Codec
  * @funcs: callbacks for this HDMI Codec
  * @max_i2s_playback_channels: maximum number of playback I2S channels
+ * @i2s_formats: set of I2S formats (use 0 for a bus-specific set)
  * @spdif_playback: set if HDMI codec has S/PDIF playback port
  * @dai_port: sound DAI port, -1 if it is not enabled
  *
@@ -154,6 +155,7 @@ int drm_connector_hdmi_audio_init(struct drm_connector *connector,
                                  struct device *hdmi_codec_dev,
                                  const struct drm_connector_hdmi_audio_funcs *funcs,
                                  unsigned int max_i2s_playback_channels,
+                                 u64 i2s_formats,
                                  bool spdif_playback,
                                  int dai_port)
 {
@@ -161,6 +163,7 @@ int drm_connector_hdmi_audio_init(struct drm_connector *connector,
                .ops = &drm_connector_hdmi_audio_ops,
                .max_i2s_channels = max_i2s_playback_channels,
                .i2s = !!max_i2s_playback_channels,
+               .i2s_formats = i2s_formats,
                .spdif = spdif_playback,
                .no_i2s_capture = true,
                .no_spdif_capture = true,
index a29a6ef266f9a5952af53030a9a2d313e2ecdfce..4797ed1c21f47992fe4d497d904ee31c824cd449 100644 (file)
@@ -562,7 +562,7 @@ static int vc4_hdmi_connector_init(struct drm_device *dev,
 
        ret = drm_connector_hdmi_audio_init(connector, dev->dev,
                                            &vc4_hdmi_audio_funcs,
-                                           8, false, -1);
+                                           8, 0, false, -1);
        if (ret)
                return ret;
 
index c9a6faef4109f20ba79b610a9d5e8d5980efe2d1..44d910bdc72dd2fdbbe7ada65b67080d4a41e88b 100644 (file)
@@ -14,6 +14,7 @@ int drm_connector_hdmi_audio_init(struct drm_connector *connector,
                                  struct device *hdmi_codec_dev,
                                  const struct drm_connector_hdmi_audio_funcs *funcs,
                                  unsigned int max_i2s_playback_channels,
+                                 u64 i2s_formats,
                                  bool spdif_playback,
                                  int sound_dai_port);
 void drm_connector_hdmi_audio_plugged_notify(struct drm_connector *connector,
index 286f6fb3fe2b80f237db85dc8459430dc82337e2..db0d374d863b0b1f774d395743f1e29bb84e8937 100644 (file)
@@ -1016,6 +1016,14 @@ struct drm_bridge {
         */
        int hdmi_audio_max_i2s_playback_channels;
 
+       /**
+        * @hdmi_audio_i2s_formats: supported I2S formats, optional. The
+        * default is to allow all formats supported by the corresponding I2S
+        * bus driver. This is only used for bridges setting
+        * @DRM_BRIDGE_OP_HDMI_AUDIO or @DRM_BRIDGE_OP_DP_AUDIO.
+        */
+       u64 hdmi_audio_i2s_formats;
+
        /**
         * @hdmi_audio_spdif_playback: set if this bridge has S/PDIF playback
         * port for @DRM_BRIDGE_OP_HDMI_AUDIO or @DRM_BRIDGE_OP_DP_AUDIO.