From 501c74bfd49fbb1e058efc1d6525d1fe6756ce01 Mon Sep 17 00:00:00 2001 From: "Xu,Baochu" Date: Mon, 7 Mar 2022 16:43:03 +0800 Subject: [PATCH 1/3] asoc: wsa881x: Add mixer for speaker protection Add mixer for speaker protection. Change-Id: Ieea53dd1a3c9601373b2a8400d48abb88bb0cd60 --- asoc/codecs/wsa881x-analog.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) mode change 100644 => 100755 asoc/codecs/wsa881x-analog.c diff --git a/asoc/codecs/wsa881x-analog.c b/asoc/codecs/wsa881x-analog.c old mode 100644 new mode 100755 index 62247524f1cc..14d027ac141f --- a/asoc/codecs/wsa881x-analog.c +++ b/asoc/codecs/wsa881x-analog.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2015-2016, 2018-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -805,7 +806,40 @@ static int wsa881x_set_visense(struct snd_kcontrol *kcontrol, return 0; } +static int wsa881x_get_t0_init(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = + snd_soc_kcontrol_component(kcontrol); + struct wsa881x_pdata *wsa881x = + snd_soc_component_get_drvdata(component); + struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata; + + ucontrol->value.integer.value[0] = pdata->t0_init; + dev_dbg(component->dev, "%s: t0 init %d\n", __func__, pdata->t0_init); + + return 0; +} + +static int wsa881x_set_t0_init(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = + snd_soc_kcontrol_component(kcontrol); + struct wsa881x_pdata *wsa881x = + snd_soc_component_get_drvdata(component); + struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata; + + pdata->t0_init = ucontrol->value.integer.value[0]; + dev_dbg(component->dev, "%s: t0 init %d\n", __func__, pdata->t0_init); + + return 0; +} + static const struct snd_kcontrol_new wsa881x_snd_controls[] = { + SOC_SINGLE_EXT("WSA T0 Init", SND_SOC_NOPM, 0, 1, 0, + wsa881x_get_t0_init, wsa881x_set_t0_init), + SOC_SINGLE_EXT("BOOST Switch", SND_SOC_NOPM, 0, 1, 0, wsa881x_get_boost, wsa881x_set_boost), From 51d36d5c689c89e43d67ba8a72a832da70f8061a Mon Sep 17 00:00:00 2001 From: "Xu,Baochu" Date: Mon, 7 Mar 2022 17:34:51 +0800 Subject: [PATCH 2/3] asoc: msm: Add VI feedback mixer Add VI feedback mixer controls for speaker protection on bengal. Change-Id: I8bc4127d2f599186d80890cbf9b4527c6716723e --- asoc/msm-pcm-routing-v2.c | 49 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 6915f566cd29..43b96aefb914 100755 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -32549,6 +32549,15 @@ static int spkr_prot_get_vi_rch_port(struct snd_kcontrol *kcontrol, return 0; } +static const char * const cdc_dma_rx_0_vi_fb_tx_mux_text[] = { + "ZERO", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_4","TX_CDC_DMA_TX_5" + +}; + +static const char * const cdc_dma_rx_1_vi_fb_tx_mux_text[] = { + "ZERO", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_4","TX_CDC_DMA_TX_5" +}; + static const char * const slim0_rx_vi_fb_tx_lch_mux_text[] = { "ZERO", "SLIM4_TX" }; @@ -32577,6 +32586,14 @@ static const char * const int4_mi2s_rx_vi_fb_tx_stereo_mux_text[] = { "ZERO", "INT5_MI2S_TX" }; +static const int cdc_dma_rx_0_vi_fb_tx_value[] = { + MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_BACKEND_DAI_TX_CDC_DMA_TX_4 +}; + +static const int cdc_dma_rx_1_vi_fb_tx_value[] = { + MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_TX_CDC_DMA_TX_3, MSM_BACKEND_DAI_TX_CDC_DMA_TX_4 +}; + static const int slim0_rx_vi_fb_tx_lch_value[] = { MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_SLIMBUS_4_TX }; @@ -32606,6 +32623,16 @@ static const int int4_mi2s_rx_vi_fb_tx_stereo_ch_value[] = { MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_INT5_MI2S_TX }; +static const struct soc_enum cdc_dma_rx_0_vi_fb_mux_enum = + SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_RX_CDC_DMA_RX_0, 0, 0, + ARRAY_SIZE(cdc_dma_rx_0_vi_fb_tx_mux_text), + cdc_dma_rx_0_vi_fb_tx_mux_text, cdc_dma_rx_0_vi_fb_tx_value); + +static const struct soc_enum cdc_dma_rx_1_vi_fb_mux_enum = + SOC_VALUE_ENUM_DOUBLE(0, MSM_BACKEND_DAI_RX_CDC_DMA_RX_1, 0, 0, + ARRAY_SIZE(cdc_dma_rx_1_vi_fb_tx_mux_text), + cdc_dma_rx_1_vi_fb_tx_mux_text, cdc_dma_rx_1_vi_fb_tx_value); + 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), @@ -32643,6 +32670,16 @@ static const struct soc_enum int4_mi2s_rx_vi_fb_stereo_ch_mux_enum = int4_mi2s_rx_vi_fb_tx_stereo_mux_text, int4_mi2s_rx_vi_fb_tx_stereo_ch_value); +static const struct snd_kcontrol_new cdc_dma_rx_0_vi_fb_mux = + SOC_DAPM_ENUM_EXT("CDC_DMA_RX_0_VI_FB_MUX", + cdc_dma_rx_0_vi_fb_mux_enum, spkr_prot_get_vi_lch_port, + spkr_prot_put_vi_lch_port); + +static const struct snd_kcontrol_new cdc_dma_rx_1_vi_fb_mux = + SOC_DAPM_ENUM_EXT("CDC_DMA_RX_1_VI_FB_MUX", + cdc_dma_rx_1_vi_fb_mux_enum, spkr_prot_get_vi_lch_port, + spkr_prot_put_vi_lch_port); + 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, @@ -33258,6 +33295,12 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { SND_SOC_DAPM_OUTPUT("BE_OUT"), SND_SOC_DAPM_INPUT("BE_IN"), + SND_SOC_DAPM_MUX("CDC_DMA_RX_0_VI_FB_MUX", SND_SOC_NOPM, 0, 0, + &cdc_dma_rx_0_vi_fb_mux), + + SND_SOC_DAPM_MUX("CDC_DMA_RX_1_VI_FB_MUX", SND_SOC_NOPM, 0, 0, + &cdc_dma_rx_1_vi_fb_mux), + SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_LCH_MUX", SND_SOC_NOPM, 0, 0, &slim0_rx_vi_fb_lch_mux), SND_SOC_DAPM_MUX("SLIM0_RX_VI_FB_RCH_MUX", SND_SOC_NOPM, 0, 0, @@ -36395,10 +36438,16 @@ static const struct snd_soc_dapm_route intercon[] = { #endif {"INCALL_RECORD_TX", NULL, "BE_IN"}, {"INCALL_RECORD_RX", NULL, "BE_IN"}, + {"CDC_DMA_RX_0_VI_FB_MUX", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, + {"CDC_DMA_RX_0_VI_FB_MUX", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, + {"CDC_DMA_RX_1_VI_FB_MUX", "TX_CDC_DMA_TX_3", "TX_CDC_DMA_TX_3"}, + {"CDC_DMA_RX_1_VI_FB_MUX", "TX_CDC_DMA_TX_4", "TX_CDC_DMA_TX_4"}, {"SLIM0_RX_VI_FB_LCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"}, {"SLIM0_RX_VI_FB_RCH_MUX", "SLIM4_TX", "SLIMBUS_4_TX"}, {"WSA_RX_0_VI_FB_LCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, {"WSA_RX_0_VI_FB_RCH_MUX", "WSA_CDC_DMA_TX_0", "WSA_CDC_DMA_TX_0"}, + {"RX_CDC_DMA_RX_0", NULL, "CDC_DMA_RX_0_VI_FB_MUX"}, + {"RX_CDC_DMA_RX_1", NULL, "CDC_DMA_RX_1_VI_FB_MUX"}, {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_LCH_MUX"}, {"SLIMBUS_0_RX", NULL, "SLIM0_RX_VI_FB_RCH_MUX"}, {"WSA_CDC_DMA_RX_0", NULL, "WSA_RX_0_VI_FB_LCH_MUX"}, From 92e2db816b1e37d603d25edc8e62fcd78f7d4790 Mon Sep 17 00:00:00 2001 From: "Xu,Baochu" Date: Tue, 8 Mar 2022 16:22:12 +0800 Subject: [PATCH 3/3] asoc: Add VI feedback dai_link for bengal Add VI feedback dai_link for speaker protection feature. Change-Id: Ic4db44a548d7e2c472785a2c76ad055e507072a5 --- asoc/bengal.c | 12 ++++++++++++ asoc/msm-dai-fe.c | 24 ++++++++++++++++++++++++ asoc/msm-pcm-routing-v2.c | 3 +++ asoc/msm_bengal_dailink.h | 6 ++++++ 4 files changed, 45 insertions(+) mode change 100644 => 100755 asoc/bengal.c mode change 100644 => 100755 asoc/msm-dai-fe.c mode change 100644 => 100755 asoc/msm_bengal_dailink.h diff --git a/asoc/bengal.c b/asoc/bengal.c old mode 100644 new mode 100755 index 2fff3ff5d19b..d7c0b399a78f --- a/asoc/bengal.c +++ b/asoc/bengal.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -4982,6 +4983,17 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ops = &msm_cdc_dma_be_ops, SND_SOC_DAILINK_REG(tx_cdcdma5_tx), }, + {/* hw:x,39 */ + .name = "TX4_CDC_DMA Hostless", + .stream_name = "TX4_CDC_DMA 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, + SND_SOC_DAILINK_REG(tx4_cdcdma_hostless), + }, }; static struct snd_soc_dai_link msm_common_be_dai_links[] = { diff --git a/asoc/msm-dai-fe.c b/asoc/msm-dai-fe.c old mode 100644 new mode 100755 index abb77881adb3..b6b684740706 --- a/asoc/msm-dai-fe.c +++ b/asoc/msm-dai-fe.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ @@ -592,6 +593,29 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { .name = "TX3_CDC_DMA_HOSTLESS", .probe = fe_dai_probe, }, + { + .capture = { + .stream_name = "TX4_CDC_DMA_HOSTLESS Capture", + .aif_name = "TX4_CDC_DMA_UL_HL", + .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | + SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | + SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | + SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | + SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 | + SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_352800 | + SNDRV_PCM_RATE_384000, + .formats = SNDRV_PCM_FMTBIT_S16_LE | + SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_S24_3LE, + .channels_min = 1, + .channels_max = 8, + .rate_min = 8000, + .rate_max = 384000, + }, + .ops = &msm_fe_dai_ops, + .name = "TX4_CDC_DMA_HOSTLESS", + .probe = fe_dai_probe, + }, { .playback = { .stream_name = "INT_FM_HOSTLESS Playback", diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 43b96aefb914..71b45e4c3513 100755 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -32794,6 +32794,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { 0, 0, 0, 0), SND_SOC_DAPM_AIF_OUT("TX3_CDC_DMA_UL_HL", "TX3_CDC_DMA_HOSTLESS Capture", 0, 0, 0, 0), + SND_SOC_DAPM_AIF_OUT("TX4_CDC_DMA_UL_HL", + "TX4_CDC_DMA_HOSTLESS Capture", 0, 0, 0, 0), SND_SOC_DAPM_AIF_OUT("CPE_LSM_UL_HL", "CPE LSM capture", 0, 0, 0, 0), SND_SOC_DAPM_AIF_IN("SLIM1_DL_HL", "SLIMBUS1_HOSTLESS Playback", @@ -36129,6 +36131,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"RX_CDC_DMA_RX_1_DL_HL", "Switch", "CDC_DMA_DL_HL"}, {"RX_CDC_DMA_RX_1", NULL, "RX_CDC_DMA_RX_1_DL_HL"}, {"TX3_CDC_DMA_UL_HL", NULL, "TX_CDC_DMA_TX_3"}, + {"TX4_CDC_DMA_UL_HL", NULL, "TX_CDC_DMA_TX_4"}, {"LSM1 Mixer", "SLIMBUS_0_TX", "SLIMBUS_0_TX"}, {"LSM1 Mixer", "SLIMBUS_1_TX", "SLIMBUS_1_TX"}, {"LSM1 Mixer", "SLIMBUS_3_TX", "SLIMBUS_3_TX"}, diff --git a/asoc/msm_bengal_dailink.h b/asoc/msm_bengal_dailink.h old mode 100644 new mode 100755 index c39a3c42d7bc..a901364964a2 --- a/asoc/msm_bengal_dailink.h +++ b/asoc/msm_bengal_dailink.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -166,6 +167,11 @@ SND_SOC_DAILINK_DEFS(tx3_cdcdma_hostless, DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")), DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless"))); +SND_SOC_DAILINK_DEFS(tx4_cdcdma_hostless, + DAILINK_COMP_ARRAY(COMP_CPU("TX4_CDC_DMA_HOSTLESS")), + DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")), + DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless"))); + SND_SOC_DAILINK_DEFS(tert_mi2s_tx_hostless, DAILINK_COMP_ARRAY(COMP_CPU("TERT_MI2S_TX_HOSTLESS")), DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")),