ASoC: msm: Add support for multiple instance.

Add support for concurrent voice and VoIP calls.

Signed-off-by: Neema Shetty <nshetty@codeaurora.org>
diff --git a/sound/soc/msm/msm-pcm-routing.c b/sound/soc/msm/msm-pcm-routing.c
index 097bd1c..4528f87 100644
--- a/sound/soc/msm/msm-pcm-routing.c
+++ b/sound/soc/msm/msm-pcm-routing.c
@@ -255,12 +255,22 @@
 	return 1;
 }
 
-static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set)
+static void msm_pcm_routing_process_voice(u16 reg, u16 val, u16 invert, int set)
 {
 
 	u32 port_map_id;
+	u16 session_id = 0;
 
-	pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
+	pr_debug("%s: reg %x val %x invert %x set %x\n",
+			 __func__, reg, val, invert, set);
+
+	if (invert == MSM_FRONTEND_DAI_CS_VOICE)
+		session_id = voc_get_session_id(VOICE_SESSION_NAME);
+	else
+		session_id = voc_get_session_id(VOIP_SESSION_NAME);
+
+	pr_debug("%s: FE DAI 0x%x session_id 0x%x\n",
+		 __func__, invert, session_id);
 
 	port_map_id = voice_mixers[reg].port_id;
 
@@ -270,26 +280,30 @@
 		clear_bit(val, &voice_mixers[reg].dai_sessions);
 
 	if (voice_mixers[reg].mixer_type == SNDRV_PCM_STREAM_PLAYBACK) {
-		voc_set_route_flag(RX_PATH, set);
+		voc_set_route_flag(session_id, RX_PATH, set);
 		if (set) {
-			voc_set_rxtx_port(bedai_port_map[port_map_id], DEV_RX);
+			voc_set_rxtx_port(session_id,
+					  bedai_port_map[port_map_id],
+					  DEV_RX);
 
-			if (voc_get_route_flag(RX_PATH) &&
-						voc_get_route_flag(TX_PATH))
-				voc_enable_cvp();
+			if (voc_get_route_flag(session_id, RX_PATH) &&
+			    voc_get_route_flag(session_id, TX_PATH))
+				voc_enable_cvp(session_id);
 		} else {
-			voc_disable_cvp();
+			voc_disable_cvp(session_id);
 		}
 	} else {
-		voc_set_route_flag(TX_PATH, set);
+		voc_set_route_flag(session_id, TX_PATH, set);
 		if (set) {
-			voc_set_rxtx_port(bedai_port_map[port_map_id], DEV_TX);
+			voc_set_rxtx_port(session_id,
+					  bedai_port_map[port_map_id],
+					  DEV_TX);
 
-			if (voc_get_route_flag(RX_PATH) &&
-						voc_get_route_flag(TX_PATH))
-				voc_enable_cvp();
+			if (voc_get_route_flag(session_id, RX_PATH) &&
+			    voc_get_route_flag(session_id, TX_PATH))
+				voc_enable_cvp(session_id);
 		} else {
-			voc_disable_cvp();
+			voc_disable_cvp(session_id);
 		}
 	}
 }
@@ -320,10 +334,12 @@
 		(struct soc_mixer_control *)kcontrol->private_value;
 
 	if (ucontrol->value.integer.value[0]) {
-		msm_pcm_routing_process_voice(mc->reg, mc->shift, 1);
+		msm_pcm_routing_process_voice(mc->reg, mc->shift,
+					      mc->invert, 1);
 		snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
 	} else {
-		msm_pcm_routing_process_voice(mc->reg, mc->shift, 0);
+		msm_pcm_routing_process_voice(mc->reg, mc->shift,
+					      mc->invert, 0);
 		snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
 	}
 
@@ -497,53 +513,53 @@
 
 static const struct snd_kcontrol_new pri_rx_voice_mixer_controls[] = {
 	SOC_SINGLE_EXT("CSVoice", VOICE_MIXER_PRI_I2S_RX,
-	MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_FRONTEND_DAI_CS_VOICE, 1, MSM_FRONTEND_DAI_CS_VOICE,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("Voip", VOICE_MIXER_PRI_I2S_RX ,
-	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_FRONTEND_DAI_VOIP, 1, MSM_FRONTEND_DAI_VOIP,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 };
 
 static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = {
 	SOC_SINGLE_EXT("CSVoice", VOICE_MIXER_SLIMBUS_0_RX,
-	MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_FRONTEND_DAI_CS_VOICE, 1, MSM_FRONTEND_DAI_CS_VOICE,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("Voip", VOICE_MIXER_SLIMBUS_0_RX ,
-	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_FRONTEND_DAI_VOIP, 1, MSM_FRONTEND_DAI_VOIP,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 };
 
 static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = {
 	SOC_SINGLE_EXT("CSVoice", VOICE_MIXER_INT_BT_SCO_RX,
-	MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_FRONTEND_DAI_CS_VOICE, 1, MSM_FRONTEND_DAI_CS_VOICE,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("Voip", VOICE_MIXER_INT_BT_SCO_RX ,
-	MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_FRONTEND_DAI_VOIP, 1, MSM_FRONTEND_DAI_VOIP,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 };
 
 static const struct snd_kcontrol_new tx_voice_mixer_controls[] = {
 	SOC_SINGLE_EXT("PRI_TX_Voice", VOICE_MIXER_PRI_I2S_TX,
-	MSM_BACKEND_DAI_PRI_I2S_TX, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_BACKEND_DAI_PRI_I2S_TX, 1, MSM_FRONTEND_DAI_CS_VOICE,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("SLIM_0_TX_Voice", VOICE_MIXER_SLIMBUS_0_TX,
-	MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, MSM_FRONTEND_DAI_CS_VOICE,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voice", VOICE_MIXER_INT_BT_SCO_TX,
-	MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, MSM_FRONTEND_DAI_CS_VOICE,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 };
 
 static const struct snd_kcontrol_new tx_voip_mixer_controls[] = {
 	SOC_SINGLE_EXT("PRI_TX_Voip", VOICE_MIXER_PRI_I2S_TX,
-	MSM_BACKEND_DAI_PRI_I2S_TX, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_BACKEND_DAI_PRI_I2S_TX, 1, MSM_FRONTEND_DAI_VOIP,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("SLIM_0_TX_Voip", VOICE_MIXER_SLIMBUS_0_TX,
-	MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, MSM_FRONTEND_DAI_VOIP,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 	SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voip", VOICE_MIXER_INT_BT_SCO_TX,
-	MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_voice_mixer,
-	msm_routing_put_voice_mixer),
+	MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, MSM_FRONTEND_DAI_VOIP,
+	msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
 };
 
 static const struct snd_kcontrol_new sbus_0_rx_port_mixer_controls[] = {