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

Commit 30f23bd6 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ASoC: msm: Add second proxy tx device FE and AFE Rx BE"

parents 5d09fd2f 453c34d2
Loading
Loading
Loading
Loading

asoc/msm-dai-q6-v2.c

100644 → 100755
+38 −4
Original line number Diff line number Diff line
@@ -2769,6 +2769,7 @@ static int msm_dai_q6_hw_params(struct snd_pcm_substream *substream,
	case RT_PROXY_DAI_002_TX:
	case RT_PROXY_DAI_002_RX:
	case RT_PROXY_DAI_003_TX:
	case RT_PROXY_DAI_003_RX:
	case RT_PROXY_PORT_002_TX:
	case RT_PROXY_PORT_002_RX:
		rc = msm_dai_q6_afe_rtproxy_hw_params(params, dai);
@@ -4091,6 +4092,10 @@ static const struct soc_enum rt_proxy_1_rx_enum =
	SOC_ENUM_SINGLE(RT_PROXY_PORT_001_RX, 0, ARRAY_SIZE(afe_cal_mode_text),
			afe_cal_mode_text);

static const struct soc_enum rt_proxy_2_rx_enum =
	SOC_ENUM_SINGLE(RT_PROXY_PORT_002_RX, 0, ARRAY_SIZE(afe_cal_mode_text),
			afe_cal_mode_text);

static const struct soc_enum rt_proxy_1_tx_enum =
	SOC_ENUM_SINGLE(RT_PROXY_PORT_001_TX, 0, ARRAY_SIZE(afe_cal_mode_text),
			afe_cal_mode_text);
@@ -4117,6 +4122,9 @@ static const struct snd_kcontrol_new rt_proxy_config_controls[] = {
	SOC_ENUM_EXT("RT_PROXY_1_TX SetCalMode", rt_proxy_1_tx_enum,
			msm_dai_q6_cal_info_get,
			msm_dai_q6_cal_info_put),
	SOC_ENUM_EXT("RT_PROXY_2_RX SetCalMode", rt_proxy_2_rx_enum,
			msm_dai_q6_cal_info_get,
			msm_dai_q6_cal_info_put),
};

static const struct snd_kcontrol_new usb_audio_cfg_controls[] = {
@@ -4284,6 +4292,11 @@ static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai)
				 snd_ctl_new1(&rt_proxy_config_controls[1],
				 dai_data));
		break;
	case RT_PROXY_DAI_003_RX:
		rc = snd_ctl_add(dai->component->card->snd_card,
				snd_ctl_new1(&rt_proxy_config_controls[2],
				dai_data));
		break;
	case AFE_PORT_ID_USB_RX:
		rc = snd_ctl_add(dai->component->card->snd_card,
				 snd_ctl_new1(&usb_audio_cfg_controls[0],
@@ -4381,6 +4394,24 @@ static struct snd_soc_dai_driver msm_dai_q6_afe_rx_dai[] = {
		.probe = msm_dai_q6_dai_probe,
		.remove = msm_dai_q6_dai_remove,
	},
	{
		.playback = {
			.stream_name = "AFE Playback1",
			.aif_name = "PCM_RX1",
			.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
			SNDRV_PCM_RATE_16000,
			.formats = SNDRV_PCM_FMTBIT_S16_LE |
			SNDRV_PCM_FMTBIT_S24_LE,
			.channels_min = 1,
			.channels_max = 2,
			.rate_min =     8000,
			.rate_max =     48000,
		},
		.ops = &msm_dai_q6_ops,
		.id = RT_PROXY_DAI_003_RX,
		.probe = msm_dai_q6_dai_probe,
		.remove = msm_dai_q6_dai_remove,
	},
};

static struct snd_soc_dai_driver msm_dai_q6_afe_lb_tx_dai[] = {
@@ -7616,6 +7647,9 @@ static int msm_dai_q6_dev_probe(struct platform_device *pdev)
	case RT_PROXY_DAI_001_RX:
		strlcpy(stream_name, "AFE Playback", 80);
		goto register_afe_playback;
	case RT_PROXY_DAI_003_RX:
		strlcpy(stream_name, "AFE Playback1", 80);
		goto register_afe_playback;
	case RT_PROXY_DAI_002_RX:
		strlcpy(stream_name, "AFE-PROXY RX", 80);
register_afe_playback:

asoc/msm-pcm-routing-v2.c

100644 → 100755
+124 −2
Original line number Diff line number Diff line
@@ -478,7 +478,8 @@ static void msm_pcm_routng_cfg_matrix_map_pp(struct route_payload payload,
	    is_custom_stereo_on) {
		for (itr = 0; itr < payload.num_copps; itr++) {
			if ((payload.port_id[itr] != SLIMBUS_0_RX) &&
			    (payload.port_id[itr] != RT_PROXY_PORT_001_RX)) {
			    (payload.port_id[itr] != RT_PROXY_PORT_001_RX) &&
			    (payload.port_id[itr] != RT_PROXY_PORT_002_RX)) {
				continue;
			}
@@ -886,6 +887,8 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
	{ 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},
	{ RT_PROXY_PORT_002_RX, 0, {0}, {0}, 0, 0, 0, 0,
	  LPASS_BE_AFE_PCM_RX1},
};
/* Track ASM playback & capture sessions of DAI
@@ -3746,7 +3749,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", "HDMI_RX_MS"
"SEC_META_MI2S_RX", "PROXY_RX", "PROXY_TX", "HDMI_RX_MS", "AFE_PCM_RX1"
};
static SOC_ENUM_SINGLE_DECL(mm1_channel_mux,
@@ -9983,6 +9986,101 @@ static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = {
	msm_routing_put_audio_mixer),
};
static const struct snd_kcontrol_new afe_pcm_rx_1_mixer_controls[] = {
	SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
	MSM_BACKEND_DAI_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	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_AFE_PCM_RX1,
	MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
	msm_routing_put_audio_mixer),
};
#ifndef CONFIG_AUXPCM_DISABLE
static const struct snd_kcontrol_new auxpcm_rx_mixer_controls[] = {
	SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
@@ -23067,6 +23165,7 @@ static int msm_routing_put_stereo_to_custom_stereo_control(
			continue;
		if ((port_id != SLIMBUS_0_RX) &&
		     (port_id != RT_PROXY_PORT_001_RX) &&
			(port_id != RT_PROXY_PORT_002_RX) &&
			(port_id != AFE_PORT_ID_PRIMARY_MI2S_RX) &&
			(port_id != AFE_PORT_ID_INT4_MI2S_RX))
			continue;
@@ -24504,6 +24603,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
				0, 0, 0, 0),
	SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture",
				0, 0, 0, 0),
	SND_SOC_DAPM_AIF_OUT("PCM_RX1", "AFE Playback1",
				0, 0, 0, 0),
	SND_SOC_DAPM_AIF_OUT("WSA_CDC_DMA_RX_0", "WSA CDC DMA0 Playback",
				0, 0, 0, 0),
	SND_SOC_DAPM_AIF_IN("WSA_CDC_DMA_TX_0", "WSA CDC DMA0 Capture",
@@ -24808,6 +24909,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
	int_fm_rx_mixer_controls, ARRAY_SIZE(int_fm_rx_mixer_controls)),
	SND_SOC_DAPM_MIXER("AFE_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
	afe_pcm_rx_mixer_controls, ARRAY_SIZE(afe_pcm_rx_mixer_controls)),
	SND_SOC_DAPM_MIXER("AFE_PCM_RX1 Audio Mixer", SND_SOC_NOPM, 0, 0,
			afe_pcm_rx_1_mixer_controls, ARRAY_SIZE(afe_pcm_rx_1_mixer_controls)),
	SND_SOC_DAPM_MIXER("Voice Stub Tx Mixer", SND_SOC_NOPM, 0, 0,
	tx_voice_stub_mixer_controls, ARRAY_SIZE(tx_voice_stub_mixer_controls)),
	SND_SOC_DAPM_MIXER("Voice2 Stub Tx Mixer", SND_SOC_NOPM, 0, 0,
@@ -26916,6 +27019,24 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"AFE_PCM_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
	{"PCM_RX", NULL, "AFE_PCM_RX Audio Mixer"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia1", "MM_DL1"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia2", "MM_DL2"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia3", "MM_DL3"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia4", "MM_DL4"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia5", "MM_DL5"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia6", "MM_DL6"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia7", "MM_DL7"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia8", "MM_DL8"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia9", "MM_DL9"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia10", "MM_DL10"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia11", "MM_DL11"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia12", "MM_DL12"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia13", "MM_DL13"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia14", "MM_DL14"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia15", "MM_DL15"},
	{"AFE_PCM_RX1 Audio Mixer", "MultiMedia16", "MM_DL16"},
	{"PCM_RX1", NULL, "AFE_PCM_RX1 Audio Mixer"},
	{"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
	{"MultiMedia3 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
	{"MultiMedia4 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
@@ -27452,6 +27573,7 @@ static const struct snd_soc_dapm_route intercon[] = {
	{"BE_OUT", NULL, "RX_CDC_DMA_RX_6"},
	{"BE_OUT", NULL, "RX_CDC_DMA_RX_7"},
	{"BE_OUT", NULL, "PROXY_RX"},
	{"BE_OUT", NULL, "PCM_RX1"},
	{"SLIMBUS_0_TX", NULL, "BE_IN" },
	{"SLIMBUS_1_TX", NULL, "BE_IN" },
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#define LPASS_BE_INT_FM_TX "INT_FM_TX"
#define LPASS_BE_AFE_PCM_RX "RT_PROXY_DAI_001_RX"
#define LPASS_BE_AFE_PCM_TX "RT_PROXY_DAI_002_TX"
#define LPASS_BE_AFE_PCM_RX1 "RT_PROXY_DAI_003_RX"
#define LPASS_BE_AUXPCM_RX "AUX_PCM_RX"
#define LPASS_BE_AUXPCM_TX "AUX_PCM_TX"
#define LPASS_BE_SEC_AUXPCM_RX "SEC_AUX_PCM_RX"
@@ -513,6 +514,7 @@ enum {
	MSM_BACKEND_DAI_PROXY_RX,
	MSM_BACKEND_DAI_PROXY_TX,
	MSM_BACKEND_DAI_HDMI_RX_MS,
	MSM_BACKEND_DAI_AFE_PCM_RX1,
	MSM_BACKEND_DAI_MAX,
};

+72 −35
Original line number Diff line number Diff line
@@ -339,15 +339,17 @@ static struct afe_ctl this_afe;
#define TIMEOUT_MS 1000
#define Q6AFE_MAX_VOLUME 0x3FFF

static int pcm_afe_instance[2];
static int proxy_afe_instance[2];
bool afe_close_done[2] = {true, true};
static int pcm_afe_instance[3];
static int proxy_afe_instance[3];
bool afe_close_done[3] = {true, true, true};

static bool proxy_afe_started = false;

#define SIZEOF_CFG_CMD(y) \
		(sizeof(struct apr_hdr) + sizeof(u16) + (sizeof(struct y)))

static bool is_afe_proxy_port(int port_id);

static void q6afe_unload_avcs_modules(u16 port_id, int index)
{
	int ret = 0;
@@ -5737,28 +5739,30 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
		proxy_afe_started = true;
	}
	if ((port_id == RT_PROXY_DAI_001_RX) ||
		(port_id == RT_PROXY_DAI_002_TX)) {
		(port_id == RT_PROXY_DAI_002_TX) ||
		(port_id == RT_PROXY_DAI_003_RX)) {
		pr_debug("%s: before incrementing pcm_afe_instance %d port_id 0x%x\n",
			__func__,
			pcm_afe_instance[port_id & 0x1], port_id);
			pcm_afe_instance[port_id & 0x3], port_id);
		port_id = VIRTUAL_ID_TO_PORTID(port_id);
		pcm_afe_instance[port_id & 0x1]++;
		pcm_afe_instance[port_id & 0x3]++;
		return 0;
	}
	if ((port_id == RT_PROXY_DAI_002_RX) ||
			(port_id == RT_PROXY_DAI_001_TX)) {
			(port_id == RT_PROXY_DAI_001_TX) ||
			(port_id == RT_PROXY_DAI_003_TX)) {
		pr_debug("%s: before incrementing proxy_afe_instance %d port_id 0x%x\n",
			__func__,
			proxy_afe_instance[port_id & 0x1], port_id);
			proxy_afe_instance[port_id & 0x3], port_id);

		if (!afe_close_done[port_id & 0x1]) {
		if (!afe_close_done[port_id & 0x3]) {
			/*close pcm dai corresponding to the proxy dai*/
			afe_close(port_id - 0x10);
			pcm_afe_instance[port_id & 0x1]++;
			pcm_afe_instance[port_id & 0x3]++;
			pr_debug("%s: reconfigure afe port again\n", __func__);
		}
		proxy_afe_instance[port_id & 0x1]++;
		afe_close_done[port_id & 0x1] = false;
		proxy_afe_instance[port_id & 0x3]++;
		afe_close_done[port_id & 0x3] = false;
		port_id = VIRTUAL_ID_TO_PORTID(port_id);
	}

@@ -6654,12 +6658,14 @@ int afe_open(u16 port_id,
	}

	if ((port_id == RT_PROXY_DAI_001_RX) ||
		(port_id == RT_PROXY_DAI_002_TX)) {
		(port_id == RT_PROXY_DAI_002_TX) ||
		(port_id == RT_PROXY_DAI_003_RX)) {
		pr_err("%s: wrong port 0x%x\n", __func__, port_id);
		return -EINVAL;
	}
	if ((port_id == RT_PROXY_DAI_002_RX) ||
		(port_id == RT_PROXY_DAI_001_TX))
		(port_id == RT_PROXY_DAI_001_TX) ||
		(port_id == RT_PROXY_DAI_003_TX))
		port_id = VIRTUAL_ID_TO_PORTID(port_id);

	ret = afe_q6_interface_prepare();
@@ -8828,6 +8834,29 @@ int afe_validate_port(u16 port_id)
	return ret;
}

static bool is_afe_proxy_port(int port_id)
{
	bool ret = false;
	switch(port_id) {
	case RT_PROXY_DAI_001_RX:
	case RT_PROXY_DAI_001_TX:
	case RT_PROXY_DAI_002_RX:
	case RT_PROXY_DAI_002_TX:
	case RT_PROXY_DAI_003_RX:
	case RT_PROXY_DAI_003_TX:
	{
		ret = true;
		break;
	}
	default:
		pr_debug("%s: afe port %d is not a proxy port\n",
			__func__, port_id);
		ret = false;
	}

	return ret;
}

int afe_convert_virtual_to_portid(u16 port_id)
{
	int ret;
@@ -8841,6 +8870,7 @@ int afe_convert_virtual_to_portid(u16 port_id)
		    port_id == RT_PROXY_DAI_001_TX ||
		    port_id == RT_PROXY_DAI_002_RX ||
		    port_id == RT_PROXY_DAI_002_TX ||
		    port_id == RT_PROXY_DAI_003_RX ||
		    port_id == RT_PROXY_DAI_003_TX) {
			ret = VIRTUAL_ID_TO_PORTID(port_id);
		} else {
@@ -8903,43 +8933,50 @@ int afe_close(int port_id)

	if (this_afe.apr == NULL) {
		pr_err("%s: AFE is already closed\n", __func__);

		if (is_afe_proxy_port(port_id)) {
			if ((port_id == RT_PROXY_DAI_001_RX) ||
		    (port_id == RT_PROXY_DAI_002_TX))
			pcm_afe_instance[port_id & 0x1] = 0;
			    (port_id == RT_PROXY_DAI_002_TX) ||
			    (port_id == RT_PROXY_DAI_003_RX))
				pcm_afe_instance[port_id & 0x3] = 0;
			if ((port_id == RT_PROXY_DAI_002_RX) ||
		    (port_id == RT_PROXY_DAI_001_TX))
			proxy_afe_instance[port_id & 0x1] = 0;
		afe_close_done[port_id & 0x1] = true;
			    (port_id == RT_PROXY_DAI_001_TX) ||
		 	   (port_id == RT_PROXY_DAI_003_TX))
				proxy_afe_instance[port_id & 0x3] = 0;
			afe_close_done[port_id & 0x3] = true;
		}
		ret = -EINVAL;
		goto fail_cmd;
	}
	pr_debug("%s: port_id = 0x%x\n", __func__, port_id);
	if ((port_id == RT_PROXY_DAI_001_RX) ||
			(port_id == RT_PROXY_DAI_002_TX)) {
			(port_id == RT_PROXY_DAI_002_TX) ||
			(port_id == RT_PROXY_DAI_003_RX)) {
		pr_debug("%s: before decrementing pcm_afe_instance %d\n",
			__func__, pcm_afe_instance[port_id & 0x1]);
			__func__, pcm_afe_instance[port_id & 0x3]);
		port_id = VIRTUAL_ID_TO_PORTID(port_id);
		pcm_afe_instance[port_id & 0x1]--;
		if ((!(pcm_afe_instance[port_id & 0x1] == 0 &&
			proxy_afe_instance[port_id & 0x1] == 0)) ||
			afe_close_done[port_id & 0x1] == true)
		pcm_afe_instance[port_id & 0x3]--;
		if ((!(pcm_afe_instance[port_id & 0x3] == 0 &&
			proxy_afe_instance[port_id & 0x3] == 0)) ||
			afe_close_done[port_id & 0x3] == true)
			return 0;

		afe_close_done[port_id & 0x1] = true;
		afe_close_done[port_id & 0x3] = true;
	}

	if ((port_id == RT_PROXY_DAI_002_RX) ||
		(port_id == RT_PROXY_DAI_001_TX)) {
		(port_id == RT_PROXY_DAI_001_TX) ||
		(port_id == RT_PROXY_DAI_003_TX)) {
		pr_debug("%s: before decrementing proxy_afe_instance %d\n",
			__func__, proxy_afe_instance[port_id & 0x1]);
			__func__, proxy_afe_instance[port_id & 0x3]);
		port_id = VIRTUAL_ID_TO_PORTID(port_id);
		proxy_afe_instance[port_id & 0x1]--;
		if ((!(pcm_afe_instance[port_id & 0x1] == 0 &&
			proxy_afe_instance[port_id & 0x1] == 0)) ||
			afe_close_done[port_id & 0x1] == true)
		proxy_afe_instance[port_id & 0x3]--;
		if ((!(pcm_afe_instance[port_id & 0x3] == 0 &&
			proxy_afe_instance[port_id & 0x3] == 0)) ||
			afe_close_done[port_id & 0x3] == true)
			return 0;

		afe_close_done[port_id & 0x1] = true;
		afe_close_done[port_id & 0x3] = true;
	}

	if (port_id == RT_PROXY_PORT_002_RX && proxy_afe_started)
+1 −0
Original line number Diff line number Diff line
@@ -795,6 +795,7 @@ int q6audio_convert_virtual_to_portid(u16 port_id)
			port_id == RT_PROXY_DAI_001_TX ||
			port_id == RT_PROXY_DAI_002_RX ||
			port_id == RT_PROXY_DAI_002_TX ||
			port_id == RT_PROXY_DAI_003_RX ||
			port_id == RT_PROXY_DAI_003_TX)
			ret = VIRTUAL_ID_TO_PORTID(port_id);
		else
Loading