Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 63bdc7bd authored by Sanjana B's avatar Sanjana B Committed by Sanjana
Browse files

asoc: support for audio over hdmi tx



Add support for audio over hdmi tx.

Change-Id: I4f2108fd14eb22ec4e226220787e0defe512bb5f
Signed-off-by: default avatarSanjana B <sanjb@codeaurora.org>
parent e25bc7ed
Loading
Loading
Loading
Loading
+85 −14
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
 */
#include <linux/platform_device.h>
#include <linux/slab.h>
@@ -25,8 +25,8 @@
	static SOC_ENUM_SINGLE_DECL(ext_disp_audio_ack_state##index, \
			    SND_SOC_NOPM, index, ext_disp_audio_ack_text)

#define SWITCH_DP_CODEC(codec_info, codec_data, dai_id) \
	codec_info.type = EXT_DISPLAY_TYPE_DP; \
#define SWITCH_DP_CODEC(codec_info, codec_data, dai_id, type) \
	codec_info.type = type; \
	codec_info.ctrl_id = codec_data->ctl[dai_id]; \
	codec_info.stream_id = codec_data->stream[dai_id]; \

@@ -38,6 +38,7 @@ enum {
enum {
	DP_STREAM0 = 0,
	DP_STREAM1,
	HDMI,
	DP_STREAM_MAX,
};

@@ -49,6 +50,7 @@ enum {
	DP_DAI1 = 1,
	DP_DAI2,
	HDMI_DAI,
	HDMI_MS_DAI,
	DP_DAI_MAX,
};

@@ -60,6 +62,8 @@ SOC_EXT_DISP_AUDIO_TYPE(1);
SOC_EXT_DISP_AUDIO_ACK_STATE(1);
SOC_EXT_DISP_AUDIO_TYPE(2);
SOC_EXT_DISP_AUDIO_ACK_STATE(2);
SOC_EXT_DISP_AUDIO_TYPE(3);
SOC_EXT_DISP_AUDIO_ACK_STATE(3);

struct msm_ext_disp_audio_codec_rx_data {
	struct platform_device *ext_disp_core_pdev;
@@ -80,6 +84,7 @@ static int msm_ext_disp_edid_ctl_info(struct snd_kcontrol *kcontrol,
	int rc = 0;
	struct msm_ext_disp_codec_id codec_info;
	int dai_id = kcontrol->private_value;
	int type;

	codec_data = snd_soc_component_get_drvdata(component);
	if (!codec_data) {
@@ -91,7 +96,11 @@ static int msm_ext_disp_edid_ctl_info(struct snd_kcontrol *kcontrol,
		codec_data->ctl[dai_id], codec_data->stream[dai_id]);

	mutex_lock(&codec_data->dp_ops_lock);
	SWITCH_DP_CODEC(codec_info, codec_data, dai_id);
	if (dai_id == HDMI_MS_DAI)
		type = EXT_DISPLAY_TYPE_HDMI;
	else
		type = EXT_DISPLAY_TYPE_DP;
	SWITCH_DP_CODEC(codec_info, codec_data, dai_id, type);
	rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
						 &codec_info);
	if (!codec_data->ext_disp_ops.get_audio_edid_blk || rc) {
@@ -126,6 +135,7 @@ static int msm_ext_disp_edid_get(struct snd_kcontrol *kcontrol,
	struct msm_ext_disp_codec_id codec_info;
	int rc = 0;
	int dai_id = kcontrol->private_value;
	int type;

	codec_data = snd_soc_component_get_drvdata(component);
	if (!codec_data) {
@@ -138,7 +148,11 @@ static int msm_ext_disp_edid_get(struct snd_kcontrol *kcontrol,
		codec_data->ctl[dai_id], codec_data->stream[dai_id]);

	mutex_lock(&codec_data->dp_ops_lock);
	SWITCH_DP_CODEC(codec_info, codec_data, dai_id);
	if (dai_id == HDMI_MS_DAI)
		type = EXT_DISPLAY_TYPE_HDMI;
	else
		type = EXT_DISPLAY_TYPE_DP;
	SWITCH_DP_CODEC(codec_info, codec_data, dai_id, type);
	rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
						 &codec_info);
	if (!codec_data->ext_disp_ops.get_audio_edid_blk || rc) {
@@ -147,7 +161,6 @@ static int msm_ext_disp_edid_get(struct snd_kcontrol *kcontrol,
		mutex_unlock(&codec_data->dp_ops_lock);
		return -EINVAL;
	}

	rc = codec_data->ext_disp_ops.get_audio_edid_blk(
			codec_data->ext_disp_core_pdev, &edid_blk);
	mutex_unlock(&codec_data->dp_ops_lock);
@@ -188,6 +201,7 @@ static int msm_ext_disp_audio_type_get(struct snd_kcontrol *kcontrol,
	struct msm_ext_disp_codec_id codec_info;
	int rc = 0;
	int dai_id = ((struct soc_enum *) kcontrol->private_value)->shift_l;
	int type;

	codec_data = snd_soc_component_get_drvdata(component);
	if (!codec_data) {
@@ -200,7 +214,11 @@ static int msm_ext_disp_audio_type_get(struct snd_kcontrol *kcontrol,
		codec_data->ctl[dai_id], codec_data->stream[dai_id]);

	mutex_lock(&codec_data->dp_ops_lock);
	SWITCH_DP_CODEC(codec_info, codec_data, dai_id);
	if (dai_id == HDMI_MS_DAI)
		type = EXT_DISPLAY_TYPE_HDMI;
	else
		type = EXT_DISPLAY_TYPE_DP;
	SWITCH_DP_CODEC(codec_info, codec_data, dai_id, type);
	rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
						 &codec_info);

@@ -274,6 +292,7 @@ static int msm_ext_disp_audio_ack_set(struct snd_kcontrol *kcontrol,
	struct msm_ext_disp_codec_id codec_info;
	int rc = 0;
	int dai_id = ((struct soc_enum *) kcontrol->private_value)->shift_l;
	int type;

	codec_data = snd_soc_component_get_drvdata(component);
	if (!codec_data) {
@@ -287,7 +306,11 @@ static int msm_ext_disp_audio_ack_set(struct snd_kcontrol *kcontrol,
		codec_data->ctl[dai_id], codec_data->stream[dai_id]);

	mutex_lock(&codec_data->dp_ops_lock);
	SWITCH_DP_CODEC(codec_info, codec_data, dai_id);
	if (dai_id == HDMI_MS_DAI)
		type = EXT_DISPLAY_TYPE_HDMI;
	else
		type = EXT_DISPLAY_TYPE_DP;
	SWITCH_DP_CODEC(codec_info, codec_data, dai_id, type);
	rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
						 &codec_info);

@@ -421,6 +444,15 @@ static const struct snd_kcontrol_new msm_ext_disp_codec_rx_controls[] = {
		.get    = msm_ext_disp_edid_get,
		.private_value = HDMI_DAI,
	},
	{
		.access = SNDRV_CTL_ELEM_ACCESS_READ |
			  SNDRV_CTL_ELEM_ACCESS_VOLATILE,
		.iface  = SNDRV_CTL_ELEM_IFACE_PCM,
		.name   = "HDMI MS EDID",
		.info   = msm_ext_disp_edid_ctl_info,
		.get    = msm_ext_disp_edid_get,
		.private_value = HDMI_MS_DAI,
	},
	{
		.access = SNDRV_CTL_ELEM_ACCESS_READ |
			  SNDRV_CTL_ELEM_ACCESS_VOLATILE,
@@ -445,12 +477,18 @@ static const struct snd_kcontrol_new msm_ext_disp_codec_rx_controls[] = {
	SOC_ENUM_EXT("External Display1 Type",
		     ext_disp_audio_type2,
		     msm_ext_disp_audio_type_get, NULL),
	SOC_ENUM_EXT("External HDMI Type",
		     ext_disp_audio_type3,
		     msm_ext_disp_audio_type_get, NULL),
	SOC_ENUM_EXT("External Display Audio Ack",
		     ext_disp_audio_ack_state1,
		     NULL, msm_ext_disp_audio_ack_set),
	SOC_ENUM_EXT("External Display1 Audio Ack",
		     ext_disp_audio_ack_state2,
		     NULL, msm_ext_disp_audio_ack_set),
	SOC_ENUM_EXT("External HDMI Audio Ack",
		     ext_disp_audio_ack_state3,
		     NULL, msm_ext_disp_audio_ack_set),

	SOC_SINGLE_MULTI_EXT("External Display Audio Device",
			SND_SOC_NOPM, DP_DAI1, DP_STREAM_MAX - 1, 0, 2,
@@ -460,6 +498,11 @@ static const struct snd_kcontrol_new msm_ext_disp_codec_rx_controls[] = {
			SND_SOC_NOPM, DP_DAI2, DP_STREAM_MAX - 1, 0, 2,
			msm_ext_disp_audio_device_get,
			msm_ext_disp_audio_device_set),
	SOC_SINGLE_MULTI_EXT("External HDMI Device",
			SND_SOC_NOPM, HDMI_MS_DAI, DP_STREAM_MAX - 1, 0, 2,
			msm_ext_disp_audio_device_get,
			msm_ext_disp_audio_device_set),

};

static int msm_ext_disp_audio_codec_rx_dai_startup(
@@ -470,6 +513,7 @@ static int msm_ext_disp_audio_codec_rx_dai_startup(
	struct msm_ext_disp_codec_id codec_info;
	struct msm_ext_disp_audio_codec_rx_data *codec_data =
			dev_get_drvdata(dai->component->dev);
	int type;

	if (!codec_data) {
		dev_err(dai->dev, "%s() codec_data is null\n",
@@ -482,7 +526,11 @@ static int msm_ext_disp_audio_codec_rx_dai_startup(
		codec_data->ctl[dai->id], codec_data->stream[dai->id]);

	mutex_lock(&codec_data->dp_ops_lock);
	SWITCH_DP_CODEC(codec_info, codec_data, dai->id);
	if (dai->id == HDMI_MS_DAI)
		type = EXT_DISPLAY_TYPE_HDMI;
	else
		type = EXT_DISPLAY_TYPE_DP;
	SWITCH_DP_CODEC(codec_info, codec_data, dai->id, type);
	rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
						 &codec_info);

@@ -524,7 +572,7 @@ static int msm_ext_disp_audio_codec_rx_dai_hw_params(
	struct msm_ext_disp_codec_id codec_info;
	int rc = 0;
	struct msm_ext_disp_audio_setup_params audio_setup_params = {0};

	int type;
	struct msm_ext_disp_audio_codec_rx_data *codec_data =
			dev_get_drvdata(dai->component->dev);

@@ -539,7 +587,11 @@ static int msm_ext_disp_audio_codec_rx_dai_hw_params(
		codec_data->ctl[dai->id], codec_data->stream[dai->id]);

	mutex_lock(&codec_data->dp_ops_lock);
	SWITCH_DP_CODEC(codec_info, codec_data, dai->id);
	if (dai->id == HDMI_MS_DAI)
		type = EXT_DISPLAY_TYPE_HDMI;
	else
		type = EXT_DISPLAY_TYPE_DP;
	SWITCH_DP_CODEC(codec_info, codec_data, dai->id, type);
	rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
						 &codec_info);

@@ -609,7 +661,7 @@ static int msm_ext_disp_audio_codec_rx_dai_hw_params(
	audio_setup_params.down_mix = down_mix;

	mutex_lock(&codec_data->dp_ops_lock);
	SWITCH_DP_CODEC(codec_info, codec_data, dai->id);
	SWITCH_DP_CODEC(codec_info, codec_data, dai->id, type);
	rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
						 &codec_info);
	if (rc)
@@ -636,6 +688,7 @@ static void msm_ext_disp_audio_codec_rx_dai_shutdown(

	struct msm_ext_disp_audio_codec_rx_data *codec_data =
			dev_get_drvdata(dai->component->dev);
	int type;

	if (!codec_data) {
		dev_err(dai->dev, "%s() codec_data is null\n",
@@ -648,7 +701,11 @@ static void msm_ext_disp_audio_codec_rx_dai_shutdown(
		codec_data->ctl[dai->id], codec_data->stream[dai->id]);

	mutex_lock(&codec_data->dp_ops_lock);
	SWITCH_DP_CODEC(codec_info, codec_data, dai->id);
	if (dai->id == HDMI_MS_DAI)
		type = EXT_DISPLAY_TYPE_HDMI;
	else
		type = EXT_DISPLAY_TYPE_DP;
	SWITCH_DP_CODEC(codec_info, codec_data, dai->id, type);
	rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
						 &codec_info);

@@ -754,6 +811,20 @@ static struct snd_soc_dai_driver msm_ext_disp_audio_codec_rx_dais[] = {
		},
		.ops = &msm_ext_disp_audio_codec_rx_dai_ops,
	},
	{
		.name = "msm_hdmi_ms_audio_codec_rx_dai",
		.id = HDMI_MS_DAI,
		.playback = {
			.stream_name = "HDMI MS Playback",
			.channels_min = 1,
			.channels_max = 8,
			.rate_min = 48000,
			.rate_max = 48000,
			.rates = MSM_EXT_DISP_PCM_RATES,
			.formats = SNDRV_PCM_FMTBIT_S16_LE,
		},
		.ops = &msm_ext_disp_audio_codec_rx_dai_ops,
	},
	{
		.name = "msm_dp_audio_codec_rx_dai",
		.id = DP_DAI1,
+31 −3
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
 */

#include <linux/init.h>
@@ -54,7 +54,7 @@ struct msm_dai_q6_hdmi_dai_data {
static int get_port_id(int dai_id)
{
	/* Currently, display devices share a common AFE port */
	if (dai_id != HDMI_RX)
	if (dai_id != HDMI_RX || dai_id != HDMI_RX_MS)
		return DISPLAY_PORT_RX;

	return dai_id;
@@ -436,7 +436,7 @@ static int msm_dai_q6_hdmi_dai_probe(struct snd_soc_dai *dai)

	msm_dai_q6_hdmi_set_dai_id(dai);

	if (dai->driver->id == HDMI_RX) {
	if (dai->driver->id == HDMI_RX || dai->driver->id == HDMI_RX_MS) {
		kcontrol = &hdmi_config_controls[0];
		rc = snd_ctl_add(dai->component->card->snd_card,
				 snd_ctl_new1(kcontrol, dai_data));
@@ -563,6 +563,28 @@ static struct snd_soc_dai_driver msm_dai_q6_hdmi_hdmi_rx_dai = {
	.remove = msm_dai_q6_hdmi_dai_remove,
};

static struct snd_soc_dai_driver msm_dai_q6_hdmi_hdmi_ms_rx_dai = {
	.playback = {
		.stream_name = "HDMI MS Playback",
		.aif_name = "HDMI_MS",
		.rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
			 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |
			 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |
			 SNDRV_PCM_RATE_192000,
		.formats = SNDRV_PCM_FMTBIT_S16_LE |
			   SNDRV_PCM_FMTBIT_S24_LE |
			   SNDRV_PCM_FMTBIT_S24_3LE,
		.channels_min = 2,
		.channels_max = 8,
		.rate_max = 192000,
		.rate_min = 48000,
	},
	.ops = &msm_dai_q6_hdmi_ops,
	.id = HDMI_RX_MS,
	.probe = msm_dai_q6_hdmi_dai_probe,
	.remove = msm_dai_q6_hdmi_dai_remove,
};

static struct snd_soc_dai_driver msm_dai_q6_display_port_rx_dai[] = {
	{
		.playback = {
@@ -646,6 +668,12 @@ static int msm_dai_q6_hdmi_dev_probe(struct platform_device *pdev)
			&msm_dai_hdmi_q6_component,
			&msm_dai_q6_display_port_rx_dai[1], 1);
		break;
	case HDMI_RX_MS:
		rc = snd_soc_register_component(&pdev->dev,
			&msm_dai_hdmi_q6_component,
			&msm_dai_q6_hdmi_hdmi_ms_rx_dai, 1);
		break;

	default:
		dev_err(&pdev->dev, "invalid device ID %d\n", pdev->id);
		rc = -ENODEV;
+138 −3
Original line number Diff line number Diff line
@@ -147,6 +147,7 @@ struct msm_pcm_route_bdai_pp_params {
static struct msm_pcm_route_bdai_pp_params
	msm_bedais_pp_params[MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX] = {
	{HDMI_RX, 0, 0, 0},
	{HDMI_RX_MS, 0, 0, 0},
	{DISPLAY_PORT_RX, 0, 0, 0},
};
@@ -699,6 +700,7 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
	  LPASS_BE_SEC_META_MI2S_RX},
	{ RT_PROXY_PORT_002_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PROXY_RX},
	{ RT_PROXY_PORT_002_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PROXY_TX},
	{ HDMI_RX_MS, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_HDMI_MS},
};
/* Track ASM playback & capture sessions of DAI
@@ -3534,7 +3536,7 @@ static const char *const be_name[] = {
"RX_CDC_DMA_RX_6", "RX_CDC_DMA_RX_7",
"PRI_SPDIF_TX", "SEC_SPDIF_RX", "SEC_SPDIF_TX",
"SLIM_9_RX", "SLIM_9_TX", "AFE_LOOPBACK_TX", "PRI_META_MI2S_RX",
"SEC_META_MI2S_RX", "PROXY_RX", "PROXY_TX"
"SEC_META_MI2S_RX", "PROXY_RX", "PROXY_TX", "HDMI_RX_MS"
};
static SOC_ENUM_SINGLE_DECL(mm1_channel_mux,
@@ -7549,6 +7551,101 @@ static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
	msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new hdmi_ms_mixer_controls[] = {
	SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
	SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new display_port_mixer_controls[] = {
	SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
	MSM_BACKEND_DAI_DISPLAY_PORT_RX,
@@ -18384,6 +18481,13 @@ static const struct snd_kcontrol_new hdmi_rx_port_mixer_controls[] = {
	msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new hdmi_rx_ms_port_mixer_controls[] = {
	SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
	msm_routing_put_port_mixer),
};
static const struct snd_kcontrol_new display_port_rx_port_mixer_controls[] = {
	SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM,
	MSM_BACKEND_DAI_DISPLAY_PORT_RX,
@@ -24149,6 +24253,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
	SND_SOC_DAPM_AIF_OUT("SLIMBUS_2_RX", "Slimbus2 Playback", 0, 0, 0, 0),
	SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_RX", "Slimbus5 Playback", 0, 0, 0, 0),
	SND_SOC_DAPM_AIF_OUT("HDMI", "HDMI Playback", 0, 0, 0, 0),
	SND_SOC_DAPM_AIF_OUT("HDMI_MS", "HDMI MS Playback", 0, 0, 0, 0),
	SND_SOC_DAPM_AIF_OUT("DISPLAY_PORT", "Display Port Playback",
			     0, 0, 0, 0),
	SND_SOC_DAPM_AIF_OUT("DISPLAY_PORT1", "Display Port1 Playback",
@@ -24597,6 +24702,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
	slimbus_9_rx_mixer_controls, ARRAY_SIZE(slimbus_9_rx_mixer_controls)),
	SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
	hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)),
	SND_SOC_DAPM_MIXER("HDMI_MS Mixer", SND_SOC_NOPM, 0, 0,
	hdmi_ms_mixer_controls, ARRAY_SIZE(hdmi_ms_mixer_controls)),
	SND_SOC_DAPM_MIXER("DISPLAY_PORT Mixer", SND_SOC_NOPM, 0, 0,
	display_port_mixer_controls, ARRAY_SIZE(display_port_mixer_controls)),
	SND_SOC_DAPM_MIXER("DISPLAY_PORT1 Mixer", SND_SOC_NOPM, 0, 0,
@@ -25049,6 +25156,9 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
	SND_SOC_DAPM_MIXER("HDMI_RX Port Mixer",
	SND_SOC_NOPM, 0, 0, hdmi_rx_port_mixer_controls,
	ARRAY_SIZE(hdmi_rx_port_mixer_controls)),
	SND_SOC_DAPM_MIXER("HDMI_RX_MS Port Mixer",
	SND_SOC_NOPM, 0, 0, hdmi_rx_ms_port_mixer_controls,
	ARRAY_SIZE(hdmi_rx_ms_port_mixer_controls)),
	SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Port Mixer",
	SND_SOC_NOPM, 0, 0, display_port_rx_port_mixer_controls,
	ARRAY_SIZE(display_port_rx_port_mixer_controls)),
@@ -25570,6 +25680,25 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"HDMI Mixer", "MultiMedia26", "MM_DL26"},
	{"HDMI", NULL, "HDMI Mixer"},
	{"HDMI_MS Mixer", "MultiMedia1", "MM_DL1"},
	{"HDMI_MS Mixer", "MultiMedia2", "MM_DL2"},
	{"HDMI_MS Mixer", "MultiMedia3", "MM_DL3"},
	{"HDMI_MS Mixer", "MultiMedia4", "MM_DL4"},
	{"HDMI_MS Mixer", "MultiMedia5", "MM_DL5"},
	{"HDMI_MS Mixer", "MultiMedia6", "MM_DL6"},
	{"HDMI_MS Mixer", "MultiMedia7", "MM_DL7"},
	{"HDMI_MS Mixer", "MultiMedia8", "MM_DL8"},
	{"HDMI_MS Mixer", "MultiMedia9", "MM_DL9"},
	{"HDMI_MS Mixer", "MultiMedia10", "MM_DL10"},
	{"HDMI_MS Mixer", "MultiMedia11", "MM_DL11"},
	{"HDMI_MS Mixer", "MultiMedia12", "MM_DL12"},
	{"HDMI_MS Mixer", "MultiMedia13", "MM_DL13"},
	{"HDMI_MS Mixer", "MultiMedia14", "MM_DL14"},
	{"HDMI_MS Mixer", "MultiMedia15", "MM_DL15"},
	{"HDMI_MS Mixer", "MultiMedia16", "MM_DL16"},
	{"HDMI_MS Mixer", "MultiMedia26", "MM_DL26"},
	{"HDMI_MS", NULL, "HDMI_MS Mixer"},
	{"DISPLAY_PORT Mixer", "MultiMedia1", "MM_DL1"},
	{"DISPLAY_PORT Mixer", "MultiMedia2", "MM_DL2"},
	{"DISPLAY_PORT Mixer", "MultiMedia3", "MM_DL3"},
@@ -29252,6 +29381,9 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"HDMI_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
	{"HDMI", NULL, "HDMI_RX Port Mixer"},
	{"HDMI_RX_MS Port Mixer", "MI2S_TX", "MI2S_TX"},
	{"HDMI_MS", NULL, "HDMI_RX_MS Port Mixer"},
	{"DISPLAY_PORT_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
	{"DISPLAY_PORT", NULL, "DISPLAY_PORT_RX Port Mixer"},
@@ -29347,6 +29479,7 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"BE_OUT", NULL, "SLIMBUS_9_RX"},
	{"BE_OUT", NULL, "USB_AUDIO_RX"},
	{"BE_OUT", NULL, "HDMI"},
	{"BE_OUT", NULL, "HDMI_MS"},
	{"BE_OUT", NULL, "DISPLAY_PORT"},
	{"BE_OUT", NULL, "DISPLAY_PORT1"},
	{"BE_OUT", NULL, "PRI_SPDIF_RX"},
@@ -29835,7 +29968,8 @@ static int msm_routing_send_device_pp_params(int port_id, int copp_idx,
	pr_debug("%s: port_id %d, copp_idx %d\n", __func__, port_id, copp_idx);
	if (port_id != HDMI_RX && port_id != DISPLAY_PORT_RX) {
	if (port_id != HDMI_RX && port_id != DISPLAY_PORT_RX
			&& port_id != HDMI_RX_MS) {
		pr_err("%s: Device pp params on invalid port %d, copp_idx %d, fe_id %d\n",
			__func__, port_id, copp_idx, fe_id);
		return  -EINVAL;
@@ -29972,7 +30106,8 @@ static int msm_routing_put_device_pp_params_mixer(struct snd_kcontrol *kcontrol,
	for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) {
		port_id = msm_bedais[be_idx].port_id;
		if (port_id == HDMI_RX || port_id == DISPLAY_PORT_RX)
		if (port_id == HDMI_RX || port_id == DISPLAY_PORT_RX
				|| port_id == HDMI_RX_MS)
			break;
	}
+3 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#define LPASS_BE_SLIMBUS_0_RX "SLIMBUS_0_RX"
#define LPASS_BE_SLIMBUS_0_TX "SLIMBUS_0_TX"
#define LPASS_BE_HDMI "HDMI"
#define LPASS_BE_HDMI_MS "HDMI_MS"
#define LPASS_BE_DISPLAY_PORT "DISPLAY_PORT"
#define LPASS_BE_DISPLAY_PORT1 "DISPLAY_PORT1"
#define LPASS_BE_INT_BT_SCO_RX "INT_BT_SCO_RX"
@@ -506,6 +507,7 @@ enum {
	MSM_BACKEND_DAI_SEC_META_MI2S_RX,
	MSM_BACKEND_DAI_PROXY_RX,
	MSM_BACKEND_DAI_PROXY_TX,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_BACKEND_DAI_MAX,
};

@@ -537,7 +539,7 @@ enum {
#define RELEASE_LOCK	0
#define ACQUIRE_LOCK	1

#define MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX	2
#define MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX	3
#define HDMI_RX_ID				0x8001
#define ADM_PP_PARAM_MUTE_ID			0
#define ADM_PP_PARAM_MUTE_BIT			1
+5 −0
Original line number Diff line number Diff line
@@ -947,6 +947,7 @@ int afe_sizeof_cfg_cmd(u16 port_id)
		ret_size = SIZEOF_CFG_CMD(afe_param_id_meta_i2s_cfg);
		break;
	case HDMI_RX:
	case HDMI_RX_MS:
	case DISPLAY_PORT_RX:
		ret_size =
		SIZEOF_CFG_CMD(afe_param_id_hdmi_multi_chan_audio_cfg);
@@ -4745,6 +4746,7 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
		cfg_type = AFE_PARAM_ID_META_I2S_CONFIG;
		break;
	case HDMI_RX:
	case HDMI_RX_MS:
	case DISPLAY_PORT_RX:
		cfg_type = AFE_PARAM_ID_HDMI_CONFIG;
		break;
@@ -4994,6 +4996,7 @@ int afe_get_port_index(u16 port_id)
	case MI2S_RX: return IDX_MI2S_RX;
	case MI2S_TX: return IDX_MI2S_TX;
	case HDMI_RX: return IDX_HDMI_RX;
	case HDMI_RX_MS: return IDX_HDMI_RX_MS;
	case DISPLAY_PORT_RX: return IDX_DISPLAY_PORT_RX;
	case AFE_PORT_ID_PRIMARY_SPDIF_RX: return IDX_PRIMARY_SPDIF_RX;
	case AFE_PORT_ID_PRIMARY_SPDIF_TX: return IDX_PRIMARY_SPDIF_TX;
@@ -5457,6 +5460,7 @@ int afe_open(u16 port_id,
		cfg_type = AFE_PARAM_ID_META_I2S_CONFIG;
		break;
	case HDMI_RX:
	case HDMI_RX_MS:
	case DISPLAY_PORT_RX:
		cfg_type = AFE_PARAM_ID_HDMI_CONFIG;
		break;
@@ -7347,6 +7351,7 @@ int afe_validate_port(u16 port_id)
	case MI2S_RX:
	case MI2S_TX:
	case HDMI_RX:
	case HDMI_RX_MS:
	case DISPLAY_PORT_RX:
	case AFE_PORT_ID_PRIMARY_SPDIF_RX:
	case AFE_PORT_ID_PRIMARY_SPDIF_TX:
Loading