ASoC: msm: Add backend to support split A2DP
Add support to enable Bluetooth A2DP playback via DSP. CRs-Fixed: 978676 Change-Id: I02f2af671bed10e45b764af5cc9a0977a3d9e66e Signed-off-by: Ramlal Karra <rkarra@codeaurora.org> Signed-off-by: Ashish Jain <ashishj@codeaurora.org>
This commit is contained in:
parent
34b2bf6c8b
commit
249d0bd7a2
4 changed files with 103 additions and 1 deletions
|
@ -1596,6 +1596,7 @@ static int msm_dai_q6_hw_params(struct snd_pcm_substream *substream,
|
|||
break;
|
||||
case INT_BT_SCO_RX:
|
||||
case INT_BT_SCO_TX:
|
||||
case INT_BT_A2DP_RX:
|
||||
case INT_FM_RX:
|
||||
case INT_FM_TX:
|
||||
rc = msm_dai_q6_bt_fm_hw_params(params, dai, substream->stream);
|
||||
|
@ -2038,6 +2039,23 @@ static struct snd_soc_dai_driver msm_dai_q6_bt_sco_rx_dai = {
|
|||
.remove = msm_dai_q6_dai_remove,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver msm_dai_q6_bt_a2dp_rx_dai = {
|
||||
.playback = {
|
||||
.stream_name = "Internal BT-A2DP Playback",
|
||||
.aif_name = "INT_BT_A2DP_RX",
|
||||
.rates = SNDRV_PCM_RATE_48000,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.rate_max = 48000,
|
||||
.rate_min = 48000,
|
||||
},
|
||||
.ops = &msm_dai_q6_ops,
|
||||
.id = INT_BT_A2DP_RX,
|
||||
.probe = msm_dai_q6_dai_probe,
|
||||
.remove = msm_dai_q6_dai_remove,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver msm_dai_q6_bt_sco_tx_dai = {
|
||||
.capture = {
|
||||
.stream_name = "Internal BT-SCO Capture",
|
||||
|
@ -3713,6 +3731,10 @@ register_slim_capture:
|
|||
rc = snd_soc_register_component(&pdev->dev, &msm_dai_q6_component,
|
||||
&msm_dai_q6_bt_sco_tx_dai, 1);
|
||||
break;
|
||||
case INT_BT_A2DP_RX:
|
||||
rc = snd_soc_register_component(&pdev->dev,
|
||||
&msm_dai_q6_component, &msm_dai_q6_bt_a2dp_rx_dai, 1);
|
||||
break;
|
||||
case INT_FM_RX:
|
||||
rc = snd_soc_register_component(&pdev->dev, &msm_dai_q6_component,
|
||||
&msm_dai_q6_fm_rx_dai, 1);
|
||||
|
|
|
@ -422,6 +422,7 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
|
|||
LPASS_BE_QUAT_TDM_RX_7},
|
||||
{ AFE_PORT_ID_QUATERNARY_TDM_TX_7, 0, 0, 0, 0, 0, 0, 0,
|
||||
LPASS_BE_QUAT_TDM_TX_7},
|
||||
{ INT_BT_A2DP_RX, 0, 0, 0, 0, 0, 0, 0, LPASS_BE_INT_BT_A2DP_RX},
|
||||
};
|
||||
|
||||
/* Track ASM playback & capture sessions of DAI */
|
||||
|
@ -2731,6 +2732,57 @@ static const struct snd_kcontrol_new int_bt_sco_rx_mixer_controls[] = {
|
|||
msm_routing_put_audio_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new int_bt_a2dp_rx_mixer_controls[] = {
|
||||
SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia5", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia6", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia7", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia8", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia9", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia10", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia11", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia12", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia13", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia14", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia15", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_SINGLE_EXT("MultiMedia16", MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new int_fm_rx_mixer_controls[] = {
|
||||
SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_FM_RX,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
|
||||
|
@ -6496,6 +6548,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
|||
0, 0, 0 , 0),
|
||||
SND_SOC_DAPM_AIF_IN("INT_BT_SCO_TX", "Internal BT-SCO Capture",
|
||||
0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("INT_BT_A2DP_RX", "Internal BT-A2DP Playback",
|
||||
0, 0, 0 , 0),
|
||||
SND_SOC_DAPM_AIF_OUT("INT_FM_RX", "Internal FM Playback",
|
||||
0, 0, 0 , 0),
|
||||
SND_SOC_DAPM_AIF_IN("INT_FM_TX", "Internal FM Capture",
|
||||
|
@ -6874,6 +6928,9 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
|||
ARRAY_SIZE(tx_voicemmode2_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_A2DP_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
int_bt_a2dp_rx_mixer_controls,
|
||||
ARRAY_SIZE(int_bt_a2dp_rx_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("INTERNAL_FM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
|
||||
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,
|
||||
|
@ -7495,6 +7552,25 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia6", "MM_UL6"},
|
||||
{"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Audio Mixer"},
|
||||
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia5", "MM_DL5"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia6", "MM_DL6"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia7", "MM_DL7"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia8", "MM_DL8"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia9", "MM_DL9"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia10", "MM_DL10"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia11", "MM_DL11"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia12", "MM_DL12"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia13", "MM_DL13"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia14", "MM_DL14"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia15", "MM_DL15"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia16", "MM_DL16"},
|
||||
{"INTERNAL_A2DP_RX Audio Mixer", "MultiMedia6", "MM_UL6"},
|
||||
{"INT_BT_A2DP_RX", NULL, "INTERNAL_A2DP_RX Audio Mixer"},
|
||||
|
||||
{"INTERNAL_FM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
|
||||
{"INTERNAL_FM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
|
||||
{"INTERNAL_FM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
|
||||
|
@ -8333,6 +8409,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
|||
{"BE_OUT", NULL, "SEC_MI2S_RX_SD1"},
|
||||
{"BE_OUT", NULL, "PRI_MI2S_RX"},
|
||||
{"BE_OUT", NULL, "INT_BT_SCO_RX"},
|
||||
{"BE_OUT", NULL, "INT_BT_A2DP_RX"},
|
||||
{"BE_OUT", NULL, "INT_FM_RX"},
|
||||
{"BE_OUT", NULL, "PCM_RX"},
|
||||
{"BE_OUT", NULL, "SLIMBUS_3_RX"},
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2012-2016, 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
|
||||
|
@ -20,6 +20,7 @@
|
|||
#define LPASS_BE_HDMI "HDMI"
|
||||
#define LPASS_BE_INT_BT_SCO_RX "INT_BT_SCO_RX"
|
||||
#define LPASS_BE_INT_BT_SCO_TX "INT_BT_SCO_TX"
|
||||
#define LPASS_BE_INT_BT_A2DP_RX "INT_BT_A2DP_RX"
|
||||
#define LPASS_BE_INT_FM_RX "INT_FM_RX"
|
||||
#define LPASS_BE_INT_FM_TX "INT_FM_TX"
|
||||
#define LPASS_BE_AFE_PCM_RX "RT_PROXY_DAI_001_RX"
|
||||
|
@ -294,6 +295,7 @@ enum {
|
|||
MSM_BACKEND_DAI_QUAT_TDM_TX_6,
|
||||
MSM_BACKEND_DAI_QUAT_TDM_RX_7,
|
||||
MSM_BACKEND_DAI_QUAT_TDM_TX_7,
|
||||
MSM_BACKEND_DAI_INT_BT_A2DP_RX,
|
||||
MSM_BACKEND_DAI_MAX,
|
||||
};
|
||||
|
||||
|
|
|
@ -2706,6 +2706,7 @@ int afe_port_start(u16 port_id, union afe_port_config *afe_config,
|
|||
cfg_type = AFE_PARAM_ID_RT_PROXY_CONFIG;
|
||||
break;
|
||||
case INT_BT_SCO_RX:
|
||||
case INT_BT_A2DP_RX:
|
||||
case INT_BT_SCO_TX:
|
||||
case INT_FM_RX:
|
||||
case INT_FM_TX:
|
||||
|
|
Loading…
Add table
Reference in a new issue