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

Commit 39932230 authored by Jaideep Sharma's avatar Jaideep Sharma
Browse files

asoc: add code change for proxy playback and capture BE DAIs.



proxy AFE port based BE DAIs can be used for various use cases, including
but not limited to voice call. Add support for BE DAI link based on pseudo
ports.

Change-Id: I00384de1104399853743e709f53f969842ef69a1
Signed-off-by: default avatarJaideep Sharma <jaidshar@codeaurora.org>
parent c4833618
Loading
Loading
Loading
Loading
+47 −2
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>
@@ -2621,6 +2621,8 @@ static int msm_dai_q6_hw_params(struct snd_pcm_substream *substream,
	case RT_PROXY_DAI_001_RX:
	case RT_PROXY_DAI_002_TX:
	case RT_PROXY_DAI_002_RX:
	case RT_PROXY_PORT_002_TX:
	case RT_PROXY_PORT_002_RX:
		rc = msm_dai_q6_afe_rtproxy_hw_params(params, dai);
		break;
	case VOICE_PLAYBACK_TX:
@@ -4247,6 +4249,42 @@ static struct snd_soc_dai_driver msm_dai_q6_incall_record_dai[] = {
	},
};

static struct snd_soc_dai_driver msm_dai_q6_proxy_tx_dai = {
	.capture = {
		.stream_name = "Proxy Capture",
		.aif_name = "PROXY_TX",
		.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
			 SNDRV_PCM_RATE_16000,
		.formats = SNDRV_PCM_FMTBIT_S16_LE,
		.channels_min = 1,
		.channels_max = 2,
		.rate_min =     8000,
		.rate_max =     48000,
	},
	.ops = &msm_dai_q6_ops,
	.id = RT_PROXY_PORT_002_TX,
	.probe = msm_dai_q6_dai_probe,
	.remove = msm_dai_q6_dai_remove,
};

static struct snd_soc_dai_driver msm_dai_q6_proxy_rx_dai = {
	.playback = {
		.stream_name = "Proxy Playback",
		.aif_name = "PROXY_RX",
		.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
			 SNDRV_PCM_RATE_16000,
		.formats = SNDRV_PCM_FMTBIT_S16_LE,
		.channels_min = 1,
		.channels_max = 2,
		.rate_min =     8000,
		.rate_max =     48000,
	},
	.ops = &msm_dai_q6_ops,
	.id = RT_PROXY_PORT_002_RX,
	.probe = msm_dai_q6_dai_probe,
	.remove = msm_dai_q6_dai_remove,
};

static struct snd_soc_dai_driver msm_dai_q6_usb_rx_dai = {
	.playback = {
		.stream_name = "USB Audio Playback",
@@ -7287,7 +7325,14 @@ static int msm_dai_q6_dev_probe(struct platform_device *pdev)
			pr_err("%s: Device not found stream name %s\n",
			__func__, stream_name);
		break;

	case RT_PROXY_PORT_002_RX:
		rc = snd_soc_register_component(&pdev->dev,
			&msm_dai_q6_component, &msm_dai_q6_proxy_rx_dai, 1);
		break;
	case RT_PROXY_PORT_002_TX:
		rc = snd_soc_register_component(&pdev->dev,
			&msm_dai_q6_component, &msm_dai_q6_proxy_tx_dai, 1);
		break;
	default:
		rc = -ENODEV;
		break;
+36 −1
Original line number Diff line number Diff line
@@ -697,6 +697,8 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
	  LPASS_BE_PRI_META_MI2S_RX},
	{ AFE_PORT_ID_SECONDARY_META_MI2S_RX, 0, {0}, {0}, 0, 0, 0, 0,
	  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},
};
/* Track ASM playback & capture sessions of DAI
@@ -3526,7 +3528,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"
"SEC_META_MI2S_RX", "PROXY_RX", "PROXY_TX"
};
static SOC_ENUM_SINGLE_DECL(mm1_channel_mux,
@@ -16747,6 +16749,17 @@ static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
	msm_routing_put_voice_mixer),
};
static const struct snd_kcontrol_new proxy_rx_voice_mixer_controls[] = {
	SOC_DOUBLE_EXT("VoiceMMode1", SND_SOC_NOPM,
	MSM_BACKEND_DAI_PROXY_RX,
	MSM_FRONTEND_DAI_VOICEMMODE1, 1, 0, msm_routing_get_voice_mixer,
	msm_routing_put_voice_mixer),
	SOC_DOUBLE_EXT("VoiceMMode2", SND_SOC_NOPM,
	MSM_BACKEND_DAI_PROXY_RX,
	MSM_FRONTEND_DAI_VOICEMMODE2, 1, 0, msm_routing_get_voice_mixer,
	msm_routing_put_voice_mixer),
};
static const struct snd_kcontrol_new tx_voicemmode1_mixer_controls[] = {
	SOC_DOUBLE_EXT("PRI_TX_MMode1", SND_SOC_NOPM,
	MSM_BACKEND_DAI_PRI_I2S_TX,
@@ -16844,6 +16857,9 @@ static const struct snd_kcontrol_new tx_voicemmode1_mixer_controls[] = {
	SOC_DOUBLE_EXT("PRI_TDM_TX_3_MMode1", SND_SOC_NOPM,
	MSM_BACKEND_DAI_PRI_TDM_TX_3, MSM_FRONTEND_DAI_VOICEMMODE1,
	1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
	SOC_DOUBLE_EXT("PROXY_TX_MMode1", SND_SOC_NOPM,
	MSM_BACKEND_DAI_PROXY_TX, MSM_FRONTEND_DAI_VOICEMMODE1,
	1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
};
static const struct snd_kcontrol_new tx_voicemmode2_mixer_controls[] = {
@@ -16939,6 +16955,9 @@ static const struct snd_kcontrol_new tx_voicemmode2_mixer_controls[] = {
	SOC_DOUBLE_EXT("PRI_TDM_TX_3_MMode2", SND_SOC_NOPM,
	MSM_BACKEND_DAI_PRI_TDM_TX_3, MSM_FRONTEND_DAI_VOICEMMODE2,
	1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
	SOC_DOUBLE_EXT("PROXY_TX_MMode2", SND_SOC_NOPM,
	MSM_BACKEND_DAI_PROXY_TX, MSM_FRONTEND_DAI_VOICEMMODE2,
	1, 0, msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
};
static const struct snd_kcontrol_new tx_voip_mixer_controls[] = {
@@ -24120,6 +24139,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
	SND_SOC_DAPM_AIF_IN("SLIMBUS_9_TX", "Slimbus9 Capture", 0, 0, 0, 0),
	SND_SOC_DAPM_AIF_OUT("USB_AUDIO_RX", "USB Audio Playback", 0, 0, 0, 0),
	SND_SOC_DAPM_AIF_IN("USB_AUDIO_TX", "USB Audio Capture", 0, 0, 0, 0),
	SND_SOC_DAPM_AIF_OUT("PROXY_RX", "Proxy Playback", 0, 0, 0, 0),
	SND_SOC_DAPM_AIF_IN("PROXY_TX", "Proxy Capture", 0, 0, 0, 0),
	/* Switch Definitions */
	SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0,
@@ -24549,6 +24570,10 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
			   SND_SOC_NOPM, 0, 0,
			   wsa_cdc_dma_rx_0_voice_mixer_controls,
			   ARRAY_SIZE(wsa_cdc_dma_rx_0_voice_mixer_controls)),
	SND_SOC_DAPM_MIXER("PROXY_RX_Voice Mixer",
			   SND_SOC_NOPM, 0, 0,
			   proxy_rx_voice_mixer_controls,
			   ARRAY_SIZE(proxy_rx_voice_mixer_controls)),
	SND_SOC_DAPM_MIXER("RX_CDC_DMA_RX_0_Voice Mixer",
			   SND_SOC_NOPM, 0, 0,
			   rx_cdc_dma_rx_0_voice_mixer_controls,
@@ -27396,6 +27421,12 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"WSA_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
	{"WSA_CDC_DMA_RX_0", NULL, "WSA_CDC_DMA_RX_0_Voice Mixer"},
	{"PROXY_RX_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
	{"PROXY_RX", NULL, "PROXY_RX_Voice Mixer"},
	{"PROXY_RX_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
	{"PROXY_RX", NULL, "PROXY_RX_Voice Mixer"},
	{"RX_CDC_DMA_RX_0_Voice Mixer", "Voip", "VOIP_DL"},
	{"RX_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode1", "VOICEMMODE1_DL"},
	{"RX_CDC_DMA_RX_0_Voice Mixer", "VoiceMMode2", "VOICEMMODE2_DL"},
@@ -27564,6 +27595,7 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"VoiceMMode1_Tx Mixer", "QUAT_MI2S_TX_MMode1", "QUAT_MI2S_TX"},
	{"VoiceMMode1_Tx Mixer", "QUIN_MI2S_TX_MMode1", "QUIN_MI2S_TX"},
	{"VoiceMMode1_Tx Mixer", "PRI_TDM_TX_3_MMode1", "PRI_TDM_TX_3"},
	{"VoiceMMode1_Tx Mixer", "PROXY_TX_MMode1", "PROXY_TX"},
	{"VOICEMMODE1_UL", NULL, "VoiceMMode1_Tx Mixer"},
	{"VoiceMMode2_Tx Mixer", "PRI_TX_MMode2", "PRI_I2S_TX"},
@@ -27593,6 +27625,7 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"VoiceMMode2_Tx Mixer", "QUAT_MI2S_TX_MMode2", "QUAT_MI2S_TX"},
	{"VoiceMMode2_Tx Mixer", "QUIN_MI2S_TX_MMode2", "QUIN_MI2S_TX"},
	{"VoiceMMode2_Tx Mixer", "PRI_TDM_TX_3_MMode2", "PRI_TDM_TX_3"},
	{"VoiceMMode2_Tx Mixer", "PROXY_TX_MMode2", "PROXY_TX"},
	{"VOICEMMODE2_UL", NULL, "VoiceMMode2_Tx Mixer"},
	{"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"},
@@ -28898,6 +28931,7 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"BE_OUT", NULL, "RX_CDC_DMA_RX_5"},
	{"BE_OUT", NULL, "RX_CDC_DMA_RX_6"},
	{"BE_OUT", NULL, "RX_CDC_DMA_RX_7"},
	{"BE_OUT", NULL, "PROXY_RX"},
	{"PRI_I2S_TX", NULL, "BE_IN"},
	{"MI2S_TX", NULL, "BE_IN"},
@@ -28994,6 +29028,7 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"TX_CDC_DMA_TX_5", NULL, "BE_IN"},
	{"PRI_SPDIF_TX", NULL, "BE_IN"},
	{"SEC_SPDIF_TX", NULL, "BE_IN"},
	{"PROXY_TX", NULL, "BE_IN"},
};
static int msm_pcm_routing_hw_params(struct snd_pcm_substream *substream,
+5 −1
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.
 */
#ifndef _MSM_PCM_ROUTING_H
#define _MSM_PCM_ROUTING_H
@@ -42,6 +42,8 @@
#define LPASS_BE_VOICE2_PLAYBACK_TX "VOICE2_PLAYBACK_TX"
#define LPASS_BE_INCALL_RECORD_RX "INCALL_RECORD_RX"
#define LPASS_BE_INCALL_RECORD_TX "INCALL_RECORD_TX"
#define LPASS_BE_PROXY_RX "PROXY_RX"
#define LPASS_BE_PROXY_TX "PROXY_TX"
#define LPASS_BE_SEC_I2S_RX "SECONDARY_I2S_RX"
#define LPASS_BE_PRI_SPDIF_RX "PRI_SPDIF_RX"
#define LPASS_BE_PRI_SPDIF_TX "PRI_SPDIF_TX"
@@ -500,6 +502,8 @@ enum {
	MSM_BACKEND_DAI_AFE_LOOPBACK_TX,
	MSM_BACKEND_DAI_PRI_META_MI2S_RX,
	MSM_BACKEND_DAI_SEC_META_MI2S_RX,
	MSM_BACKEND_DAI_PROXY_RX,
	MSM_BACKEND_DAI_PROXY_TX,
	MSM_BACKEND_DAI_MAX,
};

+10 −0
Original line number Diff line number Diff line
@@ -988,6 +988,8 @@ int afe_sizeof_cfg_cmd(u16 port_id)
		break;
	case RT_PROXY_PORT_001_RX:
	case RT_PROXY_PORT_001_TX:
	case RT_PROXY_PORT_002_RX:
	case RT_PROXY_PORT_002_TX:
		ret_size = SIZEOF_CFG_CMD(afe_param_id_rt_proxy_port_cfg);
		break;
	case AFE_PORT_ID_USB_RX:
@@ -4755,6 +4757,8 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
		break;
	case RT_PROXY_PORT_001_RX:
	case RT_PROXY_PORT_001_TX:
	case RT_PROXY_PORT_002_RX:
	case RT_PROXY_PORT_002_TX:
		cfg_type = AFE_PARAM_ID_RT_PROXY_CONFIG;
		break;
	case INT_BT_SCO_RX:
@@ -5302,6 +5306,10 @@ int afe_get_port_index(u16 port_id)
		return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_7;
	case AFE_LOOPBACK_TX:
		return IDX_AFE_LOOPBACK_TX;
	case RT_PROXY_PORT_002_RX:
		return IDX_RT_PROXY_PORT_002_RX;
	case RT_PROXY_PORT_002_TX:
		return IDX_RT_PROXY_PORT_002_TX;
	default:
		pr_err("%s: port 0x%x\n", __func__, port_id);
		return -EINVAL;
@@ -7499,6 +7507,8 @@ int afe_validate_port(u16 port_id)
	case AFE_PORT_ID_TX_CODEC_DMA_TX_5:
	case AFE_PORT_ID_RX_CODEC_DMA_RX_6:
	case AFE_PORT_ID_RX_CODEC_DMA_RX_7:
	case RT_PROXY_PORT_002_RX:
	case RT_PROXY_PORT_002_TX:
	{
		ret = 0;
		break;
+11 −1
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/slab.h>
@@ -385,6 +385,10 @@ int q6audio_get_port_index(u16 port_id)
		return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_6;
	case AFE_PORT_ID_RX_CODEC_DMA_RX_7:
		return IDX_AFE_PORT_ID_RX_CODEC_DMA_RX_7;
	case RT_PROXY_PORT_002_RX:
		return IDX_RT_PROXY_PORT_002_RX;
	case RT_PROXY_PORT_002_TX:
		return IDX_RT_PROXY_PORT_002_TX;
	default: return -EINVAL;
	}
}
@@ -767,6 +771,10 @@ int q6audio_get_port_id(u16 port_id)
		return AFE_PORT_ID_RX_CODEC_DMA_RX_6;
	case AFE_PORT_ID_RX_CODEC_DMA_RX_7:
		return AFE_PORT_ID_RX_CODEC_DMA_RX_7;
	case RT_PROXY_PORT_002_RX:
		return RT_PROXY_PORT_002_RX;
	case RT_PROXY_PORT_002_TX:
		return RT_PROXY_PORT_002_TX;
	default:
		pr_warn("%s: Invalid port_id %d\n", __func__, port_id);
		return -EINVAL;
@@ -1196,6 +1204,8 @@ int q6audio_validate_port(u16 port_id)
	case AFE_PORT_ID_TX_CODEC_DMA_TX_5:
	case AFE_PORT_ID_RX_CODEC_DMA_RX_6:
	case AFE_PORT_ID_RX_CODEC_DMA_RX_7:
	case RT_PROXY_PORT_002_RX:
	case RT_PROXY_PORT_002_TX:
	{
		ret = 0;
		break;
Loading