From 2e13245b99b2e77560c2ab40b3c260004b84b3f0 Mon Sep 17 00:00:00 2001 From: Xuewen Liu Date: Tue, 16 Aug 2022 17:57:26 +0800 Subject: [PATCH 1/7] asoc: remove error from function msm_pinctrl_mclk_enable change pr_err to pr_debug. Can't find device node mclk_gpio_phandle[i](it equals "qcom,internal-mclk1-gpios") in gpio device_tree dts file, so it needs to change this log to pr_debug, it's not an error. Change-Id: I82e58222e27b3a97209c52e8e569a0257744cf22 Signed-off-by: Xuewen Liu --- asoc/sa8155.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asoc/sa8155.c b/asoc/sa8155.c index 78254f73a0fa..c90ab061bc06 100644 --- a/asoc/sa8155.c +++ b/asoc/sa8155.c @@ -5503,7 +5503,7 @@ static int msm_pinctrl_mclk_enable(struct platform_device *pdev) np = of_parse_phandle(pdev->dev.of_node, mclk_gpio_phandle[i], 0); if (!np) { - pr_err("%s: device node %s is null\n", __func__, mclk_gpio_phandle[i]); + pr_debug("%s: device node %s is null\n", __func__, mclk_gpio_phandle[i]); continue; } pdev_np = of_find_device_by_node(np); From 884cb61bf32c93c110eb48ab6ae1b58a5d45fd28 Mon Sep 17 00:00:00 2001 From: Kogara Naveen Kumar Date: Mon, 29 Aug 2022 15:33:04 +0530 Subject: [PATCH 2/7] audio: Modified SSR handling after sub-system shutdown compltes Changes to make sound card offline after receving sub-system complete event. Change-Id: I022aa77c2eb19706a448c3fe26be2f9cbcf45bfd --- dsp/audio_notifier.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dsp/audio_notifier.c b/dsp/audio_notifier.c index 9f2d4d5c107f..9c54afb1dbdd 100644 --- a/dsp/audio_notifier.c +++ b/dsp/audio_notifier.c @@ -423,7 +423,7 @@ static int audio_notifier_convert_opcode(unsigned long opcode, int ret = 0; switch (opcode) { - case SUBSYS_BEFORE_SHUTDOWN: + case SUBSYS_AFTER_SHUTDOWN: case SERVREG_NOTIF_SERVICE_STATE_DOWN_V01: *notifier_opcode = AUDIO_NOTIFIER_SERVICE_DOWN; break; From d207393128bd18d5c377f5f0f0d3d074e4ade149 Mon Sep 17 00:00:00 2001 From: Jing Wang Date: Thu, 1 Sep 2022 15:16:40 +0530 Subject: [PATCH 3/7] asoc: Add kcontrol "QUAT_TDM_RX_7 Port Mixer TERT_TDM_TX_7" Since quin & tert tdm fsync has harware conflict at talos, add kcontrol for audiod use. Change-Id: Ic42dec3144a9b3a8def14b14081cb9562291ae09 Signed-off-by: Jing Wang --- asoc/msm-pcm-routing-auto.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/asoc/msm-pcm-routing-auto.c b/asoc/msm-pcm-routing-auto.c index 5819804020bd..5b4a572cef52 100755 --- a/asoc/msm-pcm-routing-auto.c +++ b/asoc/msm-pcm-routing-auto.c @@ -14416,6 +14416,11 @@ static const struct snd_kcontrol_new quat_tdm_rx_3_port_mixer_controls[] = { }; static const struct snd_kcontrol_new quat_tdm_rx_7_port_mixer_controls[] = { + SOC_DOUBLE_EXT("TERT_TDM_TX_7", SND_SOC_NOPM, + MSM_BACKEND_DAI_QUAT_TDM_RX_7, + MSM_BACKEND_DAI_TERT_TDM_TX_7, 1, 0, + msm_routing_get_port_mixer, + msm_routing_put_port_mixer), 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, @@ -29209,6 +29214,7 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"QUAT_TDM_RX_3 Port Mixer", "SEN_TDM_TX_3", "SEN_TDM_TX_3"}, {"QUAT_TDM_RX_3", NULL, "QUAT_TDM_RX_3 Port Mixer"}, + {"QUAT_TDM_RX_7 Port Mixer", "TERT_TDM_TX_7", "TERT_TDM_TX_7"}, {"QUAT_TDM_RX_7 Port Mixer", "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"}, {"QUAT_TDM_RX_7 Port Mixer", "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"}, {"QUAT_TDM_RX_7", NULL, "QUAT_TDM_RX_7 Port Mixer"}, From a596b7cd0a0a8ad62e91b167da8ebe680e861ee3 Mon Sep 17 00:00:00 2001 From: Soumya Managoli Date: Thu, 1 Sep 2022 16:20:27 +0530 Subject: [PATCH 4/7] ASoC: codecs: Deinitialize mbhc on codec remove Invoke mbhc de-init on codec remove to free the requested mbhc irqs. Change-Id: Id87bb38a9cde6223224d76cbda325e3334037e52 Signed-off-by: Soumya Managoli --- asoc/codecs/wcd937x/wcd937x.c | 2 ++ asoc/codecs/wcd938x/wcd938x.c | 1 + 2 files changed, 3 insertions(+) diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c index 24de137ad11f..a7b3a5a0e8d4 100644 --- a/asoc/codecs/wcd937x/wcd937x.c +++ b/asoc/codecs/wcd937x/wcd937x.c @@ -2961,6 +2961,8 @@ static void wcd937x_soc_codec_remove(struct snd_soc_component *component) wcd937x->register_notifier(wcd937x->handle, &wcd937x->nblock, false); + wcd937x_mbhc_deinit(component); + return; } diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c index eae9dfb280b2..1a976b86007d 100644 --- a/asoc/codecs/wcd938x/wcd938x.c +++ b/asoc/codecs/wcd938x/wcd938x.c @@ -3961,6 +3961,7 @@ static void wcd938x_soc_codec_remove(struct snd_soc_component *component) wcd938x->register_notifier(wcd938x->handle, &wcd938x->nblock, false); + wcd938x_mbhc_deinit(component); } static int wcd938x_soc_codec_suspend(struct snd_soc_component *component) From b490a90b347436922854511db7ed61501c7cfa50 Mon Sep 17 00:00:00 2001 From: Huicheng Liu Date: Wed, 24 Aug 2022 18:28:21 -0400 Subject: [PATCH 5/7] asoc: audio reach kernel bringup on 8255 GVM * Refine populate_snd_card_dailinks function. * Add oct_tdm, hs_if3_tdm and hs_if4_tdm. Change-Id: Iaca5b1d4f107ede773530a60b457a510244f784a Signed-off-by: Huicheng Liu --- asoc/Kbuild | 2 +- asoc/gvm_auto_spf_dummy.c | 120 +++++++++++++++++++++++--------------- asoc/msm_dailink.h | 30 ++++++++++ 3 files changed, 103 insertions(+), 49 deletions(-) diff --git a/asoc/Kbuild b/asoc/Kbuild index 84aaa73b3eeb..6bfe53412acb 100755 --- a/asoc/Kbuild +++ b/asoc/Kbuild @@ -186,7 +186,7 @@ ifdef CONFIG_SND_SOC_SA8155 MACHINE_OBJS += sa8155.o endif -# for gvmgh sound card driver +# for gvm sound card driver ifdef CONFIG_SND_SOC_GVM_AUTO_SPF SPF_MACHINE_OBJS += gvm_auto_spf_dummy.o endif diff --git a/asoc/gvm_auto_spf_dummy.c b/asoc/gvm_auto_spf_dummy.c index b5e248ed5830..7b5fb095c122 100644 --- a/asoc/gvm_auto_spf_dummy.c +++ b/asoc/gvm_auto_spf_dummy.c @@ -324,7 +324,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = { }, }; -static struct snd_soc_dai_link msm_gvm8295_dai_links[] = { +static struct snd_soc_dai_link msm_gvm_auto_dai_links[] = { /* BackEnd DAI Links */ { .name = "PRI_TDM_RX_0_DUMMY", @@ -467,6 +467,26 @@ static struct snd_soc_dai_link msm_gvm8295_dai_links[] = { SND_SOC_DAILINK_REG(sep_tdm_tx_0_dummy), }, { + .name = "OCT_TDM_RX_0_DUMMY", + .stream_name = "TDM-LPAIF_WSA2-RX-PRIMARY", + .dpcm_playback = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + SND_SOC_DAILINK_REG(oct_tdm_rx_0_dummy), + }, + { + .name = "OCT_TDM_TX_0_DUMMY", + .stream_name = "TDM-LPAIF_WSA2-TX-PRIMARY", + .dpcm_capture = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + SND_SOC_DAILINK_REG(oct_tdm_tx_0_dummy), + }, + { .name = "HS_IF0_TDM_RX_0_DUMMY", .stream_name = "TDM-LPAIF_SDR-RX-PRIMARY", .dpcm_playback = 1, @@ -526,6 +546,46 @@ static struct snd_soc_dai_link msm_gvm8295_dai_links[] = { .ignore_pmdown_time = 1, SND_SOC_DAILINK_REG(hs_if2_tdm_tx_0_dummy), }, + { + .name = "HS_IF3_TDM_RX_0", + .stream_name = "TDM-LPAIF_SDR-RX-QUATERNARY", + .dpcm_playback = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + SND_SOC_DAILINK_REG(hs_if3_tdm_rx_0_dummy), + }, + { + .name = "HS_IF3_TDM_TX_0", + .stream_name = "TDM-LPAIF_SDR-TX-QUATERNARY", + .dpcm_capture = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + SND_SOC_DAILINK_REG(hs_if3_tdm_tx_0_dummy), + }, + { + .name = "HS_IF4_TDM_RX_0", + .stream_name = "TDM-LPAIF_SDR-RX-QUINARY", + .dpcm_playback = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + SND_SOC_DAILINK_REG(hs_if4_tdm_rx_0_dummy), + }, + { + .name = "HS_IF4_TDM_TX_0", + .stream_name = "TDM-LPAIF_SDR-TX-QUINARY", + .dpcm_capture = 1, + .trigger = {SND_SOC_DPCM_TRIGGER_POST, + SND_SOC_DPCM_TRIGGER_POST}, + .ignore_suspend = 1, + .ignore_pmdown_time = 1, + SND_SOC_DAILINK_REG(hs_if4_tdm_tx_0_dummy), + }, }; static struct snd_soc_dai_link msm_talos_dai_links[] = { @@ -632,17 +692,7 @@ static struct snd_soc_dai_link msm_talos_dai_links[] = { }, }; -struct snd_soc_card snd_soc_card_auto_hana_dummy_msm = { - .name = "gvmauto-8155-snd-card", -}; - -struct snd_soc_card snd_soc_card_auto_talos_dummy_msm = { - .name = "gvmauto-6155-snd-card", -}; - -struct snd_soc_card snd_soc_card_auto_makena_dummy_msm = { - .name = "gvmauto-8295-snd-card", -}; +struct snd_soc_card snd_soc_card_gvm_auto_dummy_msm; static int msm_populate_dai_link_component_of_node( struct snd_soc_card *card) @@ -751,21 +801,11 @@ static const struct of_device_id gvm_asoc_machine_of_match[] = { .data = "adp_star_codec"}, {}, }; -static struct snd_soc_dai_link msm_auto_dai_links[ - ARRAY_SIZE(msm_common_dai_links)]; - -static struct snd_soc_dai_link msm_auto_talos_dai_links[ - ARRAY_SIZE(msm_talos_dai_links)]; - -static struct snd_soc_dai_link msm_auto_gvm8295_dai_links[ - ARRAY_SIZE(msm_gvm8295_dai_links)]; static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) { struct snd_soc_card *card = NULL; - struct snd_soc_dai_link *dailink; - int total_links; - const struct of_device_id *match; + const struct of_device_id *match = NULL; match = of_match_node(gvm_asoc_machine_of_match, dev->of_node); if (!match) { @@ -774,34 +814,18 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev) return NULL; } + card = &snd_soc_card_gvm_auto_dummy_msm; + if (!strcmp(match->compatible, "qcom,8155-spf-asoc-snd-adp-star")) { - card = &snd_soc_card_auto_hana_dummy_msm; - total_links = ARRAY_SIZE(msm_common_dai_links); - memcpy(msm_auto_dai_links, - msm_common_dai_links, - sizeof(msm_common_dai_links)); - - dailink = msm_auto_dai_links; + card->dai_link = msm_common_dai_links; + card->num_links = ARRAY_SIZE(msm_common_dai_links); } else if (!strcmp(match->compatible, "qcom,6155-spf-asoc-snd-adp-star")) { - card = &snd_soc_card_auto_talos_dummy_msm; - total_links = ARRAY_SIZE(msm_talos_dai_links); - memcpy(msm_auto_talos_dai_links, - msm_talos_dai_links, - sizeof(msm_talos_dai_links)); - dailink = msm_auto_talos_dai_links; + card->dai_link = msm_talos_dai_links; + card->num_links = ARRAY_SIZE(msm_talos_dai_links); } else if (!strcmp(match->compatible, "qcom,gvm-auto-spf-asoc-snd-adp-star")) { - card = &snd_soc_card_auto_makena_dummy_msm; - total_links = ARRAY_SIZE(msm_gvm8295_dai_links); - memcpy(msm_auto_gvm8295_dai_links, - msm_gvm8295_dai_links, - sizeof(msm_gvm8295_dai_links)); - dailink = msm_auto_gvm8295_dai_links; - } - - if (card) { - card->dai_link = dailink; - card->num_links = total_links; - } + card->dai_link = msm_gvm_auto_dai_links; + card->num_links = ARRAY_SIZE(msm_gvm_auto_dai_links); +} return card; } diff --git a/asoc/msm_dailink.h b/asoc/msm_dailink.h index 5363641b5644..c7353b9ae05d 100644 --- a/asoc/msm_dailink.h +++ b/asoc/msm_dailink.h @@ -1392,6 +1392,16 @@ SND_SOC_DAILINK_DEFS(sep_tdm_tx_0_dummy, DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-tx")), DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy"))); +SND_SOC_DAILINK_DEFS(oct_tdm_rx_0_dummy, + DAILINK_COMP_ARRAY(COMP_CPU("snd-soc-dummy-dai")), + DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-rx")), + DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy"))); + +SND_SOC_DAILINK_DEFS(oct_tdm_tx_0_dummy, + DAILINK_COMP_ARRAY(COMP_CPU("snd-soc-dummy-dai")), + DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-tx")), + DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy"))); + SND_SOC_DAILINK_DEFS(hs_if0_tdm_rx_0_dummy, DAILINK_COMP_ARRAY(COMP_CPU("snd-soc-dummy-dai")), DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-rx")), @@ -1422,6 +1432,26 @@ SND_SOC_DAILINK_DEFS(hs_if2_tdm_tx_0_dummy, DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-tx")), DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy"))); +SND_SOC_DAILINK_DEFS(hs_if3_tdm_rx_0_dummy, + DAILINK_COMP_ARRAY(COMP_CPU("snd-soc-dummy-dai")), + DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-rx")), + DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy"))); + +SND_SOC_DAILINK_DEFS(hs_if3_tdm_tx_0_dummy, + DAILINK_COMP_ARRAY(COMP_CPU("snd-soc-dummy-dai")), + DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-tx")), + DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy"))); + +SND_SOC_DAILINK_DEFS(hs_if4_tdm_rx_0_dummy, + DAILINK_COMP_ARRAY(COMP_CPU("snd-soc-dummy-dai")), + DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-rx")), + DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy"))); + +SND_SOC_DAILINK_DEFS(hs_if4_tdm_tx_0_dummy, + DAILINK_COMP_ARRAY(COMP_CPU("snd-soc-dummy-dai")), + DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-tx")), + DAILINK_COMP_ARRAY(COMP_PLATFORM("snd-soc-dummy"))); + SND_SOC_DAILINK_DEFS(voicemmode1_hostless, DAILINK_COMP_ARRAY(COMP_CPU("VoiceMMode1")), DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")), From 701b2124c8a5ddecf99f385ba16fd31fb7359462 Mon Sep 17 00:00:00 2001 From: Manoj Kumar N D Date: Mon, 22 Aug 2022 08:51:51 +0530 Subject: [PATCH 6/7] dsp : search cal block using path in asm Send path to get the cal block in order to fetch topology and app type. Change-Id: I5ea2fe7da99f095c9bb31644bd65c0a2a6d0870f Signed-off-by: Manoj Kumar N D --- dsp/q6asm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dsp/q6asm.c b/dsp/q6asm.c index 167ea186fff3..ed84f225f017 100644 --- a/dsp/q6asm.c +++ b/dsp/q6asm.c @@ -11362,7 +11362,7 @@ static int q6asm_get_asm_topology_apptype(struct q6asm_cal_info *cal_info, struc goto unlock; } } else { - cal_block = q6asm_find_cal_by_buf_number(ASM_TOPOLOGY_CAL, 0, 0, ac->fedai_id); + cal_block = q6asm_find_cal_by_buf_number(ASM_TOPOLOGY_CAL, 0, 0, path); if (cal_block == NULL) { pr_debug("%s: Couldn't find cal_block with buf_number, re-routing " "search using CAL type only\n", __func__); From dee7082307f9254baa7057ce17b404bbfe9ca241 Mon Sep 17 00:00:00 2001 From: Sitong Date: Mon, 19 Sep 2022 18:08:21 +0800 Subject: [PATCH 7/7] asoc: use virt_sndcard_ctl node for sndcard status update In automotive hypervisor SSR case, csd2 need a while to handle resource, hence receiving virtual SSR event doesn't mean PVM is ready for audio usecase. AudioReach should wait for more precise events from PVM csd2. Expose an ioctl node for updating sndcard status via gsl virtualization. Change-Id: Ia5d1110dea970070706937c3bf5e42e1ccb1942f --- asoc/gvm_auto_spf_dummy.c | 43 ++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/asoc/gvm_auto_spf_dummy.c b/asoc/gvm_auto_spf_dummy.c index b5e248ed5830..07f0e9aaf0d7 100644 --- a/asoc/gvm_auto_spf_dummy.c +++ b/asoc/gvm_auto_spf_dummy.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -30,8 +31,6 @@ #include #include #include "msm_dailink.h" -#include -#include #include @@ -827,29 +826,42 @@ void msm_common_set_pdata(struct snd_soc_card *card, pdata->common_pdata = common_pdata; } -static int auto_spf_dummy_ssr_cb(struct notifier_block *this, - unsigned long code, - void *data) +#define AUTO_VIRT_SNDCARD_ONLINE 0 +#define AUTO_VIRT_SNDCARD_OFFLINE 1 + +static long virt_sndcard_ioctl(struct file *f, + unsigned int cmd, unsigned long arg) { + int ret = 0; struct snd_soc_card *card = platform_get_drvdata(spdev); - switch (code) { - case SUBSYS_BEFORE_SHUTDOWN: + switch (cmd) { + case AUTO_VIRT_SNDCARD_OFFLINE: snd_soc_card_change_online_state(card, 0); // change sndcard status to OFFLINE dev_info(&spdev->dev, "ssr restart, mark sndcard offline\n"); break; - case SUBSYS_AFTER_POWERUP: + case AUTO_VIRT_SNDCARD_ONLINE: snd_soc_card_change_online_state(card, 1); // change sndcard status to ONLINE dev_info(&spdev->dev, "ssr complete, mark sndcard online\n"); break; default: + pr_err("%s: ioctl not found\n", __func__); + ret = -EFAULT; break; } - return 0; + + return ret; } -static struct notifier_block auto_spf_dummy_ssr_notifier = { - .notifier_call = auto_spf_dummy_ssr_cb, +static const struct file_operations virt_sndcard_ctl_fops = { + .owner = THIS_MODULE, + .unlocked_ioctl = virt_sndcard_ioctl, +}; + +static struct miscdevice virt_sndcard_ctl_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = "virt_sndcard_ctl", + .fops = &virt_sndcard_ctl_fops, }; static int msm_asoc_machine_probe(struct platform_device *pdev) @@ -915,8 +927,11 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) spdev = pdev; - subsys_notif_register_notifier("adsp", &auto_spf_dummy_ssr_notifier); - dev_info(&pdev->dev, "Audio driver register for SSR complete\n"); + ret = misc_register(&virt_sndcard_ctl_misc); + if (ret) { + pr_err("Audio virtual sndcard ctrl register fail, ret=%d\n", ret); + } + dev_info(&pdev->dev, "Audio virtual sndcard ctrl register complete\n"); return 0; err: @@ -926,7 +941,7 @@ err: static int msm_asoc_machine_remove(struct platform_device *pdev) { - + misc_deregister(&virt_sndcard_ctl_misc); return 0; }