From b9048cb1dd3f822dede0ee689e2729e9ba60a7b7 Mon Sep 17 00:00:00 2001 From: Derek Chen Date: Thu, 7 Mar 2019 14:54:13 -0500 Subject: [PATCH] ASoC: msm: add quat tdm tx_7 to rx_7 loopback Add Quaternary TDM TX 7 to RX 7 AFE loopback routing support. Signed-off-by: Derek Chen Change-Id: I0f6cf7cff1a0250f85f73f4ad63641b7364d4f7d --- asoc/msm-dai-fe.c | 4 +- asoc/msm-pcm-routing-v2.c | 18 ++++++++ asoc/sa8155.c | 94 ++++++++++++++++++++++++++++++++++++--- 3 files changed, 109 insertions(+), 7 deletions(-) diff --git a/asoc/msm-dai-fe.c b/asoc/msm-dai-fe.c index c4976a48a7f4..6256e8a646e7 100644 --- a/asoc/msm-dai-fe.c +++ b/asoc/msm-dai-fe.c @@ -2026,7 +2026,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE), .channels_min = 1, - .channels_max = 8, + .channels_max = 16, .rate_min = 8000, .rate_max = 48000, }, @@ -2042,7 +2042,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE), .channels_min = 1, - .channels_max = 8, + .channels_max = 16, .rate_min = 8000, .rate_max = 48000, }, diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index f09d34970358..4ef0f9a94333 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -16398,6 +16398,14 @@ static const struct snd_kcontrol_new quat_tdm_rx_3_port_mixer_controls[] = { msm_routing_put_port_mixer), }; +static const struct snd_kcontrol_new quat_tdm_rx_7_port_mixer_controls[] = { + SOC_DOUBLE_EXT("QUAT_TDM_TX_7", SND_SOC_NOPM, + MSM_BACKEND_DAI_QUAT_TDM_RX_7, + MSM_BACKEND_DAI_QUAT_TDM_TX_7, 1, 0, + msm_routing_get_port_mixer, + msm_routing_put_port_mixer), +}; + static const struct snd_kcontrol_new quin_tdm_rx_0_port_mixer_controls[] = { SOC_DOUBLE_EXT("PRI_MI2S_TX", SND_SOC_NOPM, MSM_BACKEND_DAI_QUIN_TDM_RX_0, @@ -20054,6 +20062,9 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Port Mixer", SND_SOC_NOPM, 0, 0, quat_tdm_rx_3_port_mixer_controls, ARRAY_SIZE(quat_tdm_rx_3_port_mixer_controls)), + SND_SOC_DAPM_MIXER("QUAT_TDM_RX_7 Port Mixer", SND_SOC_NOPM, 0, 0, + quat_tdm_rx_7_port_mixer_controls, + ARRAY_SIZE(quat_tdm_rx_7_port_mixer_controls)), SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0, quin_tdm_rx_0_port_mixer_controls, ARRAY_SIZE(quin_tdm_rx_0_port_mixer_controls)), @@ -22735,10 +22746,12 @@ static const struct snd_soc_dapm_route intercon[] = { {"QUAT_TDM_TX_1_UL_HL", NULL, "QUAT_TDM_TX_1"}, {"QUAT_TDM_TX_2_UL_HL", NULL, "QUAT_TDM_TX_2"}, {"QUAT_TDM_TX_3_UL_HL", NULL, "QUAT_TDM_TX_3"}, + {"QUAT_TDM_TX_7_UL_HL", NULL, "QUAT_TDM_TX_7"}, {"QUAT_TDM_RX_0", NULL, "QUAT_TDM_RX_0_DL_HL"}, {"QUAT_TDM_RX_1", NULL, "QUAT_TDM_RX_1_DL_HL"}, {"QUAT_TDM_RX_2", NULL, "QUAT_TDM_RX_2_DL_HL"}, {"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3_DL_HL"}, + {"QUAT_TDM_RX_7", NULL, "QUAT_TDM_RX_7_DL_HL"}, {"QUIN_TDM_TX_0_UL_HL", NULL, "QUIN_TDM_TX_0"}, {"QUIN_TDM_TX_1_UL_HL", NULL, "QUIN_TDM_TX_1"}, {"QUIN_TDM_TX_2_UL_HL", NULL, "QUIN_TDM_TX_2"}, @@ -23103,6 +23116,9 @@ static const struct snd_soc_dapm_route intercon[] = { {"QUAT_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, {"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3 Port Mixer"}, + {"QUAT_TDM_RX_7 Port Mixer", "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"}, + {"QUAT_TDM_RX_7", NULL, "QUAT_TDM_RX_7 Port Mixer"}, + {"QUIN_TDM_RX_0 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"}, {"QUIN_TDM_RX_0 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"}, {"QUIN_TDM_RX_0 Port Mixer", "TERT_MI2S_TX", "TERT_MI2S_TX"}, @@ -23524,6 +23540,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"BE_OUT", NULL, "QUAT_TDM_RX_1"}, {"BE_OUT", NULL, "QUAT_TDM_RX_2"}, {"BE_OUT", NULL, "QUAT_TDM_RX_3"}, + {"BE_OUT", NULL, "QUAT_TDM_RX_7"}, {"BE_OUT", NULL, "QUIN_TDM_RX_0"}, {"BE_OUT", NULL, "QUIN_TDM_RX_1"}, {"BE_OUT", NULL, "QUIN_TDM_RX_2"}, @@ -23608,6 +23625,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"QUAT_TDM_TX_1", NULL, "BE_IN"}, {"QUAT_TDM_TX_2", NULL, "BE_IN"}, {"QUAT_TDM_TX_3", NULL, "BE_IN"}, + {"QUAT_TDM_TX_7", NULL, "BE_IN"}, {"AFE_LOOPBACK_TX", NULL, "BE_IN"}, {"QUIN_TDM_TX_0", NULL, "BE_IN"}, {"QUIN_TDM_TX_1", NULL, "BE_IN"}, diff --git a/asoc/sa8155.c b/asoc/sa8155.c index fedb793ec895..aef8a2646058 100644 --- a/asoc/sa8155.c +++ b/asoc/sa8155.c @@ -253,7 +253,7 @@ static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ }, { /* QUAT TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, /* TX_0 */ + {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 16}, /* TX_0 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */ @@ -409,7 +409,7 @@ static unsigned int tdm_rx_slot_offset {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ + {28,0xFFFF}, }, {/* QUIN TDM */ {0, 4, 0xFFFF},/*STEREO SPKR1*/ @@ -464,7 +464,7 @@ static unsigned int tdm_tx_slot_offset {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ + {60,0xFFFF}, }, {/* QUIN TDM */ {0, 4, 8, 12, 16, 20, 0xFFFF},/*EC/ANC REF*/ @@ -525,7 +525,7 @@ static unsigned int tdm_rx_slot_offset_custom {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ + {0, 0xFFFF}, }, {/* QUIN TDM */ {0xFFFF}, /* not used */ @@ -579,7 +579,7 @@ static unsigned int tdm_tx_slot_offset_custom {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ + {0, 0xFFFF}, }, {/* QUIN TDM */ {0xFFFF}, /* not used */ @@ -4163,6 +4163,14 @@ static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_3].sample_rate; break; + case AFE_PORT_ID_QUATERNARY_TDM_RX_7: + channels->min = channels->max = + tdm_rx_cfg[TDM_QUAT][TDM_7].channels; + param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, + tdm_rx_cfg[TDM_QUAT][TDM_7].bit_format); + rate->min = rate->max = + tdm_rx_cfg[TDM_QUAT][TDM_7].sample_rate; + break; case AFE_PORT_ID_QUATERNARY_TDM_TX: channels->min = channels->max = tdm_tx_cfg[TDM_QUAT][TDM_0].channels; @@ -4195,6 +4203,14 @@ static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_3].sample_rate; break; + case AFE_PORT_ID_QUATERNARY_TDM_TX_7: + channels->min = channels->max = + tdm_tx_cfg[TDM_QUAT][TDM_7].channels; + param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, + tdm_tx_cfg[TDM_QUAT][TDM_7].bit_format); + rate->min = rate->max = + tdm_tx_cfg[TDM_QUAT][TDM_7].sample_rate; + break; case AFE_PORT_ID_QUINARY_TDM_RX: channels->min = channels->max = tdm_rx_cfg[TDM_QUIN][TDM_0].channels; @@ -4479,6 +4495,11 @@ static int sa8155_tdm_snd_hw_params(struct snd_pcm_substream *substream, slot_width = tdm_slot[TDM_QUAT].width; slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_3]; break; + case AFE_PORT_ID_QUATERNARY_TDM_RX_7: + slots = tdm_slot[TDM_QUAT].num; + slot_width = tdm_slot[TDM_QUAT].width; + slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_7]; + break; case AFE_PORT_ID_QUATERNARY_TDM_TX: slots = tdm_slot[TDM_QUAT].num; slot_width = tdm_slot[TDM_QUAT].width; @@ -4499,6 +4520,11 @@ static int sa8155_tdm_snd_hw_params(struct snd_pcm_substream *substream, slot_width = tdm_slot[TDM_QUAT].width; slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_3]; break; + case AFE_PORT_ID_QUATERNARY_TDM_TX_7: + slots = tdm_slot[TDM_QUAT].num; + slot_width = tdm_slot[TDM_QUAT].width; + slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_7]; + break; case AFE_PORT_ID_QUINARY_TDM_RX: slots = tdm_slot[TDM_QUIN].num; slot_width = tdm_slot[TDM_QUIN].width; @@ -5615,6 +5641,36 @@ static struct snd_soc_dai_link msm_auto_fe_dai_links[] = { .codec_dai_name = "snd-soc-dummy-dai", .codec_name = "snd-soc-dummy", }, + { + .name = "Quaternary TDM RX 7 Hostless", + .stream_name = "Quaternary TDM RX 7 Hostless", + .cpu_dai_name = "QUAT_TDM_RX_7_HOSTLESS", + .platform_name = "msm-pcm-hostless", + .dynamic = 1, + .dpcm_playback = 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, + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + }, + { + .name = "Quaternary TDM TX 7 Hostless", + .stream_name = "Quaternary TDM TX 7 Hostless", + .cpu_dai_name = "QUAT_TDM_TX_7_HOSTLESS", + .platform_name = "msm-pcm-hostless", + .dynamic = 1, + .dpcm_capture = 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, + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + }, }; static struct snd_soc_dai_link msm_custom_fe_dai_links[] = { @@ -6377,6 +6433,20 @@ static struct snd_soc_dai_link msm_auto_be_dai_links[] = { .ops = &sa8155_tdm_be_ops, .ignore_suspend = 1, }, + { + .name = LPASS_BE_QUAT_TDM_RX_7, + .stream_name = "Quaternary TDM7 Playback", + .cpu_dai_name = "msm-dai-q6-tdm.36926", + .platform_name = "msm-pcm-routing", + .codec_name = "msm-stub-codec.1", + .codec_dai_name = "msm-stub-rx", + .no_pcm = 1, + .dpcm_playback = 1, + .id = MSM_BACKEND_DAI_QUAT_TDM_RX_7, + .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, + .ops = &sa8155_tdm_be_ops, + .ignore_suspend = 1, + }, { .name = LPASS_BE_QUAT_TDM_TX_1, .stream_name = "Quaternary TDM1 Capture", @@ -6419,6 +6489,20 @@ static struct snd_soc_dai_link msm_auto_be_dai_links[] = { .ops = &sa8155_tdm_be_ops, .ignore_suspend = 1, }, + { + .name = LPASS_BE_QUAT_TDM_TX_7, + .stream_name = "Quaternary TDM7 Capture", + .cpu_dai_name = "msm-dai-q6-tdm.36927", + .platform_name = "msm-pcm-routing", + .codec_name = "msm-stub-codec.1", + .codec_dai_name = "msm-stub-rx", + .no_pcm = 1, + .dpcm_capture = 1, + .id = MSM_BACKEND_DAI_QUAT_TDM_TX_7, + .be_hw_params_fixup = msm_tdm_be_hw_params_fixup, + .ops = &sa8155_tdm_be_ops, + .ignore_suspend = 1, + }, }; static struct snd_soc_dai_link ext_disp_be_dai_link[] = {