ASoC: Add support for senary capture TX dailink

Add support for senary mi2s interface in routing and cpu
dailinks. In 8952, senary capture is used to provide
VI sense data from WSA to DSP via codec DMIC path.

Change-Id: I2d9536bc1d833f4293ef5d44d16feb49080081b0
Signed-off-by: Laxminath Kasam <lkasam@codeaurora.org>
This commit is contained in:
Laxminath Kasam 2015-04-16 17:59:03 +05:30
parent d765f15445
commit be294c4b0a
8 changed files with 73 additions and 1 deletions

View File

@ -863,6 +863,11 @@ struct adm_cmd_connect_afe_port_v5 {
#define AFE_PORT_ID_SECONDARY_MI2S_RX_SD1 0x1010
#define AFE_PORT_ID_QUINARY_MI2S_RX 0x1016
#define AFE_PORT_ID_QUINARY_MI2S_TX 0x1017
/* ID of the senary MI2S Rx port. */
#define AFE_PORT_ID_SENARY_MI2S_RX 0x1018
/* ID of the senary MI2S Tx port. */
#define AFE_PORT_ID_SENARY_MI2S_TX 0x1019
#define AFE_PORT_ID_SPDIF_RX 0x5000
#define AFE_PORT_ID_RT_PROXY_PORT_001_RX 0x2000
#define AFE_PORT_ID_RT_PROXY_PORT_001_TX 0x2001

View File

@ -27,6 +27,7 @@
#define MSM_QUAT_MI2S 3
#define MSM_SEC_MI2S_SD1 4
#define MSM_QUIN_MI2S 5
#define MSM_SENARY_MI2S 6
struct msm_dai_auxpcm_config {
u16 mode;

View File

@ -93,6 +93,7 @@ enum {
IDX_AFE_PORT_ID_SECONDARY_MI2S_RX_SD1,
IDX_AFE_PORT_ID_QUINARY_MI2S_RX = 51,
IDX_AFE_PORT_ID_QUINARY_MI2S_TX = 52,
IDX_AFE_PORT_ID_SENARY_MI2S_TX = 53,
AFE_MAX_PORTS
};

View File

@ -2213,6 +2213,9 @@ static const struct snd_kcontrol_new mi2s_config_controls[] = {
SOC_ENUM_EXT("QUIN MI2S TX Format", mi2s_config_enum[0],
msm_dai_q6_mi2s_format_get,
msm_dai_q6_mi2s_format_put),
SOC_ENUM_EXT("SENARY MI2S TX Format", mi2s_config_enum[0],
msm_dai_q6_mi2s_format_get,
msm_dai_q6_mi2s_format_put),
};
static int msm_dai_q6_dai_mi2s_probe(struct snd_soc_dai *dai)
@ -2264,6 +2267,8 @@ static int msm_dai_q6_dai_mi2s_probe(struct snd_soc_dai *dai)
ctrl = &mi2s_config_controls[8];
if (dai->id == MSM_QUIN_MI2S)
ctrl = &mi2s_config_controls[9];
if (dai->id == MSM_SENARY_MI2S)
ctrl = &mi2s_config_controls[10];
}
if (ctrl) {
@ -2370,6 +2375,9 @@ static int msm_mi2s_get_port_id(u32 mi2s_id, int stream, u16 *port_id)
case MSM_QUIN_MI2S:
*port_id = AFE_PORT_ID_QUINARY_MI2S_TX;
break;
case MSM_SENARY_MI2S:
*port_id = AFE_PORT_ID_SENARY_MI2S_TX;
break;
default:
pr_err("%s: capture err id 0x%x\n", __func__, mi2s_id);
ret = -1;
@ -2787,6 +2795,21 @@ static struct snd_soc_dai_driver msm_dai_q6_mi2s_dai[] = {
.probe = msm_dai_q6_dai_mi2s_probe,
.remove = msm_dai_q6_dai_mi2s_remove,
},
{
.capture = {
.stream_name = "Senary_mi2s Capture",
.aif_name = "SENARY_TX",
.rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_8000 |
SNDRV_PCM_RATE_16000,
.formats = SNDRV_PCM_FMTBIT_S16_LE,
.rate_min = 8000,
.rate_max = 48000,
},
.ops = &msm_dai_q6_mi2s_ops,
.id = MSM_SENARY_MI2S,
.probe = msm_dai_q6_dai_mi2s_probe,
.remove = msm_dai_q6_dai_mi2s_remove,
},
};
@ -2954,7 +2977,7 @@ static int msm_dai_q6_mi2s_dev_probe(struct platform_device *pdev)
dev_dbg(&pdev->dev, "dev name %s dev id 0x%x\n", dev_name(&pdev->dev),
mi2s_intf);
if ((mi2s_intf < MSM_PRIM_MI2S || mi2s_intf > MSM_QUIN_MI2S)
if ((mi2s_intf < MSM_PRIM_MI2S || mi2s_intf > MSM_SENARY_MI2S)
|| (mi2s_intf >= ARRAY_SIZE(msm_dai_q6_mi2s_dai))) {
dev_err(&pdev->dev,
"%s: Invalid MI2S ID %u from Device Tree\n",

View File

@ -276,6 +276,8 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
LPASS_BE_QUIN_MI2S_RX},
{ AFE_PORT_ID_QUINARY_MI2S_TX, 0, 0, 0, 0, 0, 0, 0,
LPASS_BE_QUIN_MI2S_TX},
{ AFE_PORT_ID_SENARY_MI2S_TX, 0, 0, 0, 0, 0, 0, 0,
LPASS_BE_SENARY_MI2S_TX},
};
@ -4606,6 +4608,10 @@ static const char * const slim0_rx_vi_fb_tx_rch_mux_text[] = {
"ZERO", "SLIM4_TX"
};
static const char * const mi2s_rx_vi_fb_tx_mux_text[] = {
"ZERO", "SENARY_TX"
};
static const int const slim0_rx_vi_fb_tx_lch_value[] = {
MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SLIMBUS_4_TX
};
@ -4614,6 +4620,10 @@ static const int const slim0_rx_vi_fb_tx_rch_value[] = {
MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SLIMBUS_4_TX
};
static const int const mi2s_rx_vi_fb_tx_value[] = {
MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SENARY_MI2S_TX
};
static const struct soc_enum slim0_rx_vi_fb_lch_mux_enum =
SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_SLIMBUS_0_RX, 0, 0,
ARRAY_SIZE(slim0_rx_vi_fb_tx_lch_mux_text),
@ -4624,6 +4634,11 @@ static const struct soc_enum slim0_rx_vi_fb_rch_mux_enum =
ARRAY_SIZE(slim0_rx_vi_fb_tx_rch_mux_text),
slim0_rx_vi_fb_tx_rch_mux_text, slim0_rx_vi_fb_tx_rch_value);
static const struct soc_enum mi2s_rx_vi_fb_mux_enum =
SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_PRI_MI2S_RX, 0, 0,
ARRAY_SIZE(mi2s_rx_vi_fb_tx_mux_text),
mi2s_rx_vi_fb_tx_mux_text, mi2s_rx_vi_fb_tx_value);
static const struct snd_kcontrol_new slim0_rx_vi_fb_lch_mux =
SOC_DAPM_ENUM_EXT("SLIM0_RX_VI_FB_LCH_MUX",
slim0_rx_vi_fb_lch_mux_enum, spkr_prot_get_vi_lch_port,
@ -4634,6 +4649,11 @@ static const struct snd_kcontrol_new slim0_rx_vi_fb_rch_mux =
slim0_rx_vi_fb_rch_mux_enum, spkr_prot_get_vi_rch_port,
spkr_prot_put_vi_rch_port);
static const struct snd_kcontrol_new mi2s_rx_vi_fb_mux =
SOC_DAPM_ENUM_EXT("PRI_MI2S_RX_VI_FB_MUX",
mi2s_rx_vi_fb_mux_enum, spkr_prot_get_vi_lch_port,
spkr_prot_put_vi_lch_port);
static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
/* Frontend AIF */
/* Widget name equals to Front-End DAI name<Need confirmation>,
@ -4820,6 +4840,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture",
0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("SENARY_TX", "Senary_mi2s Capture",
0, 0, 0, 0),
SND_SOC_DAPM_AIF_IN("SLIMBUS_5_TX", "Slimbus5 Capture", 0, 0, 0, 0),
SND_SOC_DAPM_AIF_OUT("AUX_PCM_RX", "AUX PCM Playback", 0, 0, 0, 0),
@ -5082,6 +5104,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
&slim0_rx_vi_fb_lch_mux),
SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_RCH_MUX", SND_SOC_NOPM, 0, 0,
&slim0_rx_vi_fb_rch_mux),
SND_SOC_DAPM_MUX("PRI_MI2S_RX_VI_FB_MUX", SND_SOC_NOPM, 0, 0,
&mi2s_rx_vi_fb_mux),
SND_SOC_DAPM_MUX("VOC_EXT_EC MUX", SND_SOC_NOPM, 0, 0,
&voc_ext_ec_mux),
@ -6057,6 +6081,7 @@ static const struct snd_soc_dapm_route intercon[] = {
{"PRI_MI2S_TX", NULL, "BE_IN"},
{"TERT_MI2S_TX", NULL, "BE_IN"},
{"SEC_MI2S_TX", NULL, "BE_IN"},
{"SENARY_MI2S_TX", NULL, "BE_IN" },
{"SLIMBUS_0_TX", NULL, "BE_IN" },
{"SLIMBUS_1_TX", NULL, "BE_IN" },
{"SLIMBUS_3_TX", NULL, "BE_IN" },
@ -6077,8 +6102,10 @@ static const struct snd_soc_dapm_route intercon[] = {
{"INCALL_RECORD_RX", NULL, "BE_IN"},
{"SLIM0_RX_VI_FB_LCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"},
{"SLIM0_RX_VI_FB_RCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"},
{"PRI_MI2S_RX_VI_FB_MUX", "SENARY_TX", "SENARY_TX"},
{"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_LCH_MUX"},
{"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_RCH_MUX"},
{"PRI_MI2S_RX", NULL, "PRI_MI2S_RX_VI_FB_MUX"},
};
static int msm_pcm_routing_hw_params(struct snd_pcm_substream *substream,

View File

@ -48,6 +48,7 @@
#define LPASS_BE_PRI_MI2S_TX "PRI_MI2S_TX"
#define LPASS_BE_TERT_MI2S_RX "TERTIARY_MI2S_RX"
#define LPASS_BE_TERT_MI2S_TX "TERTIARY_MI2S_TX"
#define LPASS_BE_SENARY_MI2S_TX "SENARY_MI2S_TX"
#define LPASS_BE_AUDIO_I2S_RX "AUDIO_I2S_RX"
#define LPASS_BE_STUB_RX "STUB_RX"
#define LPASS_BE_STUB_TX "STUB_TX"
@ -163,6 +164,7 @@ enum {
MSM_BACKEND_DAI_SLIMBUS_5_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_RX,
MSM_BACKEND_DAI_QUINARY_MI2S_TX,
MSM_BACKEND_DAI_SENARY_MI2S_TX,
MSM_BACKEND_DAI_MAX,
};

View File

@ -366,6 +366,7 @@ int afe_get_port_type(u16 port_id)
case AFE_PORT_ID_QUATERNARY_MI2S_TX:
case AFE_PORT_ID_SECONDARY_PCM_TX:
case AFE_PORT_ID_QUINARY_MI2S_TX:
case AFE_PORT_ID_SENARY_MI2S_TX:
ret = MSM_AFE_PORT_TYPE_TX;
break;
@ -2051,6 +2052,7 @@ int afe_port_start(u16 port_id, union afe_port_config *afe_config,
case AFE_PORT_ID_QUATERNARY_MI2S_TX:
case AFE_PORT_ID_QUINARY_MI2S_RX:
case AFE_PORT_ID_QUINARY_MI2S_TX:
case AFE_PORT_ID_SENARY_MI2S_TX:
cfg_type = AFE_PARAM_ID_I2S_CONFIG;
break;
case HDMI_RX:
@ -2201,6 +2203,8 @@ int afe_get_port_index(u16 port_id)
return IDX_AFE_PORT_ID_QUINARY_MI2S_RX;
case AFE_PORT_ID_QUINARY_MI2S_TX:
return IDX_AFE_PORT_ID_QUINARY_MI2S_TX;
case AFE_PORT_ID_SENARY_MI2S_TX:
return IDX_AFE_PORT_ID_SENARY_MI2S_TX;
default:
pr_err("%s: port 0x%x\n", __func__, port_id);
@ -3695,6 +3699,7 @@ int afe_validate_port(u16 port_id)
case AFE_PORT_ID_TERTIARY_MI2S_TX:
case AFE_PORT_ID_QUINARY_MI2S_RX:
case AFE_PORT_ID_QUINARY_MI2S_TX:
case AFE_PORT_ID_SENARY_MI2S_TX:
{
ret = 0;
break;
@ -4220,6 +4225,8 @@ int afe_spk_prot_get_calib_data(struct afe_spkr_prot_get_vi_calib *calib_resp)
pr_err("%s: Invalid params\n", __func__);
goto fail_cmd;
}
if (this_afe.vi_tx_port != -1)
port = this_afe.vi_tx_port;
ret = q6audio_validate_port(port);
if (ret < 0) {
pr_err("%s: invalid port 0x%x ret %d\n", __func__, port, ret);

View File

@ -90,6 +90,8 @@ int q6audio_get_port_index(u16 port_id)
return IDX_AFE_PORT_ID_QUINARY_MI2S_RX;
case AFE_PORT_ID_QUINARY_MI2S_TX:
return IDX_AFE_PORT_ID_QUINARY_MI2S_TX;
case AFE_PORT_ID_SENARY_MI2S_TX:
return IDX_AFE_PORT_ID_SENARY_MI2S_TX;
default: return -EINVAL;
}
}
@ -165,6 +167,8 @@ int q6audio_get_port_id(u16 port_id)
return AFE_PORT_ID_QUINARY_MI2S_RX;
case AFE_PORT_ID_QUINARY_MI2S_TX:
return AFE_PORT_ID_QUINARY_MI2S_TX;
case AFE_PORT_ID_SENARY_MI2S_TX:
return AFE_PORT_ID_SENARY_MI2S_TX;
default:
pr_warn("%s: Invalid port_id %d\n", __func__, port_id);
return -EINVAL;
@ -218,6 +222,7 @@ int q6audio_is_digital_pcm_interface(u16 port_id)
case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1:
case AFE_PORT_ID_QUINARY_MI2S_RX:
case AFE_PORT_ID_QUINARY_MI2S_TX:
case AFE_PORT_ID_SENARY_MI2S_TX:
break;
default:
ret = -EINVAL;
@ -282,6 +287,7 @@ int q6audio_validate_port(u16 port_id)
case AFE_PORT_ID_SECONDARY_MI2S_RX_SD1:
case AFE_PORT_ID_QUINARY_MI2S_RX:
case AFE_PORT_ID_QUINARY_MI2S_TX:
case AFE_PORT_ID_SENARY_MI2S_TX:
{
ret = 0;
break;