mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-11-01 02:21:16 +00:00
ASoC: msm: Add support for SGLTE feature
Impact: Add SGLTE feature support. Change: - Add changes for SGLTE feature in machine, cpu, routing, platform and proxy voice drivers. Change-Id: Ie5006fbf40b2c3a0c772912303adbf7775c33382 Signed-off-by: Satish Babu Patakokila <sbpata@codeaurora.org>
This commit is contained in:
parent
33482cf925
commit
3d17b32d43
8 changed files with 231 additions and 13 deletions
|
@ -426,6 +426,30 @@ static struct snd_soc_dai_driver msm_fe_dais[] = {
|
|||
.ops = &msm_fe_dai_ops,
|
||||
.name = "SEC_I2S_RX_HOSTLESS",
|
||||
},
|
||||
{
|
||||
.playback = {
|
||||
.stream_name = "SGLTE Playback",
|
||||
.aif_name = "SGLTE_DL",
|
||||
.rates = SNDRV_PCM_RATE_8000_48000,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.rate_min = 8000,
|
||||
.rate_max = 48000,
|
||||
},
|
||||
.capture = {
|
||||
.stream_name = "SGLTE Capture",
|
||||
.aif_name = "SGLTE_UL",
|
||||
.rates = SNDRV_PCM_RATE_8000_48000,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.rate_min = 8000,
|
||||
.rate_max = 48000,
|
||||
},
|
||||
.ops = &msm_fe_dai_ops,
|
||||
.name = "SGLTE",
|
||||
},
|
||||
};
|
||||
|
||||
static int msm_fe_dai_dev_probe(struct platform_device *pdev)
|
||||
|
|
|
@ -505,6 +505,8 @@ static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set)
|
|||
session_id = voc_get_session_id(VOICE_SESSION_NAME);
|
||||
else if (val == MSM_FRONTEND_DAI_VOLTE)
|
||||
session_id = voc_get_session_id(VOLTE_SESSION_NAME);
|
||||
else if (val == MSM_FRONTEND_DAI_SGLTE)
|
||||
session_id = voc_get_session_id(SGLTE_SESSION_NAME);
|
||||
else
|
||||
session_id = voc_get_session_id(VOIP_SESSION_NAME);
|
||||
|
||||
|
@ -1303,6 +1305,9 @@ static const struct snd_kcontrol_new pri_rx_voice_mixer_controls[] = {
|
|||
SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_PRI_I2S_RX,
|
||||
MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("SGLTE", MSM_BACKEND_DAI_PRI_I2S_RX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new sec_i2s_rx_voice_mixer_controls[] = {
|
||||
|
@ -1315,6 +1320,9 @@ static const struct snd_kcontrol_new sec_i2s_rx_voice_mixer_controls[] = {
|
|||
SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_SEC_I2S_RX,
|
||||
MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("SGLTE", MSM_BACKEND_DAI_SEC_I2S_RX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = {
|
||||
|
@ -1327,6 +1335,9 @@ static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = {
|
|||
SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
|
||||
MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("SGLTE", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = {
|
||||
|
@ -1342,6 +1353,9 @@ static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = {
|
|||
SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_INT_BT_SCO_RX ,
|
||||
MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("SGLTE", MSM_BACKEND_DAI_INT_BT_SCO_RX ,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new mi2s_rx_voice_mixer_controls[] = {
|
||||
|
@ -1354,6 +1368,9 @@ static const struct snd_kcontrol_new mi2s_rx_voice_mixer_controls[] = {
|
|||
SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_MI2S_RX,
|
||||
MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
|
||||
msm_routing_put_voice_stub_mixer),
|
||||
SOC_SINGLE_EXT("SGLTE", MSM_BACKEND_DAI_MI2S_RX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new afe_pcm_rx_voice_mixer_controls[] = {
|
||||
|
@ -1369,6 +1386,9 @@ static const struct snd_kcontrol_new afe_pcm_rx_voice_mixer_controls[] = {
|
|||
SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_AFE_PCM_RX,
|
||||
MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("SGLTE", MSM_BACKEND_DAI_AFE_PCM_RX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new aux_pcm_rx_voice_mixer_controls[] = {
|
||||
|
@ -1384,6 +1404,9 @@ static const struct snd_kcontrol_new aux_pcm_rx_voice_mixer_controls[] = {
|
|||
SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_AUXPCM_RX,
|
||||
MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("SGLTE", MSM_BACKEND_DAI_AUXPCM_RX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new sec_aux_pcm_rx_voice_mixer_controls[] = {
|
||||
|
@ -1396,6 +1419,9 @@ static const struct snd_kcontrol_new sec_aux_pcm_rx_voice_mixer_controls[] = {
|
|||
SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_SEC_AUXPCM_RX,
|
||||
MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("SGLTE", MSM_BACKEND_DAI_SEC_AUXPCM_RX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new hdmi_rx_voice_mixer_controls[] = {
|
||||
|
@ -1411,6 +1437,9 @@ static const struct snd_kcontrol_new hdmi_rx_voice_mixer_controls[] = {
|
|||
SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_HDMI_RX,
|
||||
MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
|
||||
msm_routing_put_voice_stub_mixer),
|
||||
SOC_SINGLE_EXT("SGLTE", MSM_BACKEND_DAI_HDMI_RX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new stub_rx_mixer_controls[] = {
|
||||
|
@ -1476,6 +1505,29 @@ static const struct snd_kcontrol_new tx_volte_mixer_controls[] = {
|
|||
msm_routing_put_voice_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new tx_sglte_mixer_controls[] = {
|
||||
SOC_SINGLE_EXT("PRI_TX_SGLTE", MSM_BACKEND_DAI_PRI_I2S_TX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("MI2S_TX_SGLTE", MSM_BACKEND_DAI_MI2S_TX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("SLIM_0_TX_SGLTE", MSM_BACKEND_DAI_SLIMBUS_0_TX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_SGLTE",
|
||||
MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_SGLTE, 1, 0,
|
||||
msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("AFE_PCM_TX_SGLTE", MSM_BACKEND_DAI_AFE_PCM_TX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("AUX_PCM_TX_SGLTE", MSM_BACKEND_DAI_AUXPCM_TX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, msm_routing_get_voice_mixer,
|
||||
msm_routing_put_voice_mixer),
|
||||
SOC_SINGLE_EXT("SEC_AUX_PCM_TX_SGLTE", MSM_BACKEND_DAI_SEC_AUXPCM_TX,
|
||||
MSM_FRONTEND_DAI_SGLTE, 1, 0, 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", MSM_BACKEND_DAI_PRI_I2S_TX,
|
||||
MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
|
||||
|
@ -1878,6 +1930,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
|||
SND_SOC_DAPM_AIF_OUT("CS-VOICE_UL1", "CS-VOICE Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_IN("VoLTE_DL", "VoLTE Playback", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("VoLTE_UL", "VoLTE Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_IN("SGLTE_DL", "SGLTE Playback", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("SGLTE_UL", "SGLTE Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("VOIP_UL", "VoIP Capture", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_IN("SLIM0_DL_HL", "SLIMBUS0_HOSTLESS Playback",
|
||||
0, 0, 0, 0),
|
||||
|
@ -2025,6 +2079,9 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
|||
SND_SOC_DAPM_MIXER("VoLTE_Tx Mixer",
|
||||
SND_SOC_NOPM, 0, 0, tx_volte_mixer_controls,
|
||||
ARRAY_SIZE(tx_volte_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("SGLTE_Tx Mixer",
|
||||
SND_SOC_NOPM, 0, 0, tx_sglte_mixer_controls,
|
||||
ARRAY_SIZE(tx_sglte_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
int_bt_sco_rx_mixer_controls, ARRAY_SIZE(int_bt_sco_rx_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("INTERNAL_FM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
|
@ -2175,41 +2232,49 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
|
||||
{"PRI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
|
||||
{"PRI_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
|
||||
{"PRI_RX_Voice Mixer", "SGLTE", "SGLTE_DL"},
|
||||
{"PRI_RX_Voice Mixer", "Voip", "VOIP_DL"},
|
||||
{"PRI_I2S_RX", NULL, "PRI_RX_Voice Mixer"},
|
||||
|
||||
{"SEC_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
|
||||
{"SEC_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
|
||||
{"SEC_RX_Voice Mixer", "SGLTE", "SGLTE_DL"},
|
||||
{"SEC_RX_Voice Mixer", "Voip", "VOIP_DL"},
|
||||
{"SEC_I2S_RX", NULL, "SEC_RX_Voice Mixer"},
|
||||
|
||||
{"SLIM_0_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
|
||||
{"SLIM_0_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
|
||||
{"SLIM_0_RX_Voice Mixer", "SGLTE", "SGLTE_DL"},
|
||||
{"SLIM_0_RX_Voice Mixer", "Voip", "VOIP_DL"},
|
||||
{"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"},
|
||||
|
||||
{"INTERNAL_BT_SCO_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
|
||||
{"INTERNAL_BT_SCO_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
|
||||
{"INTERNAL_BT_SCO_RX_Voice Mixer", "SGLTE", "SGLTE_DL"},
|
||||
{"INTERNAL_BT_SCO_RX_Voice Mixer", "Voip", "VOIP_DL"},
|
||||
{"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX_Voice Mixer"},
|
||||
|
||||
{"AFE_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
|
||||
{"AFE_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
|
||||
{"AFE_PCM_RX_Voice Mixer", "SGLTE", "SGLTE_DL"},
|
||||
{"AFE_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
|
||||
{"PCM_RX", NULL, "AFE_PCM_RX_Voice Mixer"},
|
||||
|
||||
{"AUX_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
|
||||
{"AUX_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
|
||||
{"AUX_PCM_RX_Voice Mixer", "SGLTE", "SGLTE_DL"},
|
||||
{"AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
|
||||
{"AUX_PCM_RX", NULL, "AUX_PCM_RX_Voice Mixer"},
|
||||
|
||||
{"SEC_AUX_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
|
||||
{"SEC_AUX_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
|
||||
{"SEC_AUX_PCM_RX_Voice Mixer", "SGLTE", "SGLTE_DL"},
|
||||
{"SEC_AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
|
||||
{"SEC_AUX_PCM_RX", NULL, "SEC_AUX_PCM_RX_Voice Mixer"},
|
||||
|
||||
{"HDMI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
|
||||
{"HDMI_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
|
||||
{"HDMI_RX_Voice Mixer", "SGLTE", "SGLTE_DL"},
|
||||
{"HDMI_RX_Voice Mixer", "Voip", "VOIP_DL"},
|
||||
{"HDMI", NULL, "HDMI_RX_Voice Mixer"},
|
||||
{"HDMI", NULL, "HDMI_DL_HL"},
|
||||
|
@ -2229,6 +2294,14 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"VoLTE_Tx Mixer", "AUX_PCM_TX_VoLTE", "AUX_PCM_TX"},
|
||||
{"VoLTE_Tx Mixer", "SEC_AUX_PCM_TX_VoLTE", "SEC_AUX_PCM_TX"},
|
||||
{"VoLTE_UL", NULL, "VoLTE_Tx Mixer"},
|
||||
{"SGLTE_Tx Mixer", "PRI_TX_SGLTE", "PRI_I2S_TX"},
|
||||
{"SGLTE_Tx Mixer", "MI2S_TX_SGLTE", "MI2S_TX"},
|
||||
{"SGLTE_Tx Mixer", "SLIM_0_TX_SGLTE", "SLIMBUS_0_TX"},
|
||||
{"SGLTE_Tx Mixer", "INTERNAL_BT_SCO_TX_SGLTE", "INT_BT_SCO_TX"},
|
||||
{"SGLTE_Tx Mixer", "AFE_PCM_TX_SGLTE", "PCM_TX"},
|
||||
{"SGLTE_Tx Mixer", "AUX_PCM_TX_SGLTE", "AUX_PCM_TX"},
|
||||
{"SGLTE_Tx Mixer", "SEC_AUX_PCM_TX_SGLTE", "SEC_AUX_PCM_TX"},
|
||||
{"SGLTE_UL", NULL, "SGLTE_Tx Mixer"},
|
||||
{"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"},
|
||||
{"Voip_Tx Mixer", "MI2S_TX_Voip", "MI2S_TX"},
|
||||
{"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"},
|
||||
|
|
|
@ -66,6 +66,7 @@ enum {
|
|||
MSM_FRONTEND_DAI_AFE_TX,
|
||||
MSM_FRONTEND_DAI_VOICE_STUB,
|
||||
MSM_FRONTEND_DAI_VOLTE,
|
||||
MSM_FRONTEND_DAI_SGLTE,
|
||||
MSM_FRONTEND_DAI_MAX,
|
||||
};
|
||||
|
||||
|
|
|
@ -59,6 +59,14 @@ static int is_volte(struct msm_voice *pvolte)
|
|||
return false;
|
||||
}
|
||||
|
||||
static int is_sglte(struct msm_voice *psglte)
|
||||
{
|
||||
if (psglte == &voice_info[SGLTE_SESSION_INDEX])
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
static int msm_pcm_playback_prepare(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
|
@ -93,6 +101,10 @@ static int msm_pcm_open(struct snd_pcm_substream *substream)
|
|||
voice = &voice_info[VOLTE_SESSION_INDEX];
|
||||
pr_debug("%s: Open VoLTE Substream Id=%s\n",
|
||||
__func__, substream->pcm->id);
|
||||
} else if (!strncmp("SGLTE", substream->pcm->id, 5)) {
|
||||
voice = &voice_info[SGLTE_SESSION_INDEX];
|
||||
pr_debug("%s: Open SGLTE Substream Id=%s\n",
|
||||
__func__, substream->pcm->id);
|
||||
} else {
|
||||
voice = &voice_info[VOICE_SESSION_INDEX];
|
||||
pr_debug("%s: Open VOICE Substream Id=%s\n",
|
||||
|
@ -162,6 +174,8 @@ static int msm_pcm_close(struct snd_pcm_substream *substream)
|
|||
pr_debug("end voice call\n");
|
||||
if (is_volte(prtd))
|
||||
session_id = voc_get_session_id(VOLTE_SESSION_NAME);
|
||||
else if (is_sglte(prtd))
|
||||
session_id = voc_get_session_id(SGLTE_SESSION_NAME);
|
||||
else
|
||||
session_id = voc_get_session_id(VOICE_SESSION_NAME);
|
||||
voc_end_voice_call(session_id);
|
||||
|
@ -187,6 +201,8 @@ static int msm_pcm_prepare(struct snd_pcm_substream *substream)
|
|||
if (prtd->playback_start && prtd->capture_start) {
|
||||
if (is_volte(prtd))
|
||||
session_id = voc_get_session_id(VOLTE_SESSION_NAME);
|
||||
else if (is_sglte(prtd))
|
||||
session_id = voc_get_session_id(SGLTE_SESSION_NAME);
|
||||
else
|
||||
session_id = voc_get_session_id(VOICE_SESSION_NAME);
|
||||
voc_start_voice_call(session_id);
|
||||
|
@ -217,6 +233,8 @@ static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|||
pr_debug("%s: cmd = %d\n", __func__, cmd);
|
||||
if (is_volte(prtd))
|
||||
session_id = voc_get_session_id(VOLTE_SESSION_NAME);
|
||||
else if (is_sglte(prtd))
|
||||
session_id = voc_get_session_id(SGLTE_SESSION_NAME);
|
||||
else
|
||||
session_id = voc_get_session_id(VOICE_SESSION_NAME);
|
||||
|
||||
|
@ -290,6 +308,23 @@ static int msm_volte_volume_put(struct snd_kcontrol *kcontrol,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int msm_sglte_volume_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
ucontrol->value.integer.value[0] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_sglte_volume_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
int volume = ucontrol->value.integer.value[0];
|
||||
pr_debug("%s: volume: %d\n", __func__, volume);
|
||||
voc_set_rx_vol_index(voc_get_session_id(SGLTE_SESSION_NAME),
|
||||
RX_PATH, volume);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_voice_mute_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
|
@ -328,6 +363,25 @@ static int msm_volte_mute_put(struct snd_kcontrol *kcontrol,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int msm_sglte_mute_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
ucontrol->value.integer.value[0] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_sglte_mute_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
int mute = ucontrol->value.integer.value[0];
|
||||
|
||||
pr_debug("%s: mute=%d\n", __func__, mute);
|
||||
|
||||
voc_set_tx_mute(voc_get_session_id(SGLTE_SESSION_NAME), TX_PATH, mute);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_voice_rx_device_mute_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
|
@ -368,6 +422,26 @@ static int msm_volte_rx_device_mute_put(struct snd_kcontrol *kcontrol,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int msm_sglte_rx_device_mute_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
ucontrol->value.integer.value[0] =
|
||||
voc_get_rx_device_mute(voc_get_session_id(SGLTE_SESSION_NAME));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_sglte_rx_device_mute_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
int mute = ucontrol->value.integer.value[0];
|
||||
|
||||
pr_debug("%s: mute=%d\n", __func__, mute);
|
||||
|
||||
voc_set_rx_device_mute(voc_get_session_id(SGLTE_SESSION_NAME), mute);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char const *tty_mode[] = {"OFF", "HCO", "VCO", "FULL"};
|
||||
static const struct soc_enum msm_tty_mode_enum[] = {
|
||||
SOC_ENUM_SINGLE_EXT(4, tty_mode),
|
||||
|
@ -481,6 +555,13 @@ static struct snd_kcontrol_new msm_voice_controls[] = {
|
|||
msm_volte_mute_get, msm_volte_mute_put),
|
||||
SOC_SINGLE_EXT("VoLTE Rx Volume", SND_SOC_NOPM, 0, 5, 0,
|
||||
msm_volte_volume_get, msm_volte_volume_put),
|
||||
SOC_SINGLE_EXT("SGLTE Rx Device Mute", SND_SOC_NOPM, 0, 1, 0,
|
||||
msm_sglte_rx_device_mute_get,
|
||||
msm_sglte_rx_device_mute_put),
|
||||
SOC_SINGLE_EXT("SGLTE Tx Mute", SND_SOC_NOPM, 0, 1, 0,
|
||||
msm_sglte_mute_get, msm_sglte_mute_put),
|
||||
SOC_SINGLE_EXT("SGLTE Rx Volume", SND_SOC_NOPM, 0, 5, 0,
|
||||
msm_sglte_volume_get, msm_sglte_volume_put),
|
||||
};
|
||||
|
||||
static struct snd_pcm_ops msm_pcm_ops = {
|
||||
|
@ -543,6 +624,7 @@ static int __init msm_soc_platform_init(void)
|
|||
memset(&voice_info, 0, sizeof(voice_info));
|
||||
mutex_init(&voice_info[VOICE_SESSION_INDEX].lock);
|
||||
mutex_init(&voice_info[VOLTE_SESSION_INDEX].lock);
|
||||
mutex_init(&voice_info[SGLTE_SESSION_INDEX].lock);
|
||||
|
||||
return platform_driver_register(&msm_pcm_driver);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2011, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2011,2012 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -16,6 +16,7 @@
|
|||
enum {
|
||||
VOICE_SESSION_INDEX,
|
||||
VOLTE_SESSION_INDEX,
|
||||
SGLTE_SESSION_INDEX,
|
||||
VOICE_SESSION_INDEX_MAX,
|
||||
};
|
||||
|
||||
|
|
|
@ -1321,6 +1321,21 @@ static struct snd_soc_dai_link msm8960_dai_common[] = {
|
|||
.codec_name = "snd-soc-dummy",
|
||||
.be_id = MSM_FRONTEND_DAI_VOLTE,
|
||||
},
|
||||
{
|
||||
.name = "SGLTE",
|
||||
.stream_name = "SGLTE",
|
||||
.cpu_dai_name = "SGLTE",
|
||||
.platform_name = "msm-pcm-voice",
|
||||
.dynamic = 1,
|
||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
|
||||
SND_SOC_DPCM_TRIGGER_POST},
|
||||
.no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
|
||||
.ignore_suspend = 1,
|
||||
.ignore_pmdown_time = 1,/* this dainlink has playback support */
|
||||
.codec_dai_name = "snd-soc-dummy-dai",
|
||||
.codec_name = "snd-soc-dummy",
|
||||
.be_id = MSM_FRONTEND_DAI_SGLTE,
|
||||
},
|
||||
/* Backend BT/FM DAI Links */
|
||||
{
|
||||
.name = LPASS_BE_INT_BT_SCO_RX,
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#define VOC_PATH_PASSIVE 0
|
||||
#define VOC_PATH_FULL 1
|
||||
#define VOC_PATH_VOLTE_PASSIVE 2
|
||||
#define VOC_PATH_SGLTE_PASSIVE 3
|
||||
|
||||
/* CVP CAL Size: 245760 = 240 * 1024 */
|
||||
#define CVP_CAL_SIZE 245760
|
||||
|
@ -149,6 +150,9 @@ uint16_t voc_get_session_id(char *name)
|
|||
else if (!strncmp(name, "VoLTE session", 13))
|
||||
session_id =
|
||||
common.voice[VOC_PATH_VOLTE_PASSIVE].session_id;
|
||||
else if (!strncmp(name, "SGLTE session", 13))
|
||||
session_id =
|
||||
common.voice[VOC_PATH_SGLTE_PASSIVE].session_id;
|
||||
else
|
||||
session_id = common.voice[VOC_PATH_FULL].session_id;
|
||||
|
||||
|
@ -189,6 +193,11 @@ static bool is_volte_session(u16 session_id)
|
|||
return (session_id == common.voice[VOC_PATH_VOLTE_PASSIVE].session_id);
|
||||
}
|
||||
|
||||
static bool is_sglte_session(u16 session_id)
|
||||
{
|
||||
return (session_id == common.voice[VOC_PATH_SGLTE_PASSIVE].session_id);
|
||||
}
|
||||
|
||||
static int voice_apr_register(void)
|
||||
{
|
||||
pr_debug("%s\n", __func__);
|
||||
|
@ -275,8 +284,10 @@ static int voice_send_dual_control_cmd(struct voice_data *v)
|
|||
pr_err("%s: apr_mvm is NULL.\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
pr_debug("%s: VoLTE command to MVM\n", __func__);
|
||||
if (is_volte_session(v->session_id)) {
|
||||
pr_debug("%s: VoLTE/SGLTE command to MVM\n", __func__);
|
||||
if (is_volte_session(v->session_id) ||
|
||||
is_sglte_session(v->session_id)) {
|
||||
|
||||
mvm_handle = voice_get_mvm_handle(v);
|
||||
mvm_voice_ctl_cmd.hdr.hdr_field = APR_HDR_FIELD(
|
||||
APR_MSG_TYPE_SEQ_CMD,
|
||||
|
@ -350,7 +361,8 @@ static int voice_create_mvm_cvs_session(struct voice_data *v)
|
|||
|
||||
if (!mvm_handle) {
|
||||
if (is_voice_session(v->session_id) ||
|
||||
is_volte_session(v->session_id)) {
|
||||
is_volte_session(v->session_id) ||
|
||||
is_sglte_session(v->session_id)) {
|
||||
mvm_session_cmd.hdr.hdr_field = APR_HDR_FIELD(
|
||||
APR_MSG_TYPE_SEQ_CMD,
|
||||
APR_HDR_LEN(APR_HDR_SIZE),
|
||||
|
@ -369,11 +381,15 @@ static int voice_create_mvm_cvs_session(struct voice_data *v)
|
|||
if (is_volte_session(v->session_id)) {
|
||||
strlcpy(mvm_session_cmd.mvm_session.name,
|
||||
"default volte voice",
|
||||
sizeof(mvm_session_cmd.mvm_session.name) - 1);
|
||||
} else if (is_sglte_session(v->session_id)) {
|
||||
strlcpy(mvm_session_cmd.mvm_session.name,
|
||||
"default modem voice2",
|
||||
sizeof(mvm_session_cmd.mvm_session.name));
|
||||
} else {
|
||||
strlcpy(mvm_session_cmd.mvm_session.name,
|
||||
strlcpy(mvm_session_cmd.mvm_session.name,
|
||||
"default modem voice",
|
||||
sizeof(mvm_session_cmd.mvm_session.name));
|
||||
sizeof(mvm_session_cmd.mvm_session.name) - 1);
|
||||
}
|
||||
|
||||
v->mvm_state = CMD_STATUS_FAIL;
|
||||
|
@ -432,7 +448,8 @@ static int voice_create_mvm_cvs_session(struct voice_data *v)
|
|||
/* send cmd to create cvs session */
|
||||
if (!cvs_handle) {
|
||||
if (is_voice_session(v->session_id) ||
|
||||
is_volte_session(v->session_id)) {
|
||||
is_volte_session(v->session_id) ||
|
||||
is_sglte_session(v->session_id)) {
|
||||
pr_debug("%s: creating CVS passive session\n",
|
||||
__func__);
|
||||
|
||||
|
@ -452,11 +469,15 @@ static int voice_create_mvm_cvs_session(struct voice_data *v)
|
|||
if (is_volte_session(v->session_id)) {
|
||||
strlcpy(mvm_session_cmd.mvm_session.name,
|
||||
"default volte voice",
|
||||
sizeof(mvm_session_cmd.mvm_session.name));
|
||||
} else {
|
||||
strlcpy(cvs_session_cmd.cvs_session.name,
|
||||
"default modem voice",
|
||||
sizeof(mvm_session_cmd.mvm_session.name) - 1);
|
||||
} else if (is_sglte_session(v->session_id)) {
|
||||
strlcpy(cvs_session_cmd.cvs_session.name,
|
||||
"default modem voice2",
|
||||
sizeof(cvs_session_cmd.cvs_session.name));
|
||||
} else {
|
||||
strlcpy(cvs_session_cmd.cvs_session.name,
|
||||
"default modem voice",
|
||||
sizeof(cvs_session_cmd.cvs_session.name) - 1);
|
||||
}
|
||||
v->cvs_state = CMD_STATUS_FAIL;
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
#include <linux/ion.h>
|
||||
|
||||
#define MAX_VOC_PKT_SIZE 642
|
||||
#define SESSION_NAME_LEN 20
|
||||
#define SESSION_NAME_LEN 21
|
||||
|
||||
#define VOC_REC_UPLINK 0x00
|
||||
#define VOC_REC_DOWNLINK 0x01
|
||||
|
@ -918,7 +918,7 @@ struct cal_mem {
|
|||
void *buf;
|
||||
};
|
||||
|
||||
#define MAX_VOC_SESSIONS 3
|
||||
#define MAX_VOC_SESSIONS 4
|
||||
#define SESSION_ID_BASE 0xFFF0
|
||||
|
||||
struct common_data {
|
||||
|
@ -990,6 +990,7 @@ uint8_t voc_get_route_flag(uint16_t session_id, uint8_t path_dir);
|
|||
#define VOICE_SESSION_NAME "Voice session"
|
||||
#define VOIP_SESSION_NAME "VoIP session"
|
||||
#define VOLTE_SESSION_NAME "VoLTE session"
|
||||
#define SGLTE_SESSION_NAME "SGLTE session"
|
||||
uint16_t voc_get_session_id(char *name);
|
||||
|
||||
int voc_start_playback(uint32_t set);
|
||||
|
|
Loading…
Reference in a new issue