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

Commit 641fb281 authored by Xiaojun Sang's avatar Xiaojun Sang
Browse files

ASoC: soc: qdsp6v2: add support for slimbus VI recording



Add a new dailink for slimbus VI sense recording.
SLIMBUS_TX_VI and SLIMBUS_4_TX can coexist.
VI recording and speaker protection cannot work
simultaneoulsy due to shared physical afe port.

CRs-Fixed: 1087025
Change-Id: If074b7042e09d1e69147546461e6fa42d427350e
Signed-off-by: default avatarXiaojun Sang <xsang@codeaurora.org>
parent 9f45a559
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -788,6 +788,7 @@ struct adm_cmd_connect_afe_port_v5 {
#define SLIMBUS_3_TX		0x4007
#define SLIMBUS_3_TX		0x4007
#define SLIMBUS_4_RX		0x4008
#define SLIMBUS_4_RX		0x4008
#define SLIMBUS_4_TX		0x4009
#define SLIMBUS_4_TX		0x4009
#define SLIMBUS_TX_VI		0x4f09
#define SLIMBUS_5_RX		0x400a
#define SLIMBUS_5_RX		0x400a
#define SLIMBUS_5_TX		0x400b
#define SLIMBUS_5_TX		0x400b
#define SLIMBUS_6_RX		0x400c
#define SLIMBUS_6_RX		0x400c
+32 −0
Original line number Original line Diff line number Diff line
@@ -1757,6 +1757,7 @@ static int msm_dai_q6_hw_params(struct snd_pcm_substream *substream,
	case SLIMBUS_2_TX:
	case SLIMBUS_2_TX:
	case SLIMBUS_3_TX:
	case SLIMBUS_3_TX:
	case SLIMBUS_4_TX:
	case SLIMBUS_4_TX:
	case SLIMBUS_TX_VI:
	case SLIMBUS_5_TX:
	case SLIMBUS_5_TX:
	case SLIMBUS_6_TX:
	case SLIMBUS_6_TX:
	case SLIMBUS_7_TX:
	case SLIMBUS_7_TX:
@@ -1906,6 +1907,7 @@ static int msm_dai_q6_set_channel_map(struct snd_soc_dai *dai,
	case SLIMBUS_2_TX:
	case SLIMBUS_2_TX:
	case SLIMBUS_3_TX:
	case SLIMBUS_3_TX:
	case SLIMBUS_4_TX:
	case SLIMBUS_4_TX:
	case SLIMBUS_TX_VI:
	case SLIMBUS_5_TX:
	case SLIMBUS_5_TX:
	case SLIMBUS_6_TX:
	case SLIMBUS_6_TX:
	case SLIMBUS_7_TX:
	case SLIMBUS_7_TX:
@@ -2283,6 +2285,9 @@ static const struct snd_kcontrol_new sb_config_controls[] = {
		     msm_dai_q6_cal_info_get,
		     msm_dai_q6_cal_info_get,
		     msm_dai_q6_cal_info_put),
		     msm_dai_q6_cal_info_put),
	SOC_ENUM_EXT("SLIM_2_RX Format", sb_config_enum[0],
	SOC_ENUM_EXT("SLIM_2_RX Format", sb_config_enum[0],
		     msm_dai_q6_sb_format_get,
		     msm_dai_q6_sb_format_put),
	SOC_ENUM_EXT("SLIM_TX_VI Format", sb_config_enum[0],
		     msm_dai_q6_sb_format_get,
		     msm_dai_q6_sb_format_get,
		     msm_dai_q6_sb_format_put)
		     msm_dai_q6_sb_format_put)
};
};
@@ -2336,6 +2341,11 @@ static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai)
				 snd_ctl_new1(&sb_config_controls[0],
				 snd_ctl_new1(&sb_config_controls[0],
				 dai_data));
				 dai_data));
		break;
		break;
	case SLIMBUS_TX_VI:
		rc = snd_ctl_add(dai->component->card->snd_card,
				 snd_ctl_new1(&sb_config_controls[3],
				 dai_data));
		break;
	case SLIMBUS_2_RX:
	case SLIMBUS_2_RX:
		rc = snd_ctl_add(dai->component->card->snd_card,
		rc = snd_ctl_add(dai->component->card->snd_card,
				 snd_ctl_new1(&sb_config_controls[1],
				 snd_ctl_new1(&sb_config_controls[1],
@@ -3216,6 +3226,25 @@ static struct snd_soc_dai_driver msm_dai_q6_slimbus_tx_dai[] = {
		.probe = msm_dai_q6_dai_probe,
		.probe = msm_dai_q6_dai_probe,
		.remove = msm_dai_q6_dai_remove,
		.remove = msm_dai_q6_dai_remove,
	},
	},
	{
		.capture = {
			.stream_name = "Slimbus VI Capture",
			.aif_name = "SLIMBUS_TX_VI",
			.rates = SNDRV_PCM_RATE_8000_96000 |
			SNDRV_PCM_RATE_192000,
			.formats = SNDRV_PCM_FMTBIT_S16_LE |
				   SNDRV_PCM_FMTBIT_S24_LE |
				   SNDRV_PCM_FMTBIT_S32_LE,
			.channels_min = 1,
			.channels_max = 4,
			.rate_min = 8000,
			.rate_max = 192000,
		},
		.ops = &msm_dai_q6_ops,
		.id = SLIMBUS_TX_VI,
		.probe = msm_dai_q6_dai_probe,
		.remove = msm_dai_q6_dai_remove,
	},
	{
	{
		.capture = {
		.capture = {
			.stream_name = "Slimbus5 Capture",
			.stream_name = "Slimbus5 Capture",
@@ -4523,6 +4552,9 @@ register_slim_playback:
	case SLIMBUS_4_TX:
	case SLIMBUS_4_TX:
		strlcpy(stream_name, "Slimbus4 Capture", 80);
		strlcpy(stream_name, "Slimbus4 Capture", 80);
		goto register_slim_capture;
		goto register_slim_capture;
	case SLIMBUS_TX_VI:
		strlcpy(stream_name, "Slimbus VI Capture", 80);
		goto register_slim_capture;
	case SLIMBUS_5_TX:
	case SLIMBUS_5_TX:
		strlcpy(stream_name, "Slimbus5 Capture", 80);
		strlcpy(stream_name, "Slimbus5 Capture", 80);
		goto register_slim_capture;
		goto register_slim_capture;
+14 −2
Original line number Original line Diff line number Diff line
@@ -80,14 +80,15 @@ enum {
#define SLIMBUS_2_TX_TEXT "SLIMBUS_2_TX"
#define SLIMBUS_2_TX_TEXT "SLIMBUS_2_TX"
#define SLIMBUS_3_TX_TEXT "SLIMBUS_3_TX"
#define SLIMBUS_3_TX_TEXT "SLIMBUS_3_TX"
#define SLIMBUS_4_TX_TEXT "SLIMBUS_4_TX"
#define SLIMBUS_4_TX_TEXT "SLIMBUS_4_TX"
#define SLIMBUS_TX_VI_TEXT "SLIMBUS_TX_VI"
#define SLIMBUS_5_TX_TEXT "SLIMBUS_5_TX"
#define SLIMBUS_5_TX_TEXT "SLIMBUS_5_TX"
#define TERT_MI2S_TX_TEXT "TERT_MI2S_TX"
#define TERT_MI2S_TX_TEXT "TERT_MI2S_TX"
#define LSM_FUNCTION_TEXT "LSM Function"
#define LSM_FUNCTION_TEXT "LSM Function"
static const char * const mad_audio_mux_text[] = {
static const char * const mad_audio_mux_text[] = {
	"None",
	"None",
	SLIMBUS_0_TX_TEXT, SLIMBUS_1_TX_TEXT, SLIMBUS_2_TX_TEXT,
	SLIMBUS_0_TX_TEXT, SLIMBUS_1_TX_TEXT, SLIMBUS_2_TX_TEXT,
	SLIMBUS_3_TX_TEXT, SLIMBUS_4_TX_TEXT, SLIMBUS_5_TX_TEXT,
	SLIMBUS_3_TX_TEXT, SLIMBUS_4_TX_TEXT, SLIMBUS_TX_VI_TEXT,
	TERT_MI2S_TX_TEXT
	SLIMBUS_5_TX_TEXT, TERT_MI2S_TX_TEXT
};
};


struct msm_pcm_route_bdai_pp_params {
struct msm_pcm_route_bdai_pp_params {
@@ -110,6 +111,9 @@ static int msm_routing_get_bit_width(unsigned int format)
	int bit_width;
	int bit_width;


	switch (format) {
	switch (format) {
	case SNDRV_PCM_FORMAT_S32_LE:
		bit_width = 32;
		break;
	case SNDRV_PCM_FORMAT_S24_LE:
	case SNDRV_PCM_FORMAT_S24_LE:
	case SNDRV_PCM_FORMAT_S24_3LE:
	case SNDRV_PCM_FORMAT_S24_3LE:
		bit_width = 24;
		bit_width = 24;
@@ -495,6 +499,7 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
	  LPASS_BE_INT6_MI2S_RX},
	  LPASS_BE_INT6_MI2S_RX},
	{ AFE_PORT_ID_INT6_MI2S_TX, 0, 0, {0}, 0, 0, 0, 0, 0,
	{ AFE_PORT_ID_INT6_MI2S_TX, 0, 0, {0}, 0, 0, 0, 0, 0,
	  LPASS_BE_INT6_MI2S_TX},
	  LPASS_BE_INT6_MI2S_TX},
	{ SLIMBUS_TX_VI, 0, 0, {0}, 0, 0, 0, 0, 0, LPASS_BE_SLIMBUS_TX_VI},
};
};


/* Track ASM playback & capture sessions of DAI */
/* Track ASM playback & capture sessions of DAI */
@@ -4741,6 +4746,9 @@ static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
	SOC_SINGLE_EXT("SLIM_4_TX", MSM_BACKEND_DAI_SLIMBUS_4_TX,
	SOC_SINGLE_EXT("SLIM_4_TX", MSM_BACKEND_DAI_SLIMBUS_4_TX,
		MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
		MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
		msm_routing_put_audio_mixer),
		msm_routing_put_audio_mixer),
	SOC_SINGLE_EXT("SLIM_TX_VI", MSM_BACKEND_DAI_SLIMBUS_TX_VI,
		MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
		msm_routing_put_audio_mixer),
	SOC_SINGLE_EXT("SLIM_6_TX", MSM_BACKEND_DAI_SLIMBUS_6_TX,
	SOC_SINGLE_EXT("SLIM_6_TX", MSM_BACKEND_DAI_SLIMBUS_6_TX,
		MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
		MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
		msm_routing_put_audio_mixer),
		msm_routing_put_audio_mixer),
@@ -8864,6 +8872,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
				0, 0, 0, 0),
				0, 0, 0, 0),
	SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture",
	SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture",
				0, 0, 0, 0),
				0, 0, 0, 0),
	SND_SOC_DAPM_AIF_IN("SLIMBUS_TX_VI", "Slimbus VI Capture",
				0, 0, 0, 0),
	SND_SOC_DAPM_AIF_IN("SENARY_TX", "Senary_mi2s Capture",
	SND_SOC_DAPM_AIF_IN("SENARY_TX", "Senary_mi2s Capture",
				0, 0, 0, 0),
				0, 0, 0, 0),
	SND_SOC_DAPM_AIF_IN("SLIMBUS_5_TX", "Slimbus5 Capture", 0, 0, 0, 0),
	SND_SOC_DAPM_AIF_IN("SLIMBUS_5_TX", "Slimbus5 Capture", 0, 0, 0, 0),
@@ -9545,6 +9555,7 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"MultiMedia4 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
	{"MultiMedia4 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
	{"MultiMedia8 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
	{"MultiMedia8 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
	{"MultiMedia1 Mixer", "SLIM_4_TX", "SLIMBUS_4_TX"},
	{"MultiMedia1 Mixer", "SLIM_4_TX", "SLIMBUS_4_TX"},
	{"MultiMedia1 Mixer", "SLIM_TX_VI", "SLIMBUS_TX_VI"},
	{"MultiMedia1 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"},
	{"MultiMedia1 Mixer", "SLIM_6_TX", "SLIMBUS_6_TX"},
	{"MultiMedia1 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
	{"MultiMedia1 Mixer", "SLIM_7_TX", "SLIMBUS_7_TX"},
	{"MultiMedia1 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
	{"MultiMedia1 Mixer", "SLIM_8_TX", "SLIMBUS_8_TX"},
@@ -11281,6 +11292,7 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"SLIMBUS_1_TX", NULL, "BE_IN" },
	{"SLIMBUS_1_TX", NULL, "BE_IN" },
	{"SLIMBUS_3_TX", NULL, "BE_IN" },
	{"SLIMBUS_3_TX", NULL, "BE_IN" },
	{"SLIMBUS_4_TX", NULL, "BE_IN" },
	{"SLIMBUS_4_TX", NULL, "BE_IN" },
	{"SLIMBUS_TX_VI", NULL, "BE_IN" },
	{"SLIMBUS_5_TX", NULL, "BE_IN" },
	{"SLIMBUS_5_TX", NULL, "BE_IN" },
	{"SLIMBUS_6_TX", NULL, "BE_IN" },
	{"SLIMBUS_6_TX", NULL, "BE_IN" },
	{"SLIMBUS_7_TX", NULL, "BE_IN" },
	{"SLIMBUS_7_TX", NULL, "BE_IN" },
+2 −0
Original line number Original line Diff line number Diff line
@@ -65,6 +65,7 @@
#define LPASS_BE_SLIMBUS_4_RX "SLIMBUS_4_RX"
#define LPASS_BE_SLIMBUS_4_RX "SLIMBUS_4_RX"
#define LPASS_BE_SLIMBUS_4_TX "SLIMBUS_4_TX"
#define LPASS_BE_SLIMBUS_4_TX "SLIMBUS_4_TX"
#define LPASS_BE_SLIMBUS_5_RX "SLIMBUS_5_RX"
#define LPASS_BE_SLIMBUS_5_RX "SLIMBUS_5_RX"
#define LPASS_BE_SLIMBUS_TX_VI "SLIMBUS_TX_VI"
#define LPASS_BE_SLIMBUS_5_TX "SLIMBUS_5_TX"
#define LPASS_BE_SLIMBUS_5_TX "SLIMBUS_5_TX"
#define LPASS_BE_SLIMBUS_6_RX "SLIMBUS_6_RX"
#define LPASS_BE_SLIMBUS_6_RX "SLIMBUS_6_RX"
#define LPASS_BE_SLIMBUS_6_TX "SLIMBUS_6_TX"
#define LPASS_BE_SLIMBUS_6_TX "SLIMBUS_6_TX"
@@ -355,6 +356,7 @@ enum {
	MSM_BACKEND_DAI_INT5_MI2S_TX,
	MSM_BACKEND_DAI_INT5_MI2S_TX,
	MSM_BACKEND_DAI_INT6_MI2S_RX,
	MSM_BACKEND_DAI_INT6_MI2S_RX,
	MSM_BACKEND_DAI_INT6_MI2S_TX,
	MSM_BACKEND_DAI_INT6_MI2S_TX,
	MSM_BACKEND_DAI_SLIMBUS_TX_VI,
	MSM_BACKEND_DAI_MAX,
	MSM_BACKEND_DAI_MAX,
};
};


+19 −0
Original line number Original line Diff line number Diff line
@@ -503,6 +503,7 @@ int afe_get_port_type(u16 port_id)
	case SLIMBUS_2_TX:
	case SLIMBUS_2_TX:
	case SLIMBUS_3_TX:
	case SLIMBUS_3_TX:
	case SLIMBUS_4_TX:
	case SLIMBUS_4_TX:
	case SLIMBUS_TX_VI:
	case SLIMBUS_5_TX:
	case SLIMBUS_5_TX:
	case SLIMBUS_6_TX:
	case SLIMBUS_6_TX:
	case SLIMBUS_7_TX:
	case SLIMBUS_7_TX:
@@ -607,6 +608,7 @@ int afe_sizeof_cfg_cmd(u16 port_id)
	case SLIMBUS_3_TX:
	case SLIMBUS_3_TX:
	case SLIMBUS_4_RX:
	case SLIMBUS_4_RX:
	case SLIMBUS_4_TX:
	case SLIMBUS_4_TX:
	case SLIMBUS_TX_VI:
	case SLIMBUS_5_RX:
	case SLIMBUS_5_RX:
	case SLIMBUS_5_TX:
	case SLIMBUS_5_TX:
	case SLIMBUS_6_RX:
	case SLIMBUS_6_RX:
@@ -2785,6 +2787,13 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
		return ret;
		return ret;
	}
	}


	/*
	 * Virtual SLIMBUS_TX_VI shares afe port with SLIMBUS_4_TX.
	 * port_id changes to physical port of SLIMBUS_4_TX.
	 */
	if (port_id == SLIMBUS_TX_VI)
		port_id = SLIMBUS_4_TX;

	if ((port_id == RT_PROXY_DAI_001_RX) ||
	if ((port_id == RT_PROXY_DAI_001_RX) ||
		(port_id == RT_PROXY_DAI_002_TX)) {
		(port_id == RT_PROXY_DAI_002_TX)) {
		pr_debug("%s: before incrementing pcm_afe_instance %d"\
		pr_debug("%s: before incrementing pcm_afe_instance %d"\
@@ -2950,6 +2959,7 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
	case SLIMBUS_3_TX:
	case SLIMBUS_3_TX:
	case SLIMBUS_4_RX:
	case SLIMBUS_4_RX:
	case SLIMBUS_4_TX:
	case SLIMBUS_4_TX:
	case SLIMBUS_TX_VI:
	case SLIMBUS_5_RX:
	case SLIMBUS_5_RX:
	case SLIMBUS_5_TX:
	case SLIMBUS_5_TX:
	case SLIMBUS_6_RX:
	case SLIMBUS_6_RX:
@@ -3143,6 +3153,7 @@ int afe_get_port_index(u16 port_id)
	case RT_PROXY_PORT_001_TX: return IDX_RT_PROXY_PORT_001_TX;
	case RT_PROXY_PORT_001_TX: return IDX_RT_PROXY_PORT_001_TX;
	case SLIMBUS_4_RX: return IDX_SLIMBUS_4_RX;
	case SLIMBUS_4_RX: return IDX_SLIMBUS_4_RX;
	case SLIMBUS_4_TX: return IDX_SLIMBUS_4_TX;
	case SLIMBUS_4_TX: return IDX_SLIMBUS_4_TX;
	case SLIMBUS_TX_VI: return IDX_SLIMBUS_4_TX;
	case SLIMBUS_5_RX: return IDX_SLIMBUS_5_RX;
	case SLIMBUS_5_RX: return IDX_SLIMBUS_5_RX;
	case SLIMBUS_5_TX: return IDX_SLIMBUS_5_TX;
	case SLIMBUS_5_TX: return IDX_SLIMBUS_5_TX;
	case SLIMBUS_6_RX: return IDX_SLIMBUS_6_RX;
	case SLIMBUS_6_RX: return IDX_SLIMBUS_6_RX;
@@ -5070,6 +5081,14 @@ int afe_close(int port_id)
		goto fail_cmd;
		goto fail_cmd;
	}
	}
	pr_debug("%s: port_id = 0x%x\n", __func__, port_id);
	pr_debug("%s: port_id = 0x%x\n", __func__, port_id);

	/*
	 * Virtual SLIMBUS_TX_VI shares afe port with SLIMBUS_4_TX.
	 * port_id changes to physical port of SLIMBUS_4_TX.
	 */
	if (port_id == SLIMBUS_TX_VI)
		port_id = SLIMBUS_4_TX;

	if ((port_id == RT_PROXY_DAI_001_RX) ||
	if ((port_id == RT_PROXY_DAI_001_RX) ||
			(port_id == RT_PROXY_DAI_002_TX)) {
			(port_id == RT_PROXY_DAI_002_TX)) {
		pr_debug("%s: before decrementing pcm_afe_instance %d\n",
		pr_debug("%s: before decrementing pcm_afe_instance %d\n",
Loading