Commit d9f9bae6 authored by Dmitry Baryshkov's avatar Dmitry Baryshkov
Browse files

drm/bridge: allow limiting I2S formats



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: default avatarMaxime Ripard <mripard@kernel.org>
Signed-off-by: default avatarDmitry 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: default avatarDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
parent fa3769e0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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)
+3 −0
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -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;

+1 −0
Original line number Diff line number Diff line
@@ -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,
+8 −0
Original line number Diff line number Diff line
@@ -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.