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 <mrip...@kernel.org>
Signed-off-by: Dmitry Baryshkov <dmitry.barysh...@linaro.org>
Signed-off-by: Dmitry Baryshkov <dmitry.barysh...@oss.qualcomm.com>
---
 drivers/gpu/drm/display/drm_bridge_connector.c  | 1 +
 drivers/gpu/drm/display/drm_hdmi_audio_helper.c | 3 +++
 drivers/gpu/drm/vc4/vc4_hdmi.c                  | 2 +-
 include/drm/display/drm_hdmi_audio_helper.h     | 1 +
 include/drm/drm_bridge.h                        | 8 ++++++++
 5 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c 
b/drivers/gpu/drm/display/drm_bridge_connector.c
index 
7d2e499ea5dec2f710c1c67323bf9e6b177d3c9e..381a0f9d4259bf9f72d3a292b7dcc82e45c61bae
 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -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)
diff --git a/drivers/gpu/drm/display/drm_hdmi_audio_helper.c 
b/drivers/gpu/drm/display/drm_hdmi_audio_helper.c
index 
05afc9f0bdd6b6f00d74223a9d8875e6d16aea5f..21c93bdd8648cf70e691dbf0c92fae5823fd1828
 100644
--- a/drivers/gpu/drm/display/drm_hdmi_audio_helper.c
+++ b/drivers/gpu/drm/display/drm_hdmi_audio_helper.c
@@ -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,
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index 
a29a6ef266f9a5952af53030a9a2d313e2ecdfce..4797ed1c21f47992fe4d497d904ee31c824cd449
 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -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;
 
diff --git a/include/drm/display/drm_hdmi_audio_helper.h 
b/include/drm/display/drm_hdmi_audio_helper.h
index 
c9a6faef4109f20ba79b610a9d5e8d5980efe2d1..44d910bdc72dd2fdbbe7ada65b67080d4a41e88b
 100644
--- a/include/drm/display/drm_hdmi_audio_helper.h
+++ b/include/drm/display/drm_hdmi_audio_helper.h
@@ -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,
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index 
286f6fb3fe2b80f237db85dc8459430dc82337e2..db0d374d863b0b1f774d395743f1e29bb84e8937
 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -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.

-- 
2.39.5

Reply via email to