From df48f094251bea24c3a37192ba1faaf5ea728934 Mon Sep 17 00:00:00 2001 From: Sanjana B Date: Wed, 25 Sep 2019 14:20:47 +0530 Subject: [PATCH 01/59] asoc: qcs405: add support for dsd input Update machine driver to include support for dsd input. Change-Id: I37aa46484aa617f3ea543391b0edec4f5193d5bf Signed-off-by: Sanjana B --- asoc/qcs405.c | 190 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 186 insertions(+), 4 deletions(-) diff --git a/asoc/qcs405.c b/asoc/qcs405.c index 8e439467be..80ac564ec3 100644 --- a/asoc/qcs405.c +++ b/asoc/qcs405.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -178,6 +179,7 @@ struct dev_config { u32 sample_rate; u32 bit_format; u32 channels; + u32 data_format; }; struct msm_wsa881x_dev_info { @@ -206,6 +208,7 @@ struct msm_asoc_mach_data { u32 tdm_micb_voltage; u32 tdm_micb_current; bool codec_is_csra; + void __iomem *mi2s_dsd_mode[MI2S_MAX]; }; struct msm_asoc_wcd93xx_codec { @@ -478,6 +481,19 @@ static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four", static const char *const vi_feed_ch_text[] = {"One", "Two"}; static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE", "S32_LE"}; +static const char *const data_format_text[] = { + "LPCM", + "Compr", + "LPCM-60958", + "Compr-60958", + "NA4", + "NA5", + "NA6", + "NA7", + "NA8", + "DSD_DOP_W_MARKER", + "NATIVE_DSD_DATA" +}; static char const *slim_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32", "KHZ_44P1", "KHZ_48", "KHZ_88P2", "KHZ_96", "KHZ_176P4", @@ -616,6 +632,8 @@ static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_chs, mi2s_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text); static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_data_format, data_format_text); +static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_data_format, data_format_text); static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text); static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text); static SOC_ENUM_SINGLE_EXT_DECL(prim_meta_mi2s_rx_sample_rate, mi2s_rate_text); @@ -3251,7 +3269,8 @@ static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol, return idx; /* check for PRIM_MI2S and CSRAx config to allow 24bit BE config only */ - if ((PRIM_MI2S == idx) && (true==pdata->codec_is_csra)) + if ((idx == PRIM_MI2S) && (pdata->codec_is_csra == true) + && mi2s_rx_cfg[idx].data_format != AFE_DSD_DATA) { mi2s_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE; pr_debug("%s: Keeping default format idx[%d]_rx_format = %d, item = %d\n", @@ -3305,6 +3324,74 @@ static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol, return 0; } +static int msm_mi2s_tx_data_format_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int idx = mi2s_get_port_idx(kcontrol); + + if (idx < 0) + return idx; + + mi2s_tx_cfg[idx].data_format = ucontrol->value.enumerated.item[0]; + + pr_debug("%s: idx[%d]_data_format = %d, item = %d\n", __func__, + idx, mi2s_tx_cfg[idx].data_format, + ucontrol->value.enumerated.item[0]); + + return 0; +} + +static int msm_mi2s_rx_data_format_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int idx = mi2s_get_port_idx(kcontrol); + + if (idx < 0) + return idx; + + mi2s_rx_cfg[idx].data_format = ucontrol->value.enumerated.item[0]; + + pr_debug("%s: idx[%d]_data_format = %d, item = %d\n", __func__, + idx, mi2s_rx_cfg[idx].data_format, + ucontrol->value.enumerated.item[0]); + + return 0; +} + +static int msm_mi2s_tx_data_format_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int idx = mi2s_get_port_idx(kcontrol); + + if (idx < 0) + return idx; + + ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].data_format; + + pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__, + idx, mi2s_tx_cfg[idx].data_format, + ucontrol->value.enumerated.item[0]); + + return 0; +} + +static int msm_mi2s_rx_data_format_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int idx = mi2s_get_port_idx(kcontrol); + + if (idx < 0) + return idx; + + ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].data_format; + + pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__, + idx, mi2s_rx_cfg[idx].data_format, + ucontrol->value.enumerated.item[0]); + + return 0; +} + static int msm_meta_mi2s_get_port_idx(struct snd_kcontrol *kcontrol) { int idx = 0; @@ -4335,6 +4422,18 @@ static const struct snd_kcontrol_new msm_snd_controls[] = { msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put), SOC_ENUM_EXT("SEN_MI2S_TX Channels", sen_mi2s_tx_chs, msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put), + SOC_ENUM_EXT("PRIM_MI2S_TX DataFormat", mi2s_tx_data_format, + msm_mi2s_tx_data_format_get, + msm_mi2s_tx_data_format_put), + SOC_ENUM_EXT("QUAT_MI2S_TX DataFormat", mi2s_tx_data_format, + msm_mi2s_tx_data_format_get, + msm_mi2s_tx_data_format_put), + SOC_ENUM_EXT("PRIM_MI2S_RX DataFormat", mi2s_rx_data_format, + msm_mi2s_rx_data_format_get, + msm_mi2s_rx_data_format_put), + SOC_ENUM_EXT("QUAT_MI2S_RX DataFormat", mi2s_rx_data_format, + msm_mi2s_rx_data_format_get, + msm_mi2s_rx_data_format_put), SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format, msm_mi2s_rx_format_get, msm_mi2s_rx_format_put), SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format, @@ -6349,7 +6448,7 @@ static struct snd_soc_ops msm_fe_qos_ops = { static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) { - int ret = 0; + int ret = 0, val = 0; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai_link *dai_link = rtd->dai_link; @@ -6357,6 +6456,12 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS; struct snd_soc_card *card = rtd->card; struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); + int data_format; + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + data_format = mi2s_rx_cfg[index].data_format; + else + data_format = mi2s_tx_cfg[index].data_format; dev_dbg(rtd->card->dev, "%s: substream = %s stream = %d, dai name %s, dai ID %d\n", @@ -6382,6 +6487,9 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) mi2s_clk[index].clk_id = mi2s_ebit_clk[index]; fmt = SND_SOC_DAIFMT_CBM_CFM; } + + if (data_format == AFE_DSD_DATA) + fmt = SND_SOC_DAIFMT_CBM_CFS; ret = msm_mi2s_set_sclk(substream, true); if (ret < 0) { dev_err(rtd->card->dev, @@ -6396,9 +6504,34 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) __func__, index, ret); goto clk_off; } - if (pdata->mi2s_gpio_p[index]) - msm_cdc_pinctrl_select_active_state( + + if (pdata->mi2s_gpio_p[index]) { + if ((data_format == AFE_DSD_DATA) && + ((index == QUAT_MI2S) || + (index == PRIM_MI2S))) { + msm_cdc_pinctrl_select_alt_active_state( + pdata->mi2s_gpio_p[index]); + } else { + msm_cdc_pinctrl_select_active_state( pdata->mi2s_gpio_p[index]); + } + } + + if (index == QUAT_MI2S || index == PRIM_MI2S) { + switch (data_format) { + case AFE_DSD_DATA: + if (pdata->mi2s_dsd_mode[index]) { + val = ioread32( + pdata->mi2s_dsd_mode[index]); + val = val | 0x1; + iowrite32(val, + pdata->mi2s_dsd_mode[index]); + } + break; + default: + break; + } + } } ret = qcs405_send_island_vad_config(dai_link->id); @@ -6452,11 +6585,18 @@ static int msm_mi2s_snd_hw_free(struct snd_pcm_substream *substream) static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) { int ret; + int val; + int data_format; struct snd_soc_pcm_runtime *rtd = substream->private_data; int index = rtd->cpu_dai->id; struct snd_soc_card *card = rtd->card; struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + data_format = mi2s_rx_cfg[index].data_format; + else + data_format = mi2s_tx_cfg[index].data_format; + pr_debug("%s(): substream = %s stream = %d\n", __func__, substream->name, substream->stream); if (index < PRIM_MI2S || index >= MI2S_MAX) { @@ -6470,6 +6610,22 @@ static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream) msm_cdc_pinctrl_select_sleep_state( pdata->mi2s_gpio_p[index]); + if (index == QUAT_MI2S || index == PRIM_MI2S) { + switch (data_format) { + case AFE_DSD_DATA: + if (pdata->mi2s_dsd_mode[index]) { + val = ioread32( + pdata->mi2s_dsd_mode[index]); + val = val & ~1; + iowrite32(val, + pdata->mi2s_dsd_mode[index]); + } + break; + default: + break; + } + } + ret = msm_mi2s_set_sclk(substream, false); if (ret < 0) pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n", @@ -9750,6 +9906,7 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) const char *micb_supply_str1 = "tdm-vdd-micb"; const char *micb_voltage_str = "qcom,tdm-vdd-micb-voltage"; const char *micb_current_str = "qcom,tdm-vdd-micb-current"; + u32 v_base_addr; if (!pdev->dev.of_node) { dev_err(&pdev->dev, "No platform supplied from device tree\n"); @@ -9761,6 +9918,31 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) if (!pdata) return -ENOMEM; + ret = of_property_read_u32( + pdev->dev.of_node, "tcsr_i2s_dsd_prim", &v_base_addr); + if (ret) { + dev_err(&pdev->dev, "MUX addr invalid for MI2S dsd prim\n"); + } else { + pdata->mi2s_dsd_mode[PRIM_MI2S] = + devm_ioremap(&pdev->dev, v_base_addr, 4); + if (pdata->mi2s_dsd_mode[PRIM_MI2S] == NULL) { + pr_err("%s ioremap failure for muxsel virt addr dsd prim\n", + __func__); + } + } + ret = of_property_read_u32( + pdev->dev.of_node, "tcsr_i2s_dsd_quat", &v_base_addr); + if (ret) { + dev_err(&pdev->dev, "MUX addr invalid for MI2S dsd quat\n"); + } else { + pdata->mi2s_dsd_mode[QUAT_MI2S] = + devm_ioremap(&pdev->dev, v_base_addr, 4); + if (pdata->mi2s_dsd_mode[QUAT_MI2S] == NULL) { + pr_err("%s ioremap failure for muxsel virt addr dsd quat\n", + __func__); + } + } + /* test for ep92 HDMI bridge and update dai links accordingly */ ret = msm_detect_ep92_dev(pdev, card); if (ret) From ea56a753a82022bc0a38e845c92bfde6d8bc365e Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Tue, 1 Sep 2020 10:24:46 +0800 Subject: [PATCH 02/59] Revert "Revert "ASoC: bolero: check clock source before clock switch"" This reverts commit 68cbba47d0758a685535a28f3401bf0925e73039 as this causes AMIC SVA issue. Change-Id: I0e66c97dfc9499c30942ce2e3a123be58833eac8 Signed-off-by: Meng Wang --- asoc/codecs/bolero/bolero-cdc.c | 36 ++++++++++++++++++++++++ asoc/codecs/bolero/bolero-cdc.h | 13 +++++++++ asoc/codecs/bolero/tx-macro.c | 31 +++++++++++++++++++++ asoc/codecs/bolero/va-macro.c | 49 +++++++++++++++++++++++++++++++-- 4 files changed, 126 insertions(+), 3 deletions(-) diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index 7ffc2a28b9..4ab01eb06e 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -687,6 +687,7 @@ int bolero_register_macro(struct device *dev, u16 macro_id, bolero_mclk_mux_tbl[macro_id][MCLK_MUX0]; if (macro_id == TX_MACRO) { priv->macro_params[macro_id].reg_wake_irq = ops->reg_wake_irq; + priv->macro_params[macro_id].clk_switch = ops->clk_switch; priv->macro_params[macro_id].reg_evt_listener = ops->reg_evt_listener; priv->macro_params[macro_id].clk_enable = ops->clk_enable; @@ -761,6 +762,7 @@ void bolero_unregister_macro(struct device *dev, u16 macro_id) priv->macro_params[macro_id].dev = NULL; if (macro_id == TX_MACRO) { priv->macro_params[macro_id].reg_wake_irq = NULL; + priv->macro_params[macro_id].clk_switch = NULL; priv->macro_params[macro_id].reg_evt_listener = NULL; priv->macro_params[macro_id].clk_enable = NULL; } @@ -1061,6 +1063,40 @@ int bolero_register_wake_irq(struct snd_soc_component *component, } EXPORT_SYMBOL(bolero_register_wake_irq); +/** + * bolero_tx_clk_switch - Switch tx macro clock + * + * @component: pointer to codec component instance. + * + * @clk_src: 0 for TX_RCG and 1 for VA_RCG + * + * Returns 0 on success or -EINVAL on error. + */ +int bolero_tx_clk_switch(struct snd_soc_component *component, int clk_src) +{ + struct bolero_priv *priv = NULL; + int ret = 0; + + if (!component) + return -EINVAL; + + priv = snd_soc_component_get_drvdata(component); + if (!priv) + return -EINVAL; + + if (!bolero_is_valid_codec_dev(priv->dev)) { + dev_err(component->dev, "%s: invalid codec\n", __func__); + return -EINVAL; + } + + if (priv->macro_params[TX_MACRO].clk_switch) + ret = priv->macro_params[TX_MACRO].clk_switch(component, + clk_src); + + return ret; +} +EXPORT_SYMBOL(bolero_tx_clk_switch); + /** * bolero_tx_mclk_enable - Enable/Disable TX Macro mclk * diff --git a/asoc/codecs/bolero/bolero-cdc.h b/asoc/codecs/bolero/bolero-cdc.h index fe0aa64c0a..19b0c89d92 100644 --- a/asoc/codecs/bolero/bolero-cdc.h +++ b/asoc/codecs/bolero/bolero-cdc.h @@ -37,6 +37,11 @@ enum { BOLERO_ADC_MAX }; +enum { + CLK_SRC_TX_RCG = 0, + CLK_SRC_VA_RCG, +}; + enum { BOLERO_MACRO_EVT_RX_MUTE = 1, /* for RX mute/unmute */ BOLERO_MACRO_EVT_IMPED_TRUE, /* for imped true */ @@ -74,6 +79,7 @@ struct macro_ops { int (*set_port_map)(struct snd_soc_component *component, u32 uc, u32 size, void *data); int (*clk_div_get)(struct snd_soc_component *component); + int (*clk_switch)(struct snd_soc_component *component, int clk_src); int (*reg_evt_listener)(struct snd_soc_component *component, bool en); int (*clk_enable)(struct snd_soc_component *c, bool en); char __iomem *io_base; @@ -100,6 +106,7 @@ void bolero_clear_amic_tx_hold(struct device *dev, u16 adc_n); int bolero_runtime_resume(struct device *dev); int bolero_runtime_suspend(struct device *dev); int bolero_set_port_map(struct snd_soc_component *component, u32 size, void *data); +int bolero_tx_clk_switch(struct snd_soc_component *component, int clk_src); int bolero_register_event_listener(struct snd_soc_component *component, bool enable); void bolero_wsa_pa_on(struct device *dev, bool adie_lb); @@ -172,6 +179,12 @@ static inline int bolero_set_port_map(struct snd_soc_component *component, return 0; } +static inline int bolero_tx_clk_switch(struct snd_soc_component *component, + int clk_src) +{ + return 0; +} + static inline int bolero_register_event_listener( struct snd_soc_component *component, bool enable) diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index ad7681ebcf..5af73081da 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -2848,6 +2848,36 @@ static int tx_macro_clk_div_get(struct snd_soc_component *component) return tx_priv->dmic_clk_div; } +static int tx_macro_clk_switch(struct snd_soc_component *component, int clk_src) +{ + struct device *tx_dev = NULL; + struct tx_macro_priv *tx_priv = NULL; + int ret = 0; + + if (!component) + return -EINVAL; + + tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO); + if (!tx_dev) { + dev_err(component->dev, + "%s: null device for macro!\n", __func__); + return -EINVAL; + } + tx_priv = dev_get_drvdata(tx_dev); + if (!tx_priv) { + dev_err(component->dev, + "%s: priv is null for macro!\n", __func__); + return -EINVAL; + } + if (tx_priv->swr_ctrl_data) { + ret = swrm_wcd_notify( + tx_priv->swr_ctrl_data[0].tx_swr_pdev, + SWR_REQ_CLK_SWITCH, &clk_src); + } + + return ret; +} + static int tx_macro_core_vote(void *handle, bool enable) { struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle; @@ -3331,6 +3361,7 @@ static void tx_macro_init_ops(struct macro_ops *ops, ops->reg_wake_irq = tx_macro_reg_wake_irq; ops->set_port_map = tx_macro_set_port_map; ops->clk_div_get = tx_macro_clk_div_get; + ops->clk_switch = tx_macro_clk_switch; ops->reg_evt_listener = tx_macro_register_event_listener; ops->clk_enable = __tx_macro_mclk_enable; } diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index 14e55d6a33..13c90fe632 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -381,6 +381,7 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, int ret = 0; struct device *va_dev = NULL; struct va_macro_priv *va_priv = NULL; + int clk_src = 0; if (!va_macro_get_data(component, &va_dev, &va_priv, __func__)) return -EINVAL; @@ -393,12 +394,30 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: + if (va_priv->swr_ctrl_data) { + clk_src = CLK_SRC_VA_RCG; + ret = swrm_wcd_notify( + va_priv->swr_ctrl_data[0].va_swr_pdev, + SWR_REQ_CLK_SWITCH, &clk_src); + if (ret) + dev_dbg(va_dev, "%s: clock switch failed\n", + __func__); + } msm_cdc_pinctrl_set_wakeup_capable( va_priv->va_swr_gpio_p, false); break; case SND_SOC_DAPM_POST_PMD: msm_cdc_pinctrl_set_wakeup_capable( va_priv->va_swr_gpio_p, true); + if (va_priv->swr_ctrl_data) { + clk_src = CLK_SRC_TX_RCG; + ret = swrm_wcd_notify( + va_priv->swr_ctrl_data[0].va_swr_pdev, + SWR_REQ_CLK_SWITCH, &clk_src); + if (ret) + dev_dbg(va_dev, "%s: clock switch failed\n", + __func__); + } break; default: dev_err(va_priv->dev, @@ -436,8 +455,12 @@ static int va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, "%s: lpass audio hw enable failed\n", __func__); } + if (!ret) + if (bolero_tx_clk_switch(component, CLK_SRC_VA_RCG)) + dev_dbg(va_dev, "%s: clock switch failed\n", + __func__); if (va_priv->lpi_enable && - !va_priv->disable_afe_wakeup_event_listener) { + !va_priv->disable_afe_wakeup_event_listener) { bolero_register_event_listener(component, true); va_priv->register_event_listener = true; } @@ -447,6 +470,8 @@ static int va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, va_priv->register_event_listener = false; bolero_register_event_listener(component, false); } + if (bolero_tx_clk_switch(component, CLK_SRC_TX_RCG)) + dev_dbg(va_dev, "%s: clock switch failed\n",__func__); if (va_priv->lpass_audio_hw_vote) digital_cdc_rsc_mgr_hw_vote_disable( va_priv->lpass_audio_hw_vote); @@ -486,6 +511,7 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, int ret = 0; struct device *va_dev = NULL; struct va_macro_priv *va_priv = NULL; + int clk_src = 0; if (!va_macro_get_data(component, &va_dev, &va_priv, __func__)) return -EINVAL; @@ -506,10 +532,27 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, ret = bolero_tx_mclk_enable(component, 1); break; case SND_SOC_DAPM_POST_PMD: - if (va_priv->lpi_enable) + if (va_priv->lpi_enable) { + if (va_priv->version == BOLERO_VERSION_2_1) { + if (va_priv->swr_ctrl_data) { + clk_src = CLK_SRC_TX_RCG; + ret = swrm_wcd_notify( + va_priv->swr_ctrl_data[0].va_swr_pdev, + SWR_REQ_CLK_SWITCH, &clk_src); + if (ret) + dev_dbg(va_dev, + "%s: clock switch failed\n", + __func__); + } + } else if (bolero_tx_clk_switch(component, + CLK_SRC_TX_RCG)) { + dev_dbg(va_dev, "%s: clock switch failed\n", + __func__); + } va_macro_mclk_enable(va_priv, 0, true); - else + } else { bolero_tx_mclk_enable(component, 0); + } if (va_priv->tx_clk_status > 0) { bolero_clk_rsc_request_clock(va_priv->dev, From 5de0472da9d3a7a635f995204cded4d1d9171e3e Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Tue, 1 Sep 2020 15:41:37 +0800 Subject: [PATCH 03/59] asoc: bolero: switch clk to VA_CLK for LPI SVA When switching TX_CLK to VA_CLK, there could be some IRQ missing with current design. Switch the clk in bolero to avoid the corner case. Change-Id: Iec5cac16e026e4e46646894c546f1acb3fce4fa8 Signed-off-by: Meng Wang --- asoc/codecs/bolero/bolero-cdc.c | 2 +- asoc/codecs/bolero/tx-macro.c | 48 ++++++++++++++--- asoc/codecs/bolero/va-macro.c | 95 +++++++++++++++++++-------------- 3 files changed, 99 insertions(+), 46 deletions(-) diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index 4ab01eb06e..2015371903 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -1068,7 +1068,7 @@ EXPORT_SYMBOL(bolero_register_wake_irq); * * @component: pointer to codec component instance. * - * @clk_src: 0 for TX_RCG and 1 for VA_RCG + * @clk_src: clk source * * Returns 0 on success or -EINVAL on error. */ diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index 5af73081da..4ea66165ef 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -179,6 +179,7 @@ struct tx_macro_priv { int amic_sample_rate; bool lpi_enable; bool register_event_listener; + u16 current_clk_id; }; static bool tx_macro_get_data(struct snd_soc_component *component, @@ -1817,11 +1818,11 @@ static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v3[] = { SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", -1, SND_SOC_NOPM, 0, 0, tx_macro_tx_swr_clk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", -1, SND_SOC_NOPM, 0, 0, tx_macro_va_swr_clk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), }; @@ -2869,12 +2870,46 @@ static int tx_macro_clk_switch(struct snd_soc_component *component, int clk_src) "%s: priv is null for macro!\n", __func__); return -EINVAL; } - if (tx_priv->swr_ctrl_data) { - ret = swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); + dev_dbg(component->dev, + "%s: va_swr_clk_cnt %d, tx_swr_clk_cnt %d, tx_clk_status %d\n", + __func__, tx_priv->va_swr_clk_cnt, + tx_priv->tx_swr_clk_cnt, tx_priv->tx_clk_status); + if (tx_priv->current_clk_id == clk_src) { + dev_dbg(component->dev, + "%s: requested clk %d is same as current\n", + __func__, clk_src); + return 0; + } else if (tx_priv->va_swr_clk_cnt != 0 && tx_priv->tx_clk_status) { + ret = bolero_clk_rsc_request_clock(tx_priv->dev, + TX_CORE_CLK, + clk_src, + true); + if (ret) { + dev_dbg(component->dev, + "%s: request clock %d enable failed\n", + __func__, clk_src); + goto ret; + } + ret = bolero_clk_rsc_request_clock(tx_priv->dev, + TX_CORE_CLK, + tx_priv->current_clk_id, + false); + if (ret) { + dev_dbg(component->dev, + "%s: request clock disable failed\n", + __func__); + bolero_clk_rsc_request_clock(tx_priv->dev, + TX_CORE_CLK, + clk_src, + false); + goto ret; + } + tx_priv->current_clk_id = clk_src; + } else { + ret = -EBUSY; } +ret: return ret; } @@ -3460,6 +3495,7 @@ static int tx_macro_probe(struct platform_device *pdev) tx_macro_init_ops(&ops, tx_io_base); ops.clk_id_req = TX_CORE_CLK; ops.default_clk_id = TX_CORE_CLK; + tx_priv->current_clk_id = TX_CORE_CLK; ret = bolero_register_macro(&pdev->dev, TX_MACRO, &ops); if (ret) { dev_err(&pdev->dev, diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index 13c90fe632..8e32a46cab 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -381,7 +381,6 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, int ret = 0; struct device *va_dev = NULL; struct va_macro_priv *va_priv = NULL; - int clk_src = 0; if (!va_macro_get_data(component, &va_dev, &va_priv, __func__)) return -EINVAL; @@ -394,14 +393,31 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: - if (va_priv->swr_ctrl_data) { - clk_src = CLK_SRC_VA_RCG; - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - if (ret) - dev_dbg(va_dev, "%s: clock switch failed\n", + if (va_priv->default_clk_id != VA_CORE_CLK) { + ret = bolero_clk_rsc_request_clock(va_priv->dev, + va_priv->default_clk_id, + VA_CORE_CLK, + true); + if (ret) { + dev_dbg(component->dev, + "%s: request clock VA_CLK enable failed\n", __func__); + break; + } + ret = bolero_clk_rsc_request_clock(va_priv->dev, + va_priv->default_clk_id, + TX_CORE_CLK, + false); + if (ret) { + dev_dbg(component->dev, + "%s: request clock TX_CLK enable failed\n", + __func__); + bolero_clk_rsc_request_clock(va_priv->dev, + va_priv->default_clk_id, + VA_CORE_CLK, + false); + break; + } } msm_cdc_pinctrl_set_wakeup_capable( va_priv->va_swr_gpio_p, false); @@ -409,14 +425,31 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_POST_PMD: msm_cdc_pinctrl_set_wakeup_capable( va_priv->va_swr_gpio_p, true); - if (va_priv->swr_ctrl_data) { - clk_src = CLK_SRC_TX_RCG; - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - if (ret) - dev_dbg(va_dev, "%s: clock switch failed\n", + if (va_priv->default_clk_id == TX_CORE_CLK) { + ret = bolero_clk_rsc_request_clock(va_priv->dev, + va_priv->default_clk_id, + TX_CORE_CLK, + true); + if (ret) { + dev_dbg(component->dev, + "%s: request clock TX_CLK disable failed\n", __func__); + break; + } + ret = bolero_clk_rsc_request_clock(va_priv->dev, + va_priv->default_clk_id, + VA_CORE_CLK, + false); + if (ret) { + dev_dbg(component->dev, + "%s: request clock VA_CLK disable failed\n", + __func__); + bolero_clk_rsc_request_clock(va_priv->dev, + TX_CORE_CLK, + TX_CORE_CLK, + false); + break; + } } break; default: @@ -455,10 +488,11 @@ static int va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, "%s: lpass audio hw enable failed\n", __func__); } - if (!ret) - if (bolero_tx_clk_switch(component, CLK_SRC_VA_RCG)) + if (!ret) { + if (bolero_tx_clk_switch(component, VA_CORE_CLK)) dev_dbg(va_dev, "%s: clock switch failed\n", __func__); + } if (va_priv->lpi_enable && !va_priv->disable_afe_wakeup_event_listener) { bolero_register_event_listener(component, true); @@ -470,7 +504,7 @@ static int va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, va_priv->register_event_listener = false; bolero_register_event_listener(component, false); } - if (bolero_tx_clk_switch(component, CLK_SRC_TX_RCG)) + if (bolero_tx_clk_switch(component, TX_CORE_CLK)) dev_dbg(va_dev, "%s: clock switch failed\n",__func__); if (va_priv->lpass_audio_hw_vote) digital_cdc_rsc_mgr_hw_vote_disable( @@ -511,7 +545,6 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, int ret = 0; struct device *va_dev = NULL; struct va_macro_priv *va_priv = NULL; - int clk_src = 0; if (!va_macro_get_data(component, &va_dev, &va_priv, __func__)) return -EINVAL; @@ -533,22 +566,6 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, break; case SND_SOC_DAPM_POST_PMD: if (va_priv->lpi_enable) { - if (va_priv->version == BOLERO_VERSION_2_1) { - if (va_priv->swr_ctrl_data) { - clk_src = CLK_SRC_TX_RCG; - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - if (ret) - dev_dbg(va_dev, - "%s: clock switch failed\n", - __func__); - } - } else if (bolero_tx_clk_switch(component, - CLK_SRC_TX_RCG)) { - dev_dbg(va_dev, "%s: clock switch failed\n", - __func__); - } va_macro_mclk_enable(va_priv, 0, true); } else { bolero_tx_mclk_enable(component, 0); @@ -1946,15 +1963,15 @@ static const struct snd_soc_dapm_widget va_macro_dapm_widgets_v2[] = { VA_MACRO_AIF3_CAP, 0, va_aif3_cap_mixer_v2, ARRAY_SIZE(va_aif3_cap_mixer_v2)), - SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", -1, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", 0, SND_SOC_NOPM, 0, 0, va_macro_swr_pwr_event_v2, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("VA_TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("VA_TX_SWR_CLK", -1, SND_SOC_NOPM, 0, 0, va_macro_tx_swr_clk_event_v2, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", -1, SND_SOC_NOPM, 0, 0, va_macro_swr_clk_event_v2, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), }; @@ -1988,7 +2005,7 @@ static const struct snd_soc_dapm_widget va_macro_dapm_widgets_v3[] = { SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", -1, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", 0, SND_SOC_NOPM, 0, 0, va_macro_swr_pwr_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), }; From daacac5d4d515c2fd1cb432ec34409d8927d2192 Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Thu, 10 Sep 2020 16:38:18 +0800 Subject: [PATCH 04/59] asoc: add missed routing for Quinary TDM Add missed routing for Quinary TDM. Change-Id: I27dab27a06df63cb69ad47be62505c5bc0a61ea1 Signed-off-by: Meng Wang --- asoc/msm-pcm-routing-v2.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index dd0ba09ca8..6e7ba59d14 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -12964,6 +12964,22 @@ static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = { MSM_BACKEND_DAI_QUIN_TDM_RX_1, MSM_FRONTEND_DAI_MULTIMEDIA25, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, + MSM_BACKEND_DAI_QUIN_TDM_RX_1, + MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia32", SND_SOC_NOPM, + MSM_BACKEND_DAI_QUIN_TDM_RX_1, + MSM_FRONTEND_DAI_MULTIMEDIA32, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia33", SND_SOC_NOPM, + MSM_BACKEND_DAI_QUIN_TDM_RX_1, + MSM_FRONTEND_DAI_MULTIMEDIA33, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("MultiMedia34", SND_SOC_NOPM, + MSM_BACKEND_DAI_QUIN_TDM_RX_1, + MSM_FRONTEND_DAI_MULTIMEDIA34, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), }; From 9ed61ed4a226f32b51cecc02fcf9b72a946cebd3 Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Thu, 10 Sep 2020 17:14:02 +0800 Subject: [PATCH 05/59] asoc: remove AFE RX/TX from frontend dai AFE RX/TX are backend dai, not frontend dai. Remove them from msm-dai-fe.c. Change-Id: Ic24ce7e7bfcd692902f892ef8724f27f0bf59559 Signed-off-by: Meng Wang --- asoc/msm-dai-fe.c | 29 ----------------------------- asoc/msm-pcm-routing-v2.c | 1 - 2 files changed, 30 deletions(-) diff --git a/asoc/msm-dai-fe.c b/asoc/msm-dai-fe.c index a9192bb3e5..0f653dfc2c 100644 --- a/asoc/msm-dai-fe.c +++ b/asoc/msm-dai-fe.c @@ -685,35 +685,6 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { .name = "USBAUDIO_HOSTLESS", .probe = fe_dai_probe, }, - { - .playback = { - .stream_name = "AFE Playback", - .aif_name = "PCM_RX", - .rates = (SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .capture = { - .stream_name = "AFE Capture", - .aif_name = "PCM_TX", - .rates = (SNDRV_PCM_RATE_8000 | - SNDRV_PCM_RATE_16000 | - SNDRV_PCM_RATE_48000), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .channels_min = 1, - .channels_max = 2, - .rate_min = 8000, - .rate_max = 48000, - }, - .ops = &msm_fe_dai_ops, - .name = "AFE-PROXY", - .probe = fe_dai_probe, - }, { .playback = { .stream_name = "HDMI_HOSTLESS Playback", diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index dd0ba09ca8..609e768ee0 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -28183,7 +28183,6 @@ static const struct snd_soc_dapm_route intercon[] = { {"BE_OUT", NULL, "SLIMBUS_3_RX"}, {"BE_OUT", NULL, "INT_BT_SCO_RX"}, {"BE_OUT", NULL, "INT_FM_RX"}, - {"BE_OUT", NULL, "PCM_RX"}, {"BE_OUT", NULL, "SLIMBUS_3_RX"}, {"BE_OUT", NULL, "VOICE_PLAYBACK_TX"}, {"BE_OUT", NULL, "VOICE2_PLAYBACK_TX"}, From 9ec95bb9c802949888bab323698f6ab77ee0fc1c Mon Sep 17 00:00:00 2001 From: Saurav Kumar Date: Tue, 18 Aug 2020 18:33:35 +0530 Subject: [PATCH 06/59] dsp: add change to fix use-after-free issue Add change to properly handle the pointers by setting them to NULL after free and adding some null checks before dereferencing. Change-Id: I3e52b9a6885a8d8a91c09f75fe92ba69e3eb555f Signed-off-by: Saurav Kumar --- dsp/msm_audio_ion.c | 9 ++++++++- dsp/q6asm.c | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/dsp/msm_audio_ion.c b/dsp/msm_audio_ion.c index ac89b2a29b..32ecac808b 100644 --- a/dsp/msm_audio_ion.c +++ b/dsp/msm_audio_ion.c @@ -69,7 +69,7 @@ static int msm_audio_dma_buf_map(struct dma_buf *dma_buf, bool cma_mem) { - struct msm_audio_alloc_data *alloc_data; + struct msm_audio_alloc_data *alloc_data = NULL; struct device *cb_dev; unsigned long ionflag = 0; int rc = 0; @@ -138,6 +138,7 @@ detach_dma_buf: alloc_data->attach); free_alloc_data: kfree(alloc_data); + alloc_data = NULL; return rc; } @@ -179,6 +180,7 @@ static int msm_audio_dma_buf_unmap(struct dma_buf *dma_buf, bool cma_mem) list_del(&(alloc_data->list)); kfree(alloc_data); + alloc_data = NULL; break; } } @@ -321,6 +323,11 @@ static int msm_audio_ion_map_buf(struct dma_buf *dma_buf, dma_addr_t *paddr, { int rc = 0; + if (!dma_buf || !paddr || !vaddr || !plen) { + pr_err("%s: Invalid params\n", __func__); + return -EINVAL; + } + rc = msm_audio_ion_get_phys(dma_buf, paddr, plen); if (rc) { pr_err("%s: ION Get Physical for AUDIO failed, rc = %d\n", diff --git a/dsp/q6asm.c b/dsp/q6asm.c index 5e9b826ff7..0fc821d724 100644 --- a/dsp/q6asm.c +++ b/dsp/q6asm.c @@ -8487,6 +8487,7 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, if (mmap_region_cmd == NULL) { rc = -EINVAL; kfree(buffer_node); + buffer_node = NULL; return rc; } mmap_regions = (struct avs_cmd_shared_mem_map_regions *) @@ -8523,6 +8524,7 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, mmap_regions->hdr.opcode, rc); rc = -EINVAL; kfree(buffer_node); + buffer_node = NULL; goto fail_cmd; } @@ -8534,6 +8536,7 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, pr_err("%s: timeout. waited for memory_map\n", __func__); rc = -ETIMEDOUT; kfree(buffer_node); + buffer_node = NULL; goto fail_cmd; } if (atomic_read(&ac->mem_state) > 0) { @@ -8543,6 +8546,7 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, rc = adsp_err_get_lnx_err_code( atomic_read(&ac->mem_state)); kfree(buffer_node); + buffer_node = NULL; goto fail_cmd; } mutex_lock(&ac->cmd_lock); @@ -8562,6 +8566,7 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, rc = 0; fail_cmd: kfree(mmap_region_cmd); + mmap_region_cmd = NULL; return rc; } EXPORT_SYMBOL(q6asm_memory_map_regions); @@ -8657,6 +8662,7 @@ fail_cmd: if (buf_node->buf_phys_addr == buf_add) { list_del(&buf_node->list); kfree(buf_node); + buf_node = NULL; break; } } From d207401afe71928c6ec51bbccd7eaa1f9497ea84 Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Fri, 11 Sep 2020 13:07:41 +0530 Subject: [PATCH 07/59] asoc: codec: add delay if regmap is not registered Add delay if the regmap of wsa slave is not registered to avoid Null pointer dereference. Change-Id: Ic3e5d1cc7c3fc33f4f4c480708cd562b73c1a04b Signed-off-by: Prasad Kumpatla --- asoc/codecs/wsa881x-analog.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/asoc/codecs/wsa881x-analog.c b/asoc/codecs/wsa881x-analog.c index 690d5d1b67..2a07f99285 100644 --- a/asoc/codecs/wsa881x-analog.c +++ b/asoc/codecs/wsa881x-analog.c @@ -34,6 +34,7 @@ #define SPK_GAIN_12DB 4 #define WIDGET_NAME_MAX_SIZE 80 +#define REGMAP_REGISTER_CHECK_RETRY 30 #define MAX_NAME_LEN 30 #define WSA881X_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ @@ -102,7 +103,7 @@ static int32_t wsa881x_resource_acquire(struct snd_soc_component *component, const char *wsa_tz_names[] = {"wsa881x.0e", "wsa881x.0f"}; -struct wsa881x_pdata wsa_pdata[MAX_WSA881X_DEVICE]; +static struct wsa881x_pdata wsa_pdata[MAX_WSA881X_DEVICE]; static bool pinctrl_init; @@ -1142,6 +1143,7 @@ static int wsa881x_probe(struct snd_soc_component *component) { struct i2c_client *client; int ret = 0; + int retry = REGMAP_REGISTER_CHECK_RETRY; int wsa881x_index = 0; struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); @@ -1165,6 +1167,16 @@ static int wsa881x_probe(struct snd_soc_component *component) wsa_pdata[wsa881x_index].tz_pdata.wsa_temp_reg_read = wsa881x_temp_reg_read; snd_soc_component_set_drvdata(component, &wsa_pdata[wsa881x_index]); + while (retry) { + if (wsa_pdata[wsa881x_index].regmap[WSA881X_ANALOG_SLAVE] + != NULL) + break; + msleep(100); + retry--; + } + if (!retry) + dev_err(&client->dev, "%s: max retry expired and regmap of\n" + "analog slave not initilized\n", __func__); wsa881x_init_thermal(&wsa_pdata[wsa881x_index].tz_pdata); INIT_DELAYED_WORK(&wsa_pdata[wsa881x_index].ocp_ctl_work, wsa881x_ocp_ctl_work); @@ -1382,9 +1394,9 @@ static int wsa881x_i2c_probe(struct i2c_client *client, } if (pdata->status == WSA881X_STATUS_I2C) { - dev_dbg(&client->dev, "%s:probe for other slaves\n" - "devices of codec I2C slave Addr = %x\n", - __func__, client->addr); + dev_info(&client->dev, "%s:probe for other slaves\n" + "devices of codec I2C slave Addr = %x wsa_idx = %d\n", + __func__, client->addr, wsa881x_index); dev_dbg(&client->dev, "%s:wsa_idx = %d SLAVE = %d\n", __func__, wsa881x_index, WSA881X_ANALOG_SLAVE); pdata->regmap[WSA881X_ANALOG_SLAVE] = @@ -1402,6 +1414,7 @@ static int wsa881x_i2c_probe(struct i2c_client *client, client->dev.platform_data = pdata; i2c_set_clientdata(client, pdata); pdata->client[WSA881X_ANALOG_SLAVE] = client; + pdata->regmap_flag = true; if (pdata->version == WSA881X_2_0) wsa881x_update_regmap_2_0( pdata->regmap[WSA881X_ANALOG_SLAVE], @@ -1467,7 +1480,6 @@ static int wsa881x_i2c_probe(struct i2c_client *client, goto err; } pdata->client[WSA881X_DIGITAL_SLAVE] = client; - pdata->regmap_flag = true; ret = check_wsa881x_presence(client); if (ret < 0) { dev_err(&client->dev, @@ -1551,6 +1563,8 @@ static int wsa881x_i2c_probe(struct i2c_client *client, component->name_prefix = pdata->wsa881x_name_prefix; pdata->status = WSA881X_STATUS_I2C; + dev_info(&client->dev, "%s:pdata status changed to I2C\n", + __func__); goto err1; } err_mem: From 265ff22772e606b55dc03266e3f92a1cb8e84e55 Mon Sep 17 00:00:00 2001 From: "Vangala, Amarnath" Date: Mon, 14 Sep 2020 12:44:05 +0530 Subject: [PATCH 08/59] ASOC: Disable Temperature sensor of WSA881x for holi Temperature sensor of WSA881x is not used in holi. Hence disable compilation. Change-Id: I9fe1d297413c0029970c7719aad6c04ee3f84ab4 Signed-off-by: Vangala, Amarnath --- config/holiauto.conf | 1 + config/holiautoconf.h | 1 + 2 files changed, 2 insertions(+) diff --git a/config/holiauto.conf b/config/holiauto.conf index e46212b20f..d0d6dd0456 100644 --- a/config/holiauto.conf +++ b/config/holiauto.conf @@ -29,6 +29,7 @@ export CONFIG_SND_SOC_WCD938X_SLAVE=m export CONFIG_SND_SOC_WCD937X=m export CONFIG_SND_SOC_WCD937X_SLAVE=m export CONFIG_SND_SOC_WSA881X_ANALOG=m +export CONFIG_WSA881X_TEMP_SENSOR_DISABLE=m export CONFIG_SND_SOC_HOLI=m export CONFIG_SND_EVENT=m export CONFIG_TDM_DISABLE=m diff --git a/config/holiautoconf.h b/config/holiautoconf.h index b1758be036..2eb9a6d5a4 100644 --- a/config/holiautoconf.h +++ b/config/holiautoconf.h @@ -33,6 +33,7 @@ #define CONFIG_SND_SOC_WCD937X 1 #define CONFIG_SND_SOC_WCD937X_SLAVE 1 #define CONFIG_SND_SOC_WSA881X_ANALOG 1 +#define CONFIG_WSA881X_TEMP_SENSOR_DISABLE 1 #define CONFIG_SND_SOC_HOLI 1 #define CONFIG_SND_EVENT 1 #define CONFIG_TDM_DISABLE 1 From 76e5e82e791de7f3370a9c4bc8da209e5ef7fd45 Mon Sep 17 00:00:00 2001 From: "Vangala, Amarnath" Date: Sun, 13 Sep 2020 01:02:56 +0530 Subject: [PATCH 09/59] ASOC: add support to disable WSA881x temperature sensor Add support to disable compilation of temperature sensor for wsa881x analog module, when not needed. Change-Id: I054e90d4b1abae3c0cdc6623b1f688120ba87dbd Signed-off-by: Vangala, Amarnath --- asoc/codecs/Kbuild | 2 ++ asoc/codecs/wsa881x-temp-sensor.h | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/asoc/codecs/Kbuild b/asoc/codecs/Kbuild index 3d302bd7c2..e861791dd1 100644 --- a/asoc/codecs/Kbuild +++ b/asoc/codecs/Kbuild @@ -164,8 +164,10 @@ ifdef CONFIG_SND_SOC_WSA881X_ANALOG WSA881X_ANALOG_OBJS += wsa881x-analog.o WSA881X_ANALOG_OBJS += wsa881x-tables-analog.o WSA881X_ANALOG_OBJS += wsa881x-regmap-analog.o +ifndef CONFIG_WSA881X_TEMP_SENSOR_DISABLE WSA881X_ANALOG_OBJS += wsa881x-temp-sensor.o endif +endif ifdef CONFIG_SND_SOC_MSM_STUB STUB_OBJS += msm_stub.o endif diff --git a/asoc/codecs/wsa881x-temp-sensor.h b/asoc/codecs/wsa881x-temp-sensor.h index fbb5941aba..483560db2b 100644 --- a/asoc/codecs/wsa881x-temp-sensor.h +++ b/asoc/codecs/wsa881x-temp-sensor.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -/* Copyright (c) 2015, 2018 The Linux Foundation. All rights reserved. +/* Copyright (c) 2015, 2018, 2020 The Linux Foundation. All rights reserved. */ #ifndef WSA881X_TEMP_SENSOR_H #define WSA881X_TEMP_SENSOR_H @@ -29,7 +29,13 @@ struct wsa881x_tz_priv { int curr_temp; }; -int wsa881x_get_temp(struct thermal_zone_device *tz_dev, int *temp); +#ifndef CONFIG_WSA881X_TEMP_SENSOR_DISABLE int wsa881x_init_thermal(struct wsa881x_tz_priv *tz_pdata); void wsa881x_deinit_thermal(struct thermal_zone_device *tz_dev); +int wsa881x_get_temp(struct thermal_zone_device *tz_dev, int *temp); +#else +int wsa881x_init_thermal(struct wsa881x_tz_priv *tz_pdata){ return 0; } +void wsa881x_deinit_thermal(struct thermal_zone_device *tz_dev){} +int wsa881x_get_temp(struct thermal_zone_device *tz_dev, int *temp){ return 0; } +#endif #endif From b53d514f0db2046c1473f9bde725e0bbf13e19e0 Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Tue, 15 Sep 2020 16:03:13 +0800 Subject: [PATCH 10/59] dsp: ion: avoid dma_buf_put twice when msm_audio_ion_map_buf fails Update logic to avoid calling dma_buf_put twice when msm_audio_ion_map_buf fails. Change-Id: I6958ec55dc78f245e93fbaedf085873fe0f4cb93 Signed-off-by: Meng Wang --- dsp/msm_audio_ion_vm.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/dsp/msm_audio_ion_vm.c b/dsp/msm_audio_ion_vm.c index 1d3002985b..2cf2861d9f 100644 --- a/dsp/msm_audio_ion_vm.c +++ b/dsp/msm_audio_ion_vm.c @@ -582,17 +582,13 @@ int msm_audio_ion_alloc(struct dma_buf **dma_buf, size_t bufsz, rc = msm_audio_ion_map_buf(*dma_buf, paddr, plen, vaddr); if (rc) { pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc); - goto err_dma_buf; + goto err; } pr_debug("%s: mapped address = %pK, size=%zd\n", __func__, *vaddr, bufsz); memset(*vaddr, 0, bufsz); - return rc; - -err_dma_buf: - dma_buf_put(*dma_buf); err: return rc; } From c397018921c7aae08755dcdd0dd0f6c2ebe7b5d9 Mon Sep 17 00:00:00 2001 From: Tahir Dawson Date: Fri, 11 Sep 2020 18:27:45 -0400 Subject: [PATCH 11/59] audio-kernel: include sa8155 config Change-Id: Icceeafc2a6d0996e39a05f39246aaf3f5e99404f Signed-off-by: Deru Wang Signed-off-by: Tahir Dawson --- Makefile | 9 ++++++++- config/sa8155auto.conf | 1 + config/sa8155autoconf.h | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f700f9f3df..a74d1c6eac 100644 --- a/Makefile +++ b/Makefile @@ -25,8 +25,11 @@ endif ifeq ($(CONFIG_ARCH_HOLI), y) include $(srctree)/techpack/audio/config/holiauto.conf endif +ifeq ($(CONFIG_ARCH_SA8155), y) +include $(srctree)/techpack/audio/config/sa8155auto.conf +export +endif endif - # Use USERINCLUDE when you must reference the UAPI directories only. USERINCLUDE += \ -I$(srctree)/techpack/audio/include/uapi/audio @@ -66,6 +69,10 @@ ifeq ($(CONFIG_ARCH_HOLI), y) LINUXINCLUDE += \ -include $(srctree)/techpack/audio/config/holiautoconf.h endif +ifeq ($(CONFIG_ARCH_SA8155), y) +LINUXINCLUDE += \ + -include $(srctree)/techpack/audio/config/sa8155autoconf.h +endif obj-y += soc/ obj-y += dsp/ diff --git a/config/sa8155auto.conf b/config/sa8155auto.conf index bf5b9cdae1..e6506760a4 100644 --- a/config/sa8155auto.conf +++ b/config/sa8155auto.conf @@ -13,3 +13,4 @@ CONFIG_SND_SOC_MSM_STUB=m CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m CONFIG_MSM_QDSP6V2_CODECS=m CONFIG_SND_EVENT=m +CONFIG_SND_SOC_SA8155=m diff --git a/config/sa8155autoconf.h b/config/sa8155autoconf.h index 167451639a..7470fc6b5c 100644 --- a/config/sa8155autoconf.h +++ b/config/sa8155autoconf.h @@ -17,3 +17,4 @@ #define CONFIG_SND_SOC_MSM_HDMI_CODEC_RX 1 #define CONFIG_MSM_QDSP6V2_CODECS 1 #define CONFIG_SND_EVENT 1 +#define CONFIG_SND_SOC_SA8155 1 From d6ccb466fbcc2cbb13dba7fe7d9c5ff5cacfff72 Mon Sep 17 00:00:00 2001 From: Vignesh Kulothungan Date: Fri, 11 Sep 2020 10:34:34 -0700 Subject: [PATCH 12/59] ASoC: swr-dmic: fix kw error in dmic_swr_ctrl Add array bounds check for index before accessing tx_master_port_map. Change-Id: I52a8dbdaf40974a45e86b3dca4caa27d88a7b864 Signed-off-by: Vignesh Kulothungan --- asoc/codecs/swr-dmic.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/asoc/codecs/swr-dmic.c b/asoc/codecs/swr-dmic.c index fb612df818..3ce3d4ad10 100644 --- a/asoc/codecs/swr-dmic.c +++ b/asoc/codecs/swr-dmic.c @@ -220,11 +220,18 @@ static int dmic_swr_ctrl(struct snd_soc_dapm_widget *w, u8 port_type = 0; u8 port_id = w->shift; + if (port_id >= SWR_DMIC_MAX_PORTS) + { + dev_err(component->dev, "%s: invalid port id: %d\n", + __func__, port_id); + return -EINVAL; + } + /* * Port 1 is high quality / 2.4 or 3.072 Mbps * Port 2 is listen low power / 0.6 or 0.768 Mbps */ - if(port_id == SWR_DMIC_HIFI_PORT) + if (port_id == SWR_DMIC_HIFI_PORT) ch_rate = SWR_CLK_RATE_2P4MHZ; else ch_rate = SWR_CLK_RATE_0P6MHZ; From 902fbb8b5ddb009d0cc53fa5a2847085d4dfde8b Mon Sep 17 00:00:00 2001 From: Akhil Karuturi Date: Tue, 15 Sep 2020 23:24:20 -0700 Subject: [PATCH 13/59] Asoc: fix integer overflow for long duration offload playback update runtime total bytes transferred and received in compress driver. Change-Id: I1bd129e18681fcf10a27efaa061594081114c1fb Signed-off-by: Akhil Karuturi --- asoc/msm-compress-q6-v2.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c index 09c5b0f43d..feb09b9c74 100644 --- a/asoc/msm-compress-q6-v2.c +++ b/asoc/msm-compress-q6-v2.c @@ -3083,18 +3083,18 @@ static int msm_compr_pointer(struct snd_compr_stream *cstream, spin_lock_irqsave(&prtd->lock, flags); tstamp.sampling_rate = prtd->sample_rate; tstamp.byte_offset = prtd->byte_offset; - if (cstream->direction == SND_COMPRESS_PLAYBACK) + if (cstream->direction == SND_COMPRESS_PLAYBACK) { + runtime->total_bytes_transferred = prtd->copied_total; tstamp.copied_total = prtd->copied_total; - else if (cstream->direction == SND_COMPRESS_CAPTURE) + } + else if (cstream->direction == SND_COMPRESS_CAPTURE) { + runtime->total_bytes_available = prtd->received_total; tstamp.copied_total = prtd->received_total; + } first_buffer = prtd->first_buffer; if (atomic_read(&prtd->error)) { pr_err_ratelimited("%s Got RESET EVENTS notification, return error\n", __func__); - if (cstream->direction == SND_COMPRESS_PLAYBACK) - runtime->total_bytes_transferred = prtd->copied_total; - else - runtime->total_bytes_available = prtd->received_total; tstamp.pcm_io_frames = 0; memcpy(arg, &tstamp, sizeof(struct snd_compr_tstamp)); spin_unlock_irqrestore(&prtd->lock, flags); From d49356ea7effd2c74330f81d3ec0401499990c4e Mon Sep 17 00:00:00 2001 From: Tahir Dawson Date: Wed, 16 Sep 2020 19:40:49 -0400 Subject: [PATCH 14/59] ASoC: fix typo in QUIN_TDM_TX_7 Hostless dai link Change-Id: I6da481c3774a6751f28b94243f951a2fc1aa43e2 Signed-of-by: Tahir Dawson --- asoc/msm_dailink.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asoc/msm_dailink.h b/asoc/msm_dailink.h index faa9ee032b..ac62e11871 100644 --- a/asoc/msm_dailink.h +++ b/asoc/msm_dailink.h @@ -318,7 +318,7 @@ SND_SOC_DAILINK_DEFS(quin_tdm_rx_7_hostless, DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless"))); SND_SOC_DAILINK_DEFS(quin_tdm_tx_7_hostless, - DAILINK_COMP_ARRAY(COMP_CPU("QUIN_TDM_RX_7_HOSTLESS")), + DAILINK_COMP_ARRAY(COMP_CPU("QUIN_TDM_TX_7_HOSTLESS")), DAILINK_COMP_ARRAY(COMP_CODEC("snd-soc-dummy", "snd-soc-dummy-dai")), DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless"))); From b11e8d0718d9cdf5bdae90605f886f210e2ae7bc Mon Sep 17 00:00:00 2001 From: Sudheer Papothi Date: Sat, 5 Sep 2020 06:55:45 +0530 Subject: [PATCH 15/59] ASoC: lahaina: add audio core vote state in mi2s Add audio core vote state variable for mi2s interfaces. Enable it during interface startup and disable it during mi2s_disable_audio_vote, auxpcm init/deinit. Change-Id: I798e15f489b1cb1816e424e1b543016d757016e4 Signed-off-by: Sudheer Papothi Signed-off-by: Vignesh Kulothungan --- asoc/lahaina.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/asoc/lahaina.c b/asoc/lahaina.c index 10fc113356..c30de18277 100644 --- a/asoc/lahaina.c +++ b/asoc/lahaina.c @@ -310,6 +310,7 @@ struct mi2s_conf { struct mutex lock; u32 ref_cnt; u32 msm_is_mi2s_master; + bool audio_core_vote; }; static u32 mi2s_ebit_clk[MI2S_MAX] = { @@ -5242,7 +5243,8 @@ void mi2s_disable_audio_vote(struct snd_pcm_substream *substream) return; } - if (IS_MSM_INTERFACE_MI2S(index) && IS_FRACTIONAL(sample_rate)) { + if ((IS_MSM_INTERFACE_MI2S(index) && IS_FRACTIONAL(sample_rate)) || + mi2s_intf_conf[index].audio_core_vote) { if (pdata->lpass_audio_hw_vote != NULL) { if (--pdata->core_audio_vote_count == 0) { clk_disable_unprepare( @@ -5251,6 +5253,7 @@ void mi2s_disable_audio_vote(struct snd_pcm_substream *substream) pr_err("%s: audio vote mismatch\n", __func__); pdata->core_audio_vote_count = 0; } + mi2s_intf_conf[index].audio_core_vote = false; } else { pr_err("%s: Invalid lpass audio hw node\n", __func__); } @@ -5312,6 +5315,7 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) } } pdata->core_audio_vote_count++; + mi2s_intf_conf[index].audio_core_vote = true; } if (++mi2s_intf_conf[index].ref_cnt == 1) { @@ -7808,6 +7812,7 @@ static void msm_i2s_auxpcm_init(struct platform_device *pdev) for (count = 0; count < MI2S_MAX; count++) { mutex_init(&mi2s_intf_conf[count].lock); mi2s_intf_conf[count].ref_cnt = 0; + mi2s_intf_conf[count].audio_core_vote = false; } ret = of_property_read_u32_array(pdev->dev.of_node, @@ -7832,6 +7837,7 @@ static void msm_i2s_auxpcm_deinit(void) mutex_destroy(&mi2s_intf_conf[count].lock); mi2s_intf_conf[count].ref_cnt = 0; mi2s_intf_conf[count].msm_is_mi2s_master = 0; + mi2s_intf_conf[count].audio_core_vote = false; } } From 0cdc710d1d7d9d12ed1b8a97b7356c1cf373e156 Mon Sep 17 00:00:00 2001 From: Xiaoyu Ye Date: Wed, 16 Sep 2020 22:12:13 -0700 Subject: [PATCH 16/59] ASoC: wcd938x: clear digital CDC analog CLK bit 0x08 Update the bit 0x08 of WCD938X_DIGITAL_CDC_ANA_CLK_CTL to 0 during DAPM post PMD. Change-Id: Iea7d3878e9c56f8e219240007b8dbe30683d3161 Signed-off-by: Xiaoyu Ye --- asoc/codecs/wcd938x/wcd938x.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c index 2497980953..093afff053 100644 --- a/asoc/codecs/wcd938x/wcd938x.c +++ b/asoc/codecs/wcd938x/wcd938x.c @@ -1883,9 +1883,12 @@ static int wcd938x_enable_req(struct snd_soc_dapm_widget *w, default: break; } - if (wcd938x->adc_count == 0) + if (wcd938x->adc_count == 0) { snd_soc_component_update_bits(component, WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x00); + snd_soc_component_update_bits(component, + WCD938X_DIGITAL_CDC_ANA_CLK_CTL, 0x08, 0x00); + } break; }; return ret; From ba1a97d976fd46453db87da3edc423a7fd16c790 Mon Sep 17 00:00:00 2001 From: Vatsal Bucha Date: Wed, 16 Sep 2020 22:50:17 -0700 Subject: [PATCH 17/59] Revert "ASoC: mbhc: Call impedance detection routine before get imped" This reverts commit 892efe8d09464c8a6c278365ab6fd5ffbbabae94. Change-Id: Ica020594b0470cd297cd84ca6b737bde8dce33f3 --- asoc/codecs/wcd-mbhc-v2.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c index 3194724ee2..08d7678b7d 100644 --- a/asoc/codecs/wcd-mbhc-v2.c +++ b/asoc/codecs/wcd-mbhc-v2.c @@ -515,15 +515,6 @@ static void wcd_mbhc_set_and_turnoff_hph_padac(struct wcd_mbhc *mbhc) int wcd_mbhc_get_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, uint32_t *zr) { - int detection_type = -EINVAL; - - WCD_MBHC_REG_READ(WCD_MBHC_MECH_DETECTION_TYPE, detection_type); - /* Call compute impedance only when accessory is inserted */ - if (!detection_type) { - if (mbhc->mbhc_cb->compute_impedance) - mbhc->mbhc_cb->compute_impedance(mbhc, - &mbhc->zl, &mbhc->zr); - } *zl = mbhc->zl; *zr = mbhc->zr; From 56dbe8147e1542419add6991da195580876f6f3c Mon Sep 17 00:00:00 2001 From: Xiaoyu Ye Date: Wed, 2 Sep 2020 00:20:59 -0700 Subject: [PATCH 18/59] dsp: add support for audio use cases to use afe topo deregister To handle erroneous scenario when an afe port's island mode is mismatched with its audio use case's island mode, add support for all audio use cases to deregister previously created afe topology if an audio use case's afe port failed to start but its topology has already been set in ADSP previously. Change-Id: I0176eb09d313150541c6946b1b3001604e7c04c7 Signed-off-by: Xiaoyu Ye --- dsp/q6afe.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 0daa70ada7..dfb88d1780 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -236,6 +236,7 @@ struct afe_ctl { int dev_acdb_id[AFE_MAX_PORTS]; routing_cb rt_cb; struct audio_uevent_data *uevent_data; + uint32_t afe_port_start_failed[AFE_MAX_PORTS]; /* cal info for AFE */ struct afe_fw_info *fw_data; u32 island_mode[AFE_MAX_PORTS]; @@ -5643,13 +5644,13 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, /* One time call: only for first time */ afe_send_custom_topology(); /* - * Deregister existing afe topology before - * sending a new one for VA use cases only + * Deregister existing afe topology before sending a new + * one if the previous afe port start failed for this port */ - if (port_id == AFE_PORT_ID_VA_CODEC_DMA_TX_0 || - port_id == AFE_PORT_ID_VA_CODEC_DMA_TX_1 || - port_id == AFE_PORT_ID_VA_CODEC_DMA_TX_2) + if (this_afe.afe_port_start_failed[port_index] == true) { afe_port_topology_deregister(port_id); + this_afe.afe_port_start_failed[port_index] = false; + } afe_send_port_topology_id(port_id); afe_send_cal(port_id); afe_send_hw_delay(port_id, rate); @@ -5966,6 +5967,8 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, ret = afe_send_cmd_port_start(port_id); fail_cmd: + if (ret) + this_afe.afe_port_start_failed[port_index] = true; mutex_unlock(&this_afe.afe_cmd_lock); return ret; } @@ -11164,6 +11167,7 @@ int __init afe_init(void) this_afe.power_mode[i] = 0; this_afe.vad_cfg[i].is_enable = 0; this_afe.vad_cfg[i].pre_roll = 0; + this_afe.afe_port_start_failed[i] = false; init_waitqueue_head(&this_afe.wait[i]); } init_waitqueue_head(&this_afe.wait_wakeup); From 26542e076432104a728c4c9f2ddd88a996ef5394 Mon Sep 17 00:00:00 2001 From: Vignesh Kulothungan Date: Thu, 17 Sep 2020 10:35:53 -0700 Subject: [PATCH 19/59] soc: remove error log in lpi gpio write When sound wire master suspend is called, it holds the mutex lock and does lpi_gpio_write, which gets preempted during pr_err_ratelimited. Any other calls to master suspend will be blocked waiting for the above mutex lock resulting in timeouts. Remove pr_err_ratelimited log when device is down. Change-Id: I148263ddbb89d436b0ce27bdc4519f196d90679a Signed-off-by: Vignesh Kulothungan --- soc/pinctrl-lpi.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/soc/pinctrl-lpi.c b/soc/pinctrl-lpi.c index 03d9112880..5f93cf5971 100644 --- a/soc/pinctrl-lpi.c +++ b/soc/pinctrl-lpi.c @@ -181,8 +181,6 @@ static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr, int ret = 0; if (!lpi_dev_up) { - pr_err_ratelimited("%s: ADSP is down due to SSR, return\n", - __func__); return 0; } pm_runtime_get_sync(lpi_dev); From 193072dec99a14ded4afca422181fb96afe54c51 Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Wed, 16 Sep 2020 16:19:55 +0530 Subject: [PATCH 20/59] config: lahaina: Disable AUXPCM interface Disable AUXPCM interface to avoid unnecessary registration of mixer controls and improve performance in loading mixer paths. Change-Id: I8025a3d5372c90546ba1ed47fa18c160d42f76ef Signed-off-by: Prasad Kumpatla --- config/lahainaauto.conf | 1 + config/lahainaautoconf.h | 1 + 2 files changed, 2 insertions(+) diff --git a/config/lahainaauto.conf b/config/lahainaauto.conf index 5ce62150ce..3465178a9a 100644 --- a/config/lahainaauto.conf +++ b/config/lahainaauto.conf @@ -36,3 +36,4 @@ export CONFIG_SND_SOC_LAHAINA=m export CONFIG_SND_EVENT=m export CONFIG_SND_SWR_HAPTICS=m export CONFIG_DIGITAL_CDC_RSC_MGR=m +export CONFIG_AUXPCM_DISABLE=m diff --git a/config/lahainaautoconf.h b/config/lahainaautoconf.h index 7a4b1931c3..15b6e3a392 100644 --- a/config/lahainaautoconf.h +++ b/config/lahainaautoconf.h @@ -40,3 +40,4 @@ #define CONFIG_SND_EVENT 1 #define CONFIG_SND_SWR_HAPTICS 1 #define CONFIG_DIGITAL_CDC_RSC_MGR 1 +#define CONFIG_AUXPCM_DISABLE 1 From 5f428b091de6d527a179318757ef4ef1e19fbdc4 Mon Sep 17 00:00:00 2001 From: Sudheer Papothi Date: Thu, 17 Sep 2020 04:07:13 +0530 Subject: [PATCH 21/59] ASoC: lahaina: Update soundwire frame shape configuration Update soundwire frame shape configuration for native audio playback usecase. Change-Id: I2e80589c8f2ae9d1cc3ad02e8864922300db97bb Signed-off-by: Sudheer Papothi --- asoc/holi-port-config.h | 12 ++++++++++++ asoc/lahaina-port-config.h | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/asoc/holi-port-config.h b/asoc/holi-port-config.h index abc23596a6..7aed45e9e1 100644 --- a/asoc/holi-port-config.h +++ b/asoc/holi-port-config.h @@ -33,6 +33,16 @@ static struct port_params rx_frame_params_default[SWR_MSTR_PORT_LEN] = { {0x18F, 0, 0, 0x8, 0x8, 0x0F, 0x00, 0, 0, 0x00, 0x01}, /* PCM_OUT */ }; +/* Headset(44.1K) + PCM Haptics */ +static struct port_params rx_frame_params_44p1KHz[SWR_MSTR_PORT_LEN] = { + {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1, 0x00, 0x00}, /* HPH/EAR */ + {63, 0, 0, 3, 6, 7, 0, 0xFF, 0, 0x00, 0x00}, /* HPH_CLH */ + {31, 11, 11, 0xFF, 0xFF, 4, 1, 0xFF, 0, 0x00, 0x00}, /* HPH_CMP */ + {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0, 0x00, 0x00}, /* LO/AUX */ + {0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0x00, 0x00}, /* DSD */ + {0x1FF, 0, 0, 0x8, 0x8, 0x0F, 0, 0, 0, 0x00, 0x01}, /* PCM_OUT */ +}; + /* TX UC1: TX1: 1ch, TX2: 2chs, TX3: 1ch(MBHC) */ static struct port_params tx_frame_params_default[SWR_MSTR_PORT_LEN] = { {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX1 */ @@ -50,12 +60,14 @@ static struct swr_mstr_port_map sm_port_map[] = { {VA_MACRO, SWR_UC0, tx_frame_params_default}, {RX_MACRO, SWR_UC0, rx_frame_params_default}, {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, + {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, }; static struct swr_mstr_port_map sm_port_map_wcd937x[] = { {VA_MACRO, SWR_UC0, tx_frame_params_wcd937x}, {RX_MACRO, SWR_UC0, rx_frame_params_default}, {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, + {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, }; #endif /* _HOLI_PORT_CONFIG */ diff --git a/asoc/lahaina-port-config.h b/asoc/lahaina-port-config.h index d02813d676..5f508691c8 100644 --- a/asoc/lahaina-port-config.h +++ b/asoc/lahaina-port-config.h @@ -44,6 +44,16 @@ static struct port_params rx_frame_params_default[SWR_MSTR_PORT_LEN] = { {0x18F, 0, 0, 0x8, 0x8, 0x0F, 0x00, 0, 0, 0x00, 0x01}, /* PCM_OUT */ }; +/* Headset(44.1K) + PCM Haptics */ +static struct port_params rx_frame_params_44p1KHz[SWR_MSTR_PORT_LEN] = { + {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1, 0x00, 0x00}, /* HPH/EAR */ + {63, 0, 0, 3, 6, 7, 0, 0xFF, 0, 0x00, 0x00}, /* HPH_CLH */ + {31, 11, 11, 0xFF, 0xFF, 4, 1, 0xFF, 0, 0x00, 0x00}, /* HPH_CMP */ + {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0, 0x00, 0x00}, /* LO/AUX */ + {0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0x00, 0x00}, /* DSD */ + {0x1FF, 0, 0, 0x8, 0x8, 0x0F, 0, 0, 0, 0x00, 0x01}, /* PCM_OUT */ +}; + /* TX UC1: TX1: 1ch, TX2: 2chs, TX3: 1ch(MBHC) */ static struct port_params tx_frame_params_default[SWR_MSTR_PORT_LEN] = { {7, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX1 */ @@ -92,6 +102,7 @@ static struct swr_mstr_port_map sm_port_map[] = { {TX_MACRO, SWR_UC2, tx_frame_params_0p6MHz}, {RX_MACRO, SWR_UC0, rx_frame_params_default}, {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, + {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, }; @@ -101,6 +112,7 @@ static struct swr_mstr_port_map sm_port_map_shima[] = { {TX_MACRO, SWR_UC2, tx_frame_params_shima_0p6MHz}, {RX_MACRO, SWR_UC0, rx_frame_params_default}, {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, + {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, }; From 8c623f54c4143477b8da1cee1adf4c5ba5559b5a Mon Sep 17 00:00:00 2001 From: Viraja Kommaraju Date: Wed, 15 Jul 2020 02:09:55 +0530 Subject: [PATCH 22/59] dsp: support ION memory allocation from audio heap * Add support to allocate memory from the ION audio heap once smmu enabled. Change-Id: Ic1686c7a3225b723811cbbd35f08d0ac123d1f78 Signed-off-by: Viraja Kommaraju --- dsp/msm_audio_ion_vm.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/dsp/msm_audio_ion_vm.c b/dsp/msm_audio_ion_vm.c index 1d3002985b..25937d2f38 100644 --- a/dsp/msm_audio_ion_vm.c +++ b/dsp/msm_audio_ion_vm.c @@ -562,12 +562,18 @@ int msm_audio_ion_alloc(struct dma_buf **dma_buf, size_t bufsz, pr_err("%s: Invalid params\n", __func__); return -EINVAL; } - + pr_debug("%s: audio heap is used\n", __func__); if (msm_audio_ion_data.smmu_enabled == true) { - pr_debug("%s: system heap is used\n", __func__); - *dma_buf = ion_alloc(bufsz, ION_HEAP(ION_SYSTEM_HEAP_ID), 0); + *dma_buf = ion_alloc(bufsz, ION_HEAP(ION_AUDIO_HEAP_ID), 0); + if (IS_ERR_OR_NULL((void *)(*dma_buf))) { + if (IS_ERR((void *)(*dma_buf))) + err_ion_ptr = PTR_ERR((int *)(*dma_buf)); + pr_debug("%s: ION alloc failed for audio heap err ptr=%ld, smmu_enabled=%d," + "trying system heap..\n", + __func__, err_ion_ptr, msm_audio_ion_data.smmu_enabled); + *dma_buf = ion_alloc(bufsz, ION_HEAP(ION_SYSTEM_HEAP_ID), 0); + } } else { - pr_debug("%s: audio heap is used\n", __func__); *dma_buf = ion_alloc(bufsz, ION_HEAP(ION_AUDIO_HEAP_ID), 0); } if (IS_ERR_OR_NULL((void *)(*dma_buf))) { From a77e386d54b081bc135845552eeb6b03c6881da7 Mon Sep 17 00:00:00 2001 From: Vignesh Kulothungan Date: Fri, 18 Sep 2020 13:12:52 -0700 Subject: [PATCH 23/59] Revert "ASoC: codecs: handle device disconnect during SSR" This reverts commit 75f229237a51f8c0de070cbcc560f383de176215. Change-Id: Ie37d6ac80a3f86df50cdaab65dfd51624f7c7517 Signed-off-by: Vignesh Kulothungan --- asoc/codecs/wcd-mbhc-v2.c | 19 ------------------- asoc/codecs/wcd938x/wcd938x.c | 2 -- include/asoc/wcd-mbhc-v2.h | 1 - 3 files changed, 22 deletions(-) diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c index 3194724ee2..fad70448e9 100644 --- a/asoc/codecs/wcd-mbhc-v2.c +++ b/asoc/codecs/wcd-mbhc-v2.c @@ -1630,8 +1630,6 @@ static int wcd_mbhc_set_keycode(struct wcd_mbhc *mbhc) static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb, unsigned long mode, void *ptr) { - unsigned int l_det_en = 0; - unsigned int detection_type = 0; struct wcd_mbhc *mbhc = container_of(nb, struct wcd_mbhc, fsa_nb); if (!mbhc) @@ -1644,23 +1642,6 @@ static int wcd_mbhc_usbc_ana_event_handler(struct notifier_block *nb, mbhc->mbhc_cb->clk_setup(mbhc->component, true); /* insertion detected, enable L_DET_EN */ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1); - } else { - WCD_MBHC_REG_READ(WCD_MBHC_MECH_DETECTION_TYPE, detection_type); - WCD_MBHC_REG_READ(WCD_MBHC_L_DET_EN, l_det_en); - /* If both l_det_en and detection type are set, it means device was - * unplugged during SSR and detection interrupt was not handled. - * So trigger device disconnect */ - if (detection_type && l_det_en) { - /* Set the detection type appropriately */ - WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, - !detection_type); - /* Set current plug type to the state before SSR */ - mbhc->current_plug = mbhc->plug_before_ssr; - - wcd_mbhc_swch_irq_handler(mbhc); - mbhc->mbhc_cb->lock_sleep(mbhc, false); - mbhc->plug_before_ssr = MBHC_PLUG_TYPE_NONE; - } } return 0; } diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c index 2497980953..96e269914d 100644 --- a/asoc/codecs/wcd938x/wcd938x.c +++ b/asoc/codecs/wcd938x/wcd938x.c @@ -2156,8 +2156,6 @@ static int wcd938x_event_notify(struct notifier_block *block, WCD938X_EVT_SSR_DOWN, NULL); wcd938x->mbhc->wcd_mbhc.deinit_in_progress = true; - wcd938x->mbhc->wcd_mbhc.plug_before_ssr = - wcd938x->mbhc->wcd_mbhc.current_plug; mbhc = &wcd938x->mbhc->wcd_mbhc; wcd938x->usbc_hs_status = get_usbc_hs_status(component, mbhc->mbhc_cfg); diff --git a/include/asoc/wcd-mbhc-v2.h b/include/asoc/wcd-mbhc-v2.h index e9dd2ae165..1c351f8012 100644 --- a/include/asoc/wcd-mbhc-v2.h +++ b/include/asoc/wcd-mbhc-v2.h @@ -551,7 +551,6 @@ struct wcd_mbhc { wait_queue_head_t wait_btn_press; bool is_btn_press; u8 current_plug; - u8 plug_before_ssr; bool in_swch_irq_handler; bool hphl_swh; /*track HPHL switch NC / NO */ bool gnd_swh; /*track GND switch NC / NO */ From b65478004381e3b7499f39c282e4b6afd5e9f304 Mon Sep 17 00:00:00 2001 From: Saurav Kumar Date: Fri, 11 Sep 2020 21:03:04 +0530 Subject: [PATCH 24/59] asoc: fix out of bound access for FE DAI list Add change to fix the array index out of bounds error. Change-Id: I6a40a6dce32c90da407a51ee9ed95d649bb7d9d8 Signed-off-by: Saurav Kumar --- asoc/msm-pcm-routing-v2.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index dd0ba09ca8..4e5cc2ec63 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -1136,7 +1136,7 @@ static bool is_mm_lsm_fe_id(int fe_id) { bool rc = true; - if (fe_id > MSM_FRONTEND_DAI_MM_MAX_ID && + if (fe_id >= MSM_FRONTEND_DAI_MM_MAX_ID && ((fe_id < MSM_FRONTEND_DAI_LSM1) || (fe_id > MSM_FRONTEND_DAI_LSM8))) { rc = false; @@ -1545,7 +1545,7 @@ void msm_pcm_routing_reg_psthr_stream(int fedai_id, int dspst_id, int i, session_type, path_type, port_type; u32 mode = 0; - if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) { + if (fedai_id >= MSM_FRONTEND_DAI_MM_MAX_ID) { /* bad ID assigned in machine driver */ pr_err("%s: bad MM ID\n", __func__); return; @@ -2033,7 +2033,7 @@ int msm_pcm_routing_reg_phy_stream(int fedai_id, int perf_mode, int ret = 0; uint32_t copp_token = 0; - if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) { + if (fedai_id >= MSM_FRONTEND_DAI_MM_MAX_ID) { /* bad ID assigned in machine driver */ pr_err("%s: bad MM ID %d\n", __func__, fedai_id); return -EINVAL; @@ -32521,7 +32521,7 @@ int msm_routing_check_backend_enabled(int fedai_id) { int i; - if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) { + if (fedai_id >= MSM_FRONTEND_DAI_MM_MAX_ID) { /* bad ID assigned in machine driver */ pr_err("%s: bad MM ID\n", __func__); return 0; From 001b64815061db57a2dd2ec509fffd06d2306dc0 Mon Sep 17 00:00:00 2001 From: Sudheer Papothi Date: Thu, 17 Sep 2020 04:05:02 +0530 Subject: [PATCH 25/59] soc: soundwire: Update frame configuration for native audio playback Update frame shape configuration for native audio playback for better performance during native audio playback. Change-Id: I2d7c22e1cb69e73e4f474be020931d74715a1a60 Signed-off-by: Sudheer Papothi --- include/soc/soundwire.h | 2 +- soc/swr-mstr-ctrl.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/include/soc/soundwire.h b/include/soc/soundwire.h index 2d9b64aaaa..a8c5ec83e9 100644 --- a/include/soc/soundwire.h +++ b/include/soc/soundwire.h @@ -17,7 +17,7 @@ #define SWR_CLK_RATE_2P4MHZ 2400000 #define SWR_CLK_RATE_4P8MHZ 4800000 #define SWR_CLK_RATE_9P6MHZ 9600000 -#define SWR_CLK_RATE_11P2896MHZ 1128960 +#define SWR_CLK_RATE_11P2896MHZ 11289600 extern struct bus_type soundwire_type; struct swr_device; diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c index 12b263c9c2..2044277bd0 100644 --- a/soc/swr-mstr-ctrl.c +++ b/soc/swr-mstr-ctrl.c @@ -752,6 +752,9 @@ static int swrm_get_port_config(struct swr_mstr_ctrl *swrm) if (swrm->mport_cfg[SWRM_DSD_PARAMS_PORT].port_en && (swrm->master_id == MASTER_ID_RX)) usecase = 1; + else if ((swrm->master_id == MASTER_ID_RX) && + (swrm->bus_clk == SWR_CLK_RATE_11P2896MHZ)) + usecase = 2; if (swrm->bus_clk == SWR_CLK_RATE_4P8MHZ) usecase = 1; From 63efc9ab3bbba633809b9683fd2f51e3f4ea946e Mon Sep 17 00:00:00 2001 From: "Vangala, Amarnath" Date: Tue, 22 Sep 2020 22:05:48 +0530 Subject: [PATCH 26/59] asoc: holi: update soundwire master port configuration for Tx Update the soundwire master port configuration for 4.8MHz use cases in Tx path for holi. Change-Id: If183c9eeba1d9e64eff978021dc234b183e83f3b Signed-off-by: Vangala, Amarnath --- asoc/holi-port-config.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/asoc/holi-port-config.h b/asoc/holi-port-config.h index abc23596a6..3d269688da 100644 --- a/asoc/holi-port-config.h +++ b/asoc/holi-port-config.h @@ -34,8 +34,8 @@ static struct port_params rx_frame_params_default[SWR_MSTR_PORT_LEN] = { }; /* TX UC1: TX1: 1ch, TX2: 2chs, TX3: 1ch(MBHC) */ -static struct port_params tx_frame_params_default[SWR_MSTR_PORT_LEN] = { - {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX1 */ +static struct port_params tx_frame_params_4p8MHz[SWR_MSTR_PORT_LEN] = { + {3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1, 0x00, 0x00}, /* TX1 */ {3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX2 */ {7, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX3 */ }; @@ -47,7 +47,7 @@ static struct port_params tx_frame_params_wcd937x[SWR_MSTR_PORT_LEN] = { }; static struct swr_mstr_port_map sm_port_map[] = { - {VA_MACRO, SWR_UC0, tx_frame_params_default}, + {VA_MACRO, SWR_UC0, tx_frame_params_4p8MHz}, {RX_MACRO, SWR_UC0, rx_frame_params_default}, {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, }; From eedc416e704eb95f199970cdd7ea861a6003e67c Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Wed, 16 Sep 2020 22:25:41 +0530 Subject: [PATCH 27/59] dsp: q6core: Check q6core avs state to be modules ready During PDR, in dynamic load module if attempted before all module state ready on AVS it may fail. Add AVS state check before send load module cmd. Change-Id: I70a5a5b11f5661042d704222759608179ba9d47c Signed-off-by: Laxminath Kasam --- dsp/q6core.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/dsp/q6core.c b/dsp/q6core.c index 0bb767896f..c6b8f3a712 100644 --- a/dsp/q6core.c +++ b/dsp/q6core.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. */ #include @@ -33,6 +33,8 @@ #define ADSP_STATE_READY_TIMEOUT_MS 3000 +#define ADSP_MODULES_READY_AVS_STATE 5 + #define APR_ENOTREADY 10 #define MEMPOOL_ID_MASK 0xFF #define MDF_MAP_TOKEN 0xF000 @@ -973,12 +975,39 @@ int32_t q6core_avcs_load_unload_modules(struct avcs_load_unload_modules_payload size_t packet_size = 0, payload_size = 0; struct avcs_cmd_dynamic_modules *mod = NULL; int num_modules; + unsigned long timeout; if (payload == NULL) { pr_err("%s: payload is null\n", __func__); return -EINVAL; } + if ((q6core_lcl.avs_state != ADSP_MODULES_READY_AVS_STATE) + && (preload_type == AVCS_LOAD_MODULES)) { + timeout = jiffies + + msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS); + + do { + q6core_is_adsp_ready(); + if (q6core_lcl.param == ADSP_MODULES_READY_AVS_STATE) { + pr_debug("%s: ADSP state up with all modules loaded\n", + __func__); + q6core_lcl.avs_state = ADSP_MODULES_READY_AVS_STATE; + break; + } + + /* + * ADSP will be coming up after boot up and AVS might + * not be fully up with all modules when the control reaches here. + * So, wait for 50msec before checking ADSP state again. + */ + msleep(50); + } while (time_after(timeout, jiffies)); + + if (q6core_lcl.param != ADSP_MODULES_READY_AVS_STATE) + pr_err("%s: all modules might be not loaded yet on ADSP\n", + __func__); + } mutex_lock(&(q6core_lcl.cmd_lock)); num_modules = payload->num_modules; ocm_core_open(); @@ -1989,7 +2018,7 @@ static int q6core_is_avs_up(int32_t *avs_state) msleep(50); } while (time_after(timeout, jiffies)); - *avs_state = adsp_ready; + *avs_state = q6core_lcl.param; pr_debug("%s: ADSP Audio is %s\n", __func__, adsp_ready ? "ready" : "not ready"); From 2940b913e71de915d59beb7742741512e2c03881 Mon Sep 17 00:00:00 2001 From: Surendar Karka Date: Sat, 27 Jun 2020 10:34:42 +0530 Subject: [PATCH 28/59] asoc: add routing controls for SLIM_9_TX Add routing controls for SLIM_9_TX. Change-Id: I278a706a8cbc7e7bfa85e392192e9f1964bb9717 Signed-off-by: Surendar karka --- asoc/msm-pcm-routing-v2.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 4e5cc2ec63..900c223130 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -19558,6 +19558,10 @@ static const struct snd_kcontrol_new mmul19_mixer_controls[] = { MSM_BACKEND_DAI_AFE_LOOPBACK_TX, MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, + MSM_BACKEND_DAI_SLIMBUS_9_TX, + MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), }; static const struct snd_kcontrol_new mmul20_mixer_controls[] = { @@ -20436,6 +20440,10 @@ static const struct snd_kcontrol_new mmul28_mixer_controls[] = { MSM_BACKEND_DAI_AFE_LOOPBACK_TX, MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, + MSM_BACKEND_DAI_SLIMBUS_9_TX, + MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), }; static const struct snd_kcontrol_new mmul29_mixer_controls[] = { @@ -20555,6 +20563,10 @@ static const struct snd_kcontrol_new mmul29_mixer_controls[] = { MSM_BACKEND_DAI_AFE_LOOPBACK_TX, MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("SLIM_9_TX", SND_SOC_NOPM, + MSM_BACKEND_DAI_SLIMBUS_9_TX, + MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), }; static const struct snd_kcontrol_new mmul30_mixer_controls[] = { @@ -27251,10 +27263,13 @@ static const struct snd_soc_dapm_route intercon[] = { {"MultiMedia18 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, {"MultiMedia19 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, {"MultiMedia19 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, + {"MultiMedia19 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, {"MultiMedia28 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, {"MultiMedia28 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, + {"MultiMedia28 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, {"MultiMedia29 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, {"MultiMedia29 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, + {"MultiMedia29 Mixer", "SLIM_9_TX", "SLIMBUS_9_TX"}, {"MultiMedia30 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, {"MultiMedia30 Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"}, {"MultiMedia8 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"}, From e6395ca42674e9e9a0c728a1697be701d705b3b3 Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Mon, 28 Sep 2020 14:13:17 +0800 Subject: [PATCH 29/59] asoc: routing: remove unnecessary mixer controls for TDM Some mixer controls for TDM are uncessary and remove them to cleanup the code. Change-Id: I38ce9077868e030135346102fcc0f093f7bef058 Signed-off-by: Meng Wang --- asoc/msm-pcm-routing-v2.c | 798 -------------------------------------- 1 file changed, 798 deletions(-) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 460606b46a..1244671c61 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -10871,101 +10871,6 @@ static const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = { msm_routing_put_audio_mixer), }; -static const struct snd_kcontrol_new pri_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia24", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA24, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia25", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA25, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia32", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA32, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia33", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA33, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia34", SND_SOC_NOPM, - MSM_BACKEND_DAI_PRI_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA34, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - static const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = { SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, MSM_BACKEND_DAI_SEC_TDM_RX_0, @@ -11378,101 +11283,6 @@ static const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = { msm_routing_put_audio_mixer), }; -static const struct snd_kcontrol_new sec_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia24", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA24, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia25", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA25, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia32", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA32, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia33", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA33, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia34", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEC_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA34, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - static const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = { SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, MSM_BACKEND_DAI_TERT_TDM_RX_0, @@ -11576,101 +11386,6 @@ static const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = { msm_routing_put_audio_mixer), }; -static const struct snd_kcontrol_new tert_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia24", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA24, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia25", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA25, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia32", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA32, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia33", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA33, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia34", SND_SOC_NOPM, - MSM_BACKEND_DAI_TERT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA34, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - static const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = { SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, MSM_BACKEND_DAI_TERT_TDM_RX_1, @@ -12190,101 +11905,6 @@ static const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = { msm_routing_put_audio_mixer), }; -static const struct snd_kcontrol_new quat_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia24", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA24, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia25", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA25, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia32", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA32, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia33", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA33, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia34", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUAT_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA34, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - static const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = { SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, MSM_BACKEND_DAI_QUAT_TDM_RX_1, @@ -12713,168 +12333,6 @@ static const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = { msm_routing_put_audio_mixer), }; -static const struct snd_kcontrol_new quin_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia24", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA24, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia25", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA25, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia32", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA32, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia33", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA33, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia34", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA34, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - -static const struct snd_kcontrol_new quin_tdm_tx_1_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_1, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = { SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, MSM_BACKEND_DAI_QUIN_TDM_RX_1, @@ -12983,101 +12441,6 @@ static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = { }; -static const struct snd_kcontrol_new quin_tdm_tx_2_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_2, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia23", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA23, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia24", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA24, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia25", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA25, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia31", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA31, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia32", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA32, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia33", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA33, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia34", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_RX_1, - MSM_FRONTEND_DAI_MULTIMEDIA34, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - static const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = { SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, MSM_BACKEND_DAI_QUIN_TDM_RX_2, @@ -13185,73 +12548,6 @@ static const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = { msm_routing_put_audio_mixer), }; -static const struct snd_kcontrol_new quin_tdm_tx_3_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_QUIN_TDM_TX_3, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - static const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = { SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, MSM_BACKEND_DAI_QUIN_TDM_RX_3, @@ -13434,73 +12730,6 @@ static const struct snd_kcontrol_new sen_tdm_rx_0_mixer_controls[] = { msm_routing_put_audio_mixer), }; -static const struct snd_kcontrol_new sen_tdm_tx_0_mixer_controls[] = { - SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), - SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM, - MSM_BACKEND_DAI_SEN_TDM_TX_0, - MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer, - msm_routing_put_audio_mixer), -}; - static const struct snd_kcontrol_new sen_tdm_rx_1_mixer_controls[] = { SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM, MSM_BACKEND_DAI_SEN_TDM_RX_1, @@ -26563,9 +25792,6 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_MIXER("PRI_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, pri_tdm_rx_3_mixer_controls, ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("PRI_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - pri_tdm_tx_0_mixer_controls, - ARRAY_SIZE(pri_tdm_tx_0_mixer_controls)), SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, sec_tdm_rx_0_mixer_controls, ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)), @@ -26578,15 +25804,9 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, sec_tdm_rx_3_mixer_controls, ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("SEC_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - sec_tdm_tx_0_mixer_controls, - ARRAY_SIZE(sec_tdm_tx_0_mixer_controls)), SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, tert_tdm_rx_0_mixer_controls, ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("TERT_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - tert_tdm_tx_0_mixer_controls, - ARRAY_SIZE(tert_tdm_tx_0_mixer_controls)), SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, tert_tdm_rx_1_mixer_controls, ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)), @@ -26602,9 +25822,6 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, quat_tdm_rx_0_mixer_controls, ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("QUAT_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - quat_tdm_tx_0_mixer_controls, - ARRAY_SIZE(quat_tdm_tx_0_mixer_controls)), SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, quat_tdm_rx_1_mixer_controls, ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)), @@ -26617,30 +25834,15 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = { SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, quin_tdm_rx_0_mixer_controls, ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_tx_0_mixer_controls, - ARRAY_SIZE(quin_tdm_tx_0_mixer_controls)), SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, quin_tdm_rx_1_mixer_controls, ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_TX_1 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_tx_1_mixer_controls, - ARRAY_SIZE(quin_tdm_tx_1_mixer_controls)), SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, quin_tdm_rx_2_mixer_controls, ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_TX_2 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_tx_2_mixer_controls, - ARRAY_SIZE(quin_tdm_tx_2_mixer_controls)), SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, quin_tdm_rx_3_mixer_controls, ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("QUIN_TDM_TX_3 Audio Mixer", SND_SOC_NOPM, 0, 0, - quin_tdm_tx_3_mixer_controls, - ARRAY_SIZE(quin_tdm_tx_3_mixer_controls)), - SND_SOC_DAPM_MIXER("SEN_TDM_TX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, - sen_tdm_tx_0_mixer_controls, - ARRAY_SIZE(sen_tdm_tx_0_mixer_controls)), SND_SOC_DAPM_MIXER("SEN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0, sen_tdm_rx_0_mixer_controls, ARRAY_SIZE(sen_tdm_rx_0_mixer_controls)), From 0c94995dcfaac92fcbe2ca4ac578b1525be880e5 Mon Sep 17 00:00:00 2001 From: Susan Wang Date: Mon, 31 Aug 2020 14:49:42 -0400 Subject: [PATCH 30/59] asoc: sa6155: enable 6 channels for QUIN TDM TX for Talos * Modify tdm_tx config to enable 6 channels for QUIN TX config, mirroring SEC TX config, to enable echo reference during SVA. Change-Id: If7c30758a32d774508f927e81923d9d2c12fc59f Signed-off-by: Susan Wang --- asoc/sa6155.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/asoc/sa6155.c b/asoc/sa6155.c index 8176977c70..c2e0bf0836 100644 --- a/asoc/sa6155.c +++ b/asoc/sa6155.c @@ -267,9 +267,9 @@ static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = { {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */ }, { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 4}, /* TX_0 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_1 */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_2 */ + {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 6}, /* 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 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */ {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */ @@ -471,14 +471,14 @@ static unsigned int tdm_tx_slot_offset {60,0xFFFF}, }, {/* QUIN TDM */ - {0, 4, 8, 12, 0xFFFF}, - {16, 20, 0xFFFF}, - {24, 28, 0xFFFF}, - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ - {0xFFFF}, /* not used */ + {0, 4, 8, 12, 16, 20, 0xFFFF}, + {24, 0xFFFF}, {28, 0xFFFF}, + {0xFFFF}, /* not used */ + {0xFFFF}, /* not used */ + {0xFFFF}, /* not used */ + {0xFFFF}, /* not used */ + {0xFFFF}, /* not used */ } }; From 512697da490a99630e2571ecbbf4f1fdb5213101 Mon Sep 17 00:00:00 2001 From: Guodong Hu Date: Tue, 22 Sep 2020 16:43:15 +0800 Subject: [PATCH 31/59] asoc: msm: add routing rules for QUIN_AUX_PCM To support the mixer: MultiMedia21 Mixer QUIN_AUXPCM_UL_TX Change-Id: I46e192f154a9386aded85405d7ac9aca2cdedd9e Signed-off-by: Guodong Hu --- asoc/msm-pcm-routing-v2.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 460606b46a..6b06a83d20 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -19773,6 +19773,10 @@ static const struct snd_kcontrol_new mmul21_mixer_controls[] = { MSM_BACKEND_DAI_SEC_AUXPCM_TX, MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, msm_routing_put_audio_mixer), + SOC_DOUBLE_EXT("QUIN_AUXPCM_UL_TX", SND_SOC_NOPM, + MSM_BACKEND_DAI_QUIN_AUXPCM_TX, + MSM_FRONTEND_DAI_MULTIMEDIA21, 1, 0, msm_routing_get_audio_mixer, + msm_routing_put_audio_mixer), #endif #ifndef CONFIG_TDM_DISABLE SOC_DOUBLE_EXT("PRI_TDM_TX_0", SND_SOC_NOPM, @@ -28292,6 +28296,7 @@ static const struct snd_soc_dapm_route intercon_aux_pcm[] = { {"MultiMedia21 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, {"MultiMedia21 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, + {"MultiMedia21 Mixer", "QUIN_AUXPCM_UL_TX", "QUIN_AUX_PCM_TX"}, {"MultiMedia6 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"}, {"MultiMedia6 Mixer", "SEC_AUX_PCM_UL_TX", "SEC_AUX_PCM_TX"}, From 4015ed0c541818c64f65512809de4bf0469b545c Mon Sep 17 00:00:00 2001 From: Harshal Ahire Date: Thu, 24 Sep 2020 03:06:05 +0530 Subject: [PATCH 32/59] soc: fix HS LPI issue for holi target - Skip audio hm voting during bootup. - Vote and unvote audio hm vote during swrm_runtime_suspend and swrm_runtime_resume Change-Id: I7a9c20f62ba0d87779b26da218bfe7373132b565 --- soc/swr-mstr-ctrl.c | 25 +++++++++++++++++++------ soc/swr-mstr-ctrl.h | 1 + 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c index 2044277bd0..6e9b7c1eec 100644 --- a/soc/swr-mstr-ctrl.c +++ b/soc/swr-mstr-ctrl.c @@ -2751,6 +2751,11 @@ static int swrm_probe(struct platform_device *pdev) } devm_kfree(&pdev->dev, temp); + ret = of_property_read_u32(pdev->dev.of_node, "qcom,is-always-on", + &swrm->is_always_on); + if (ret) + dev_dbg(&pdev->dev, "%s: failed to get is_always_on flag\n", __func__); + swrm->reg_irq = pdata->reg_irq; swrm->master.read = swrm_read; swrm->master.write = swrm_write; @@ -2873,7 +2878,7 @@ static int swrm_probe(struct platform_device *pdev) * controller will be up now */ swr_master_add_boarddevices(&swrm->master); - if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) + if (!swrm->is_always_on && swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) dev_dbg(&pdev->dev, "%s: Audio HW Vote is failed\n", __func__); mutex_lock(&swrm->mlock); swrm_clk_request(swrm, true); @@ -3021,7 +3026,7 @@ static int swrm_runtime_resume(struct device *dev) struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); int ret = 0; bool swrm_clk_req_err = false; - bool hw_core_err = false; + bool hw_core_err = false, aud_core_err = false; struct swr_master *mstr = &swrm->master; struct swr_device *swr_dev; u32 temp = 0; @@ -3037,9 +3042,11 @@ static int swrm_runtime_resume(struct device *dev) __func__); hw_core_err = true; } - if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) + if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) { dev_err(dev, "%s:lpass audio hw enable failed\n", __func__); + aud_core_err = true; + } if ((swrm->state == SWR_MSTR_DOWN) || (swrm->state == SWR_MSTR_SSR && swrm->dev_up)) { @@ -3130,6 +3137,9 @@ static int swrm_runtime_resume(struct device *dev) swrm->state = SWR_MSTR_UP; } exit: + if (swrm->is_always_on && !aud_core_err) + swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false); + if (!hw_core_err) swrm_request_hw_vote(swrm, LPASS_HW_CORE, false); if (swrm_clk_req_err) @@ -3152,7 +3162,7 @@ static int swrm_runtime_suspend(struct device *dev) struct platform_device *pdev = to_platform_device(dev); struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); int ret = 0; - bool hw_core_err = false; + bool hw_core_err = false, aud_core_err = false; struct swr_master *mstr = &swrm->master; struct swr_device *swr_dev; int current_state = 0; @@ -3172,6 +3182,8 @@ static int swrm_runtime_suspend(struct device *dev) hw_core_err = true; } + if (swrm->is_always_on && swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) + aud_core_err = true; if ((current_state == SWR_MSTR_UP) || (current_state == SWR_MSTR_SSR)) { @@ -3253,11 +3265,12 @@ static int swrm_runtime_suspend(struct device *dev) swrm->state = SWR_MSTR_DOWN; exit: - if (swrm->state != SWR_MSTR_UP) { + if (!swrm->is_always_on && swrm->state != SWR_MSTR_UP) { if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false)) dev_dbg(dev, "%s:lpass audio hw enable failed\n", __func__); - } + } else if (swrm->is_always_on && !aud_core_err) + swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false); if (!hw_core_err) swrm_request_hw_vote(swrm, LPASS_HW_CORE, false); diff --git a/soc/swr-mstr-ctrl.h b/soc/swr-mstr-ctrl.h index 8aa0d013bb..40223c4a3b 100644 --- a/soc/swr-mstr-ctrl.h +++ b/soc/swr-mstr-ctrl.h @@ -194,6 +194,7 @@ struct swr_mstr_ctrl { u32 wr_fifo_depth; bool enable_slave_irq; u64 logical_dev[SWRM_NUM_AUTO_ENUM_SLAVES]; + u32 is_always_on; #ifdef CONFIG_DEBUG_FS struct dentry *debugfs_swrm_dent; struct dentry *debugfs_peek; From ffd65896dd2c6329e3313c5c4c4b3dbeff54235a Mon Sep 17 00:00:00 2001 From: Vatsal Bucha Date: Tue, 29 Sep 2020 11:09:27 +0530 Subject: [PATCH 33/59] ASoC: bolero: Make tx swr gpio as wakeup capable Do not register afe event listener for shima and make tx swr gpio as wakeup capable. Change-Id: I4d805c2b65e6c424c1c215431caa75f6181a16e8 Signed-off-by: Vatsal Bucha --- asoc/codecs/bolero/tx-macro.c | 31 +++++++++++++++++++++++++------ asoc/codecs/bolero/va-macro.c | 19 +------------------ 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index 4ea66165ef..135ea087cf 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -180,6 +180,7 @@ struct tx_macro_priv { bool lpi_enable; bool register_event_listener; u16 current_clk_id; + int disable_afe_wakeup_event_listener; }; static bool tx_macro_get_data(struct snd_soc_component *component, @@ -2645,17 +2646,19 @@ static int tx_macro_register_event_listener(struct snd_soc_component *component, if (tx_priv->swr_ctrl_data && (!tx_priv->tx_swr_clk_cnt || !tx_priv->va_swr_clk_cnt)) { if (enable) { - ret = swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_REGISTER_WAKEUP, NULL); + if (!tx_priv->disable_afe_wakeup_event_listener) + ret = swrm_wcd_notify( + tx_priv->swr_ctrl_data[0].tx_swr_pdev, + SWR_REGISTER_WAKEUP, NULL); msm_cdc_pinctrl_set_wakeup_capable( tx_priv->tx_swr_gpio_p, false); } else { msm_cdc_pinctrl_set_wakeup_capable( tx_priv->tx_swr_gpio_p, true); - ret = swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_DEREGISTER_WAKEUP, NULL); + if (!tx_priv->disable_afe_wakeup_event_listener) + ret = swrm_wcd_notify( + tx_priv->swr_ctrl_data[0].tx_swr_pdev, + SWR_DEREGISTER_WAKEUP, NULL); } } @@ -3411,6 +3414,9 @@ static int tx_macro_probe(struct platform_device *pdev) const char *dmic_sample_rate = "qcom,tx-dmic-sample-rate"; u32 is_used_tx_swr_gpio = 1; const char *is_used_tx_swr_gpio_dt = "qcom,is-used-swr-gpio"; + u32 disable_afe_wakeup_event_listener = 0; + const char *disable_afe_wakeup_event_listener_dt = + "qcom,disable-afe-wakeup-event-listener"; if (!bolero_is_va_macro_registered(&pdev->dev)) { dev_err(&pdev->dev, @@ -3477,6 +3483,19 @@ static int tx_macro_probe(struct platform_device *pdev) sample_rate, tx_priv) == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED) return -EINVAL; } + + if (of_find_property(pdev->dev.of_node, + disable_afe_wakeup_event_listener_dt, NULL)) { + ret = of_property_read_u32(pdev->dev.of_node, + disable_afe_wakeup_event_listener_dt, + &disable_afe_wakeup_event_listener); + if (ret) + dev_dbg(&pdev->dev, "%s: error reading %s in dt\n", + __func__, disable_afe_wakeup_event_listener_dt); + } + tx_priv->disable_afe_wakeup_event_listener = + disable_afe_wakeup_event_listener; + if (is_used_tx_swr_gpio) { tx_priv->reset_swr = true; INIT_WORK(&tx_priv->tx_macro_add_child_devices_work, diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index 8e32a46cab..08dabf3d30 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -173,7 +173,6 @@ struct va_macro_priv { bool lpi_enable; bool register_event_listener; int dec_mode[VA_MACRO_NUM_DECIMATORS]; - int disable_afe_wakeup_event_listener; }; static bool va_macro_get_data(struct snd_soc_component *component, @@ -493,8 +492,7 @@ static int va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, dev_dbg(va_dev, "%s: clock switch failed\n", __func__); } - if (va_priv->lpi_enable && - !va_priv->disable_afe_wakeup_event_listener) { + if (va_priv->lpi_enable) { bolero_register_event_listener(component, true); va_priv->register_event_listener = true; } @@ -3057,10 +3055,7 @@ static int va_macro_probe(struct platform_device *pdev) u32 default_clk_id = 0; struct clk *lpass_audio_hw_vote = NULL; u32 is_used_va_swr_gpio = 0; - u32 disable_afe_wakeup_event_listener = 0; const char *is_used_va_swr_gpio_dt = "qcom,is-used-swr-gpio"; - const char *disable_afe_wakeup_event_listener_dt = - "qcom,disable-afe-wakeup-event-listener"; va_priv = devm_kzalloc(&pdev->dev, sizeof(struct va_macro_priv), GFP_KERNEL); @@ -3103,18 +3098,6 @@ static int va_macro_probe(struct platform_device *pdev) } } - if (of_find_property(pdev->dev.of_node, - disable_afe_wakeup_event_listener_dt, NULL)) { - ret = of_property_read_u32(pdev->dev.of_node, - disable_afe_wakeup_event_listener_dt, - &disable_afe_wakeup_event_listener); - if (ret) - dev_dbg(&pdev->dev, "%s: error reading %s in dt\n", - __func__, disable_afe_wakeup_event_listener_dt); - } - va_priv->disable_afe_wakeup_event_listener = - disable_afe_wakeup_event_listener; - va_priv->va_swr_gpio_p = of_parse_phandle(pdev->dev.of_node, "qcom,va-swr-gpios", 0); if (!va_priv->va_swr_gpio_p && is_used_va_swr_gpio) { From 67413f55e14fb9957a902e913ad86ec50ad3447b Mon Sep 17 00:00:00 2001 From: Sujin Panicker Date: Wed, 30 Sep 2020 11:38:50 +0530 Subject: [PATCH 34/59] dsp: Add param header size based on the instance id support Add param header size to the actual parameter size based on the instance id support. Change-Id: I8937e71254265dbc9faf00b9cfc7c40c88f4388a Signed-off-by: Sujin Panicker --- dsp/q6lsm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dsp/q6lsm.c b/dsp/q6lsm.c index 87b3f08f1e..af0fd4326c 100644 --- a/dsp/q6lsm.c +++ b/dsp/q6lsm.c @@ -2526,6 +2526,7 @@ int q6lsm_get_one_param(struct lsm_client *client, { struct param_hdr_v3 param_info; int rc = 0; + bool iid_supported = q6common_is_instance_id_supported(); memset(¶m_info, 0, sizeof(param_info)); @@ -2534,7 +2535,12 @@ int q6lsm_get_one_param(struct lsm_client *client, param_info.module_id = p_info->module_id; param_info.instance_id = p_info->instance_id; param_info.param_id = p_info->param_id; - param_info.param_size = p_info->param_size + sizeof(param_info); + + if (iid_supported) + param_info.param_size = p_info->param_size + sizeof(struct param_hdr_v3); + else + param_info.param_size = p_info->param_size + sizeof(struct param_hdr_v2); + rc = q6lsm_get_params(client, NULL, ¶m_info); if (rc) { pr_err("%s: LSM_GET_CUSTOM_PARAMS failed, rc %d\n", From 7ca2abd71602644283a2808b641c134dd6afcd88 Mon Sep 17 00:00:00 2001 From: Garmond Leung Date: Wed, 30 Sep 2020 09:35:44 -0700 Subject: [PATCH 35/59] ASoC: msm: update quin tdm slot for single lane Update QUIN TDM slot mapping for single lane configuration. Update QUAT TDM TX slot mapping for 8 channel capture over multilane configuration. Change-Id: If0f2792637eb513b7f64a291fc27c475f2c12683 --- asoc/sa6155.c | 5 ++--- asoc/sa8155.c | 14 ++++++-------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/asoc/sa6155.c b/asoc/sa6155.c index 8176977c70..63dec53c2d 100644 --- a/asoc/sa6155.c +++ b/asoc/sa6155.c @@ -257,7 +257,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, 16}, /* TX_0 */ + {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, /* 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 */ @@ -460,8 +460,7 @@ static unsigned int tdm_tx_slot_offset {28, 0xFFFF}, }, {/* QUAT TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},/*MIC ARR*/ + {0, 8, 16, 24, 4, 12, 20, 28, 0xFFFF}, /*8 CH MIC ARR*/ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ diff --git a/asoc/sa8155.c b/asoc/sa8155.c index 3553509144..3dc0f0ff8b 100644 --- a/asoc/sa8155.c +++ b/asoc/sa8155.c @@ -259,7 +259,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, 16}, /* TX_0 */ + {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, /* 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 */ @@ -269,7 +269,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 */ }, { /* QUIN TDM */ - {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 16}, /* TX_0 */ + {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8}, /* 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 */ @@ -418,8 +418,8 @@ static unsigned int tdm_rx_slot_offset {60,0xFFFF}, }, {/* QUIN TDM */ - {0, 8, 16, 24, 32, 40, 48, 56, - 4, 12, 20, 28, 36, 44, 52, 60, 0xFFFF}, /*16 CH SPKR*/ + {0, 4, 8, 12, 16, 20, 24, 28, + 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF}, /*16 CH SPKR*/ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ @@ -463,8 +463,7 @@ static unsigned int tdm_tx_slot_offset {28, 0xFFFF}, }, {/* QUAT TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},/*16 CH MIC ARR1*/ + {0, 8, 16, 24, 4, 12, 20, 28, 0xFFFF}, /*8 CH MIC ARR1*/ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ @@ -474,8 +473,7 @@ static unsigned int tdm_tx_slot_offset {60,0xFFFF}, }, {/* QUIN TDM */ - {0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},/*16 CH MIC ARR2*/ + {0, 4, 8, 12, 16, 20, 24, 28, 0xFFFF}, /*8 CH MIC ARR2*/ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ {0xFFFF}, /* not used */ From dbbb97ce5e97da6d59a89fc77e4661e0fd80cc32 Mon Sep 17 00:00:00 2001 From: Vignesh Kulothungan Date: Thu, 24 Sep 2020 12:08:25 -0700 Subject: [PATCH 36/59] ASoC: codecs: add null check before use Add null check for wcd938x component and wcd938x_priv before use. Add array bounds check for slave channel index before accessing the array. Change-Id: Ida6b2044f5f9b9a65f4b45d868040af8bd2116eb Signed-off-by: Vignesh Kulothungan --- asoc/codecs/wcd938x/wcd938x.c | 39 ++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c index ef162bacf2..a6edf19594 100644 --- a/asoc/codecs/wcd938x/wcd938x.c +++ b/asoc/codecs/wcd938x/wcd938x.c @@ -2843,15 +2843,22 @@ static int wcd938x_tx_master_ch_get(struct snd_kcontrol *kcontrol, { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); - int slave_ch_idx; + struct wcd938x_priv *wcd938x = NULL; + int slave_ch_idx = -EINVAL; + + if (component == NULL) + return -EINVAL; + + wcd938x = snd_soc_component_get_drvdata(component); + if (wcd938x == NULL) + return -EINVAL; wcd938x_tx_get_slave_ch_type_idx(kcontrol->id.name, &slave_ch_idx); + if (slave_ch_idx < 0 || slave_ch_idx >= WCD938X_MAX_SLAVE_CH_TYPES) + return -EINVAL; - if (slave_ch_idx != -EINVAL) - ucontrol->value.integer.value[0] = - wcd938x_slave_get_master_ch_val( - wcd938x->tx_master_ch_map[slave_ch_idx]); + ucontrol->value.integer.value[0] = wcd938x_slave_get_master_ch_val( + wcd938x->tx_master_ch_map[slave_ch_idx]); return 0; } @@ -2861,19 +2868,27 @@ static int wcd938x_tx_master_ch_put(struct snd_kcontrol *kcontrol, { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); - struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); - int slave_ch_idx; + struct wcd938x_priv *wcd938x = NULL; + int slave_ch_idx = -EINVAL; + + if (component == NULL) + return -EINVAL; + + wcd938x = snd_soc_component_get_drvdata(component); + if (wcd938x == NULL) + return -EINVAL; wcd938x_tx_get_slave_ch_type_idx(kcontrol->id.name, &slave_ch_idx); + if (slave_ch_idx < 0 || slave_ch_idx >= WCD938X_MAX_SLAVE_CH_TYPES) + return -EINVAL; + dev_dbg(component->dev, "%s: slave_ch_idx: %d", __func__, slave_ch_idx); dev_dbg(component->dev, "%s: ucontrol->value.enumerated.item[0] = %ld\n", __func__, ucontrol->value.enumerated.item[0]); - if (slave_ch_idx != -EINVAL) - wcd938x->tx_master_ch_map[slave_ch_idx] = - wcd938x_slave_get_master_ch( - ucontrol->value.enumerated.item[0]); + wcd938x->tx_master_ch_map[slave_ch_idx] = wcd938x_slave_get_master_ch( + ucontrol->value.enumerated.item[0]); return 0; } From 2d4ec76dfcb685498cf98b71d1031c6919f84376 Mon Sep 17 00:00:00 2001 From: Vignesh Kulothungan Date: Wed, 30 Sep 2020 12:05:28 -0700 Subject: [PATCH 37/59] dsp: check speaker index before accessing array Add check to validate the speaker index before accessing speaker config array. Change-Id: I7060806e327b46c044e5339f2c4bbd0e584feae5 Signed-off-by: Vignesh Kulothungan --- dsp/q6afe.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dsp/q6afe.c b/dsp/q6afe.c index dfb88d1780..9ad237bd1c 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -2280,6 +2280,10 @@ static int afe_send_cps_config(int src_port) continue; } + if (i >= this_afe.num_spkrs) { + pr_err("%s: invalid ch index %d\n", __func__, i); + goto fail_cmd; + } memcpy(packed_payload + cpy_size, &this_afe.cps_config->spkr_dep_cfg[i], sizeof(struct lpass_swr_spkr_dep_cfg_t)); @@ -2302,6 +2306,8 @@ static int afe_send_cps_config(int src_port) pr_err("%s: port = 0x%x param = 0x%x failed %d\n", __func__, src_port, param_info.param_id, ret); + +fail_cmd: pr_debug("%s: config.pdata.param_id 0x%x status %d 0x%x\n", __func__, param_info.param_id, ret, src_port); kfree(packed_payload); From 97d18542c1972524964f2cfce6a3bd9abe8a1a35 Mon Sep 17 00:00:00 2001 From: Saurav Kumar Date: Thu, 10 Sep 2020 16:06:16 +0530 Subject: [PATCH 38/59] dsp: add change to handle use-after-free in cal_utils_is_cal_stale Add change to address the race condition between pointer dereference and memory deallocation. Change-Id: Ia1ed47986ec81d3dc2feb3bc874847fadddac292 Signed-off-by: Saurav Kumar --- asoc/msm-pcm-routing-v2.c | 4 ++-- dsp/audio_cal_utils.c | 38 +++++++++++++++++++++++++++++++---- dsp/audio_calibration.c | 3 ++- dsp/q6adm.c | 11 +++++----- dsp/q6afe.c | 12 +++++------ dsp/q6asm.c | 6 +++--- include/dsp/audio_cal_utils.h | 4 +++- 7 files changed, 56 insertions(+), 22 deletions(-) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index 10a892fde5..e2b9e6bcb0 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -1372,7 +1372,7 @@ static struct cal_block_data *msm_routing_find_topology_by_path(int path, cal_block = list_entry(ptr, struct cal_block_data, list); - if (cal_utils_is_cal_stale(cal_block)) + if (cal_utils_is_cal_stale(cal_block, cal_data[cal_index])) continue; if (((struct audio_cal_info_adm_top *)cal_block @@ -1402,7 +1402,7 @@ static struct cal_block_data *msm_routing_find_topology(int path, cal_block = list_entry(ptr, struct cal_block_data, list); - if (cal_utils_is_cal_stale(cal_block)) + if (cal_utils_is_cal_stale(cal_block, cal_data[cal_index])) continue; cal_info = (struct audio_cal_info_adm_top *) diff --git a/dsp/audio_cal_utils.c b/dsp/audio_cal_utils.c index 9add9f4a23..1e646d2acb 100644 --- a/dsp/audio_cal_utils.c +++ b/dsp/audio_cal_utils.c @@ -10,6 +10,8 @@ #include #include +spinlock_t cal_lock; + static int unmap_memory(struct cal_type_data *cal_type, struct cal_block_data *cal_block); @@ -917,6 +919,7 @@ int cal_utils_dealloc_cal(size_t data_size, void *data, int ret = 0; struct cal_block_data *cal_block; struct audio_cal_type_dealloc *dealloc_data = data; + unsigned long flags = 0; pr_debug("%s\n", __func__); @@ -964,7 +967,9 @@ int cal_utils_dealloc_cal(size_t data_size, void *data, if (ret < 0) goto err; + spin_lock_irqsave(&cal_lock, flags); delete_cal_block(cal_block); + spin_unlock_irqrestore(&cal_lock, flags); err: mutex_unlock(&cal_type->lock); done: @@ -1079,18 +1084,43 @@ void cal_utils_mark_cal_used(struct cal_block_data *cal_block) } EXPORT_SYMBOL(cal_utils_mark_cal_used); +int __init cal_utils_init(void) +{ + spin_lock_init(&cal_lock); + return 0; +} /** * cal_utils_is_cal_stale * * @cal_block: pointer to cal block * + * @cal_type: pointer to the cal type + * * Returns true if cal block is stale, false otherwise */ -bool cal_utils_is_cal_stale(struct cal_block_data *cal_block) +bool cal_utils_is_cal_stale(struct cal_block_data *cal_block, struct cal_type_data *cal_type) { - if ((cal_block) && (cal_block->cal_stale)) - return true; + bool ret = false; + unsigned long flags = 0; - return false; + if (!cal_type) { + pr_err("%s: cal_type is Null", __func__); + goto done; + } + + spin_lock_irqsave(&cal_lock, flags); + cal_block = cal_utils_get_only_cal_block(cal_type); + if (!cal_block) { + pr_err("%s: cal_block is Null", __func__); + goto unlock; + } + + if (cal_block->cal_stale) + ret = true; + +unlock: + spin_unlock_irqrestore(&cal_lock, flags); +done: + return ret; } EXPORT_SYMBOL(cal_utils_is_cal_stale); diff --git a/dsp/audio_calibration.c b/dsp/audio_calibration.c index a5167be3cf..854d882191 100644 --- a/dsp/audio_calibration.c +++ b/dsp/audio_calibration.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2014, 2016-2017, The Linux Foundation. All rights reserved. + * Copyright (c) 2014, 2016-2017, 2020, The Linux Foundation. All rights reserved. */ #include #include @@ -591,6 +591,7 @@ int __init audio_cal_init(void) pr_debug("%s\n", __func__); + cal_utils_init(); memset(&audio_cal, 0, sizeof(audio_cal)); mutex_init(&audio_cal.common_lock); for (; i < MAX_CAL_TYPES; i++) { diff --git a/dsp/q6adm.c b/dsp/q6adm.c index ed97c1f509..bea00a30b0 100644 --- a/dsp/q6adm.c +++ b/dsp/q6adm.c @@ -2038,7 +2038,7 @@ static void send_adm_custom_topology(void) this_adm.set_custom_topology = 0; cal_block = cal_utils_get_only_cal_block(this_adm.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) + if (cal_block == NULL || cal_utils_is_cal_stale(cal_block, this_adm.cal_data[cal_index])) goto unlock; pr_debug("%s: Sending cal_index %d\n", __func__, cal_index); @@ -2178,7 +2178,7 @@ static struct cal_block_data *adm_find_cal_by_path(int cal_index, int path) cal_block = list_entry(ptr, struct cal_block_data, list); - if (cal_utils_is_cal_stale(cal_block)) + if (cal_utils_is_cal_stale(cal_block, this_adm.cal_data[cal_index])) continue; if (cal_index == ADM_AUDPROC_CAL || @@ -2217,7 +2217,7 @@ static struct cal_block_data *adm_find_cal_by_app_type(int cal_index, int path, cal_block = list_entry(ptr, struct cal_block_data, list); - if (cal_utils_is_cal_stale(cal_block)) + if (cal_utils_is_cal_stale(cal_block, this_adm.cal_data[cal_index])) continue; if (cal_index == ADM_AUDPROC_CAL || @@ -2259,7 +2259,7 @@ static struct cal_block_data *adm_find_cal(int cal_index, int path, cal_block = list_entry(ptr, struct cal_block_data, list); - if (cal_utils_is_cal_stale(cal_block)) + if (cal_utils_is_cal_stale(cal_block, this_adm.cal_data[cal_index])) continue; if (cal_index == ADM_AUDPROC_CAL || @@ -4120,7 +4120,8 @@ int send_rtac_audvol_cal(void) cal_block = cal_utils_get_only_cal_block( this_adm.cal_data[ADM_RTAC_AUDVOL_CAL]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { + if (cal_block == NULL || cal_utils_is_cal_stale(cal_block, + this_adm.cal_data[ADM_RTAC_AUDVOL_CAL])) { pr_err("%s: can't find cal block!\n", __func__); goto unlock; } diff --git a/dsp/q6afe.c b/dsp/q6afe.c index dfb88d1780..b5d58abfdd 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -2179,7 +2179,7 @@ static void afe_send_custom_topology(void) goto unlock; this_afe.set_custom_topology = 0; cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { + if (cal_block == NULL || cal_utils_is_cal_stale(cal_block, this_afe.cal_data[cal_index])) { pr_err("%s cal_block not found!!\n", __func__); goto unlock; } @@ -3021,7 +3021,7 @@ static struct cal_block_data *afe_find_cal_topo_id_by_port( cal_block = list_entry(ptr, struct cal_block_data, list); /* Skip cal_block if it is already marked stale */ - if (cal_utils_is_cal_stale(cal_block)) + if (cal_utils_is_cal_stale(cal_block, cal_type)) continue; pr_debug("%s: port id: 0x%x, dev_acdb_id: %d\n", __func__, port_id, this_afe.dev_acdb_id[afe_port_index]); @@ -3596,7 +3596,7 @@ static int send_afe_cal_type(int cal_index, int port_id) cal_block = cal_utils_get_only_cal_block( this_afe.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { + if (cal_block == NULL || cal_utils_is_cal_stale(cal_block, this_afe.cal_data[cal_index])) { pr_err_ratelimited("%s cal_block not found!!\n", __func__); ret = -EINVAL; goto unlock; @@ -8125,7 +8125,7 @@ static int afe_sidetone_iir(u16 tx_port_id) } mutex_lock(&this_afe.cal_data[cal_index]->lock); cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { + if (cal_block == NULL || cal_utils_is_cal_stale(cal_block, this_afe.cal_data[cal_index])) { pr_err("%s: cal_block not found\n ", __func__); mutex_unlock(&this_afe.cal_data[cal_index]->lock); ret = -EINVAL; @@ -8252,7 +8252,7 @@ static int afe_sidetone(u16 tx_port_id, u16 rx_port_id, bool enable) mutex_lock(&this_afe.cal_data[cal_index]->lock); cal_block = cal_utils_get_only_cal_block(this_afe.cal_data[cal_index]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) { + if (cal_block == NULL || cal_utils_is_cal_stale(cal_block, this_afe.cal_data[cal_index])) { pr_err("%s: cal_block not found\n", __func__); mutex_unlock(&this_afe.cal_data[cal_index]->lock); ret = -EINVAL; @@ -10320,7 +10320,7 @@ static struct cal_block_data *afe_find_hw_delay_by_path( cal_block = list_entry(ptr, struct cal_block_data, list); - if (cal_utils_is_cal_stale(cal_block)) + if (cal_utils_is_cal_stale(cal_block, cal_type)) continue; if (((struct audio_cal_info_hw_delay *)cal_block->cal_info) diff --git a/dsp/q6asm.c b/dsp/q6asm.c index ee29873ebe..88dd6d26c6 100644 --- a/dsp/q6asm.c +++ b/dsp/q6asm.c @@ -806,7 +806,7 @@ int send_asm_custom_topology(struct audio_client *ac) set_custom_topology = 0; cal_block = cal_utils_get_only_cal_block(cal_data[ASM_CUSTOM_TOP_CAL]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) + if (cal_block == NULL || cal_utils_is_cal_stale(cal_block, cal_data[ASM_CUSTOM_TOP_CAL])) goto unlock; if (cal_block->cal_data.size == 0) { @@ -11010,7 +11010,7 @@ static int q6asm_get_asm_topology_apptype(struct q6asm_cal_info *cal_info) mutex_lock(&cal_data[ASM_TOPOLOGY_CAL]->lock); cal_block = cal_utils_get_only_cal_block(cal_data[ASM_TOPOLOGY_CAL]); - if (cal_block == NULL || cal_utils_is_cal_stale(cal_block)) + if (cal_block == NULL || cal_utils_is_cal_stale(cal_block, cal_data[ASM_CUSTOM_TOP_CAL])) goto unlock; cal_info->topology_id = ((struct audio_cal_info_asm_top *) cal_block->cal_info)->topology; @@ -11070,7 +11070,7 @@ int q6asm_send_cal(struct audio_client *ac) goto unlock; } - if (cal_utils_is_cal_stale(cal_block)) { + if (cal_utils_is_cal_stale(cal_block, cal_data[ASM_AUDSTRM_CAL])) { rc = 0; /* not error case */ pr_debug("%s: cal_block is stale\n", __func__); diff --git a/include/dsp/audio_cal_utils.h b/include/dsp/audio_cal_utils.h index 0ef02ef7e8..2003e76fe1 100644 --- a/include/dsp/audio_cal_utils.h +++ b/include/dsp/audio_cal_utils.h @@ -95,5 +95,7 @@ int32_t cal_utils_get_cal_type_version(void *cal_type_data); void cal_utils_mark_cal_used(struct cal_block_data *cal_block); -bool cal_utils_is_cal_stale(struct cal_block_data *cal_block); +bool cal_utils_is_cal_stale(struct cal_block_data *cal_block, struct cal_type_data *cal_type); + +int cal_utils_init(void); #endif From 62cbd21506f95ef398b5fc0a7bbfc358b802016f Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Mon, 28 Sep 2020 16:01:09 +0800 Subject: [PATCH 39/59] asoc: wcd938x: move 500ms after dev_up sets to true Trigger SSR during headset recording may cause recording mute after SSR. Before dev_up is set to true, micbias enablement for headset detection will return error and micbias enabled for recording return true. After headset is done, micbias is disabled. Move 500ms after dev_up to the end to resolve this issue. Change-Id: I7b9e094321997d64c96cf0e86a4f447d97b5fdb6 Signed-off-by: Meng Wang --- asoc/codecs/wcd938x/wcd938x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c index ef162bacf2..50f9f9e9e7 100644 --- a/asoc/codecs/wcd938x/wcd938x.c +++ b/asoc/codecs/wcd938x/wcd938x.c @@ -2184,8 +2184,6 @@ static int wcd938x_event_notify(struct notifier_block *block, __func__); } else { wcd938x_mbhc_hs_detect(component, mbhc->mbhc_cfg); - if (wcd938x->usbc_hs_status) - mdelay(500); } wcd938x->mbhc->wcd_mbhc.deinit_in_progress = false; wcd938x->dev_up = true; @@ -2193,6 +2191,8 @@ static int wcd938x_event_notify(struct notifier_block *block, blocking_notifier_call_chain(&wcd938x->notifier, WCD938X_EVT_SSR_UP, NULL); + if (wcd938x->usbc_hs_status) + mdelay(500); break; case BOLERO_SLV_EVT_CLK_NOTIFY: snd_soc_component_update_bits(component, From 0acec76b451603a0436ad9b601e02d7de0849bb0 Mon Sep 17 00:00:00 2001 From: Kunlei Zhang Date: Tue, 18 Aug 2020 18:33:55 +0800 Subject: [PATCH 40/59] dsp: update cal data lock when deregister cvp calibration Ensure cal data lock is set correctly when deregister cvp calibration. Change-Id: Ib9c50d689431eee1a8d9b4676691d61afd77ae9a Signed-off-by: Kunlei Zhang Signed-off-by: Akhil Karuturi --- dsp/q6voice.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/dsp/q6voice.c b/dsp/q6voice.c index 459fc62dce..2ecf6ba369 100644 --- a/dsp/q6voice.c +++ b/dsp/q6voice.c @@ -3423,14 +3423,13 @@ static int voice_send_cvp_deregister_cal_cmd(struct voice_data *v) goto done; } - mutex_lock(&common.cal_data[cal_index]->lock); cal_block = cal_utils_get_only_cal_block( common.cal_data[cal_index]); if (cal_block == NULL) { pr_err("%s: Cal block is NULL, index %d!\n", __func__, cal_index); ret = -EINVAL; - goto unlock; + goto done; } pr_debug("%s: use hyp assigned %d\n",__func__, hyp_assigned); if (cal_block->cma_mem && hyp_assigned) { @@ -3438,7 +3437,7 @@ static int voice_send_cvp_deregister_cal_cmd(struct voice_data *v) cal_block->map_data.map_size <= 0) { pr_err("%s: No address to map!\n", __func__); ret = -EINVAL; - goto unlock; + goto done; } ret = hyp_assign_phys(cal_block->cal_data.paddr, cal_block->map_data.map_size, @@ -3448,7 +3447,7 @@ static int voice_send_cvp_deregister_cal_cmd(struct voice_data *v) __func__, ret, cal_block->cal_data.paddr, cal_block->map_data.map_size); ret = -EINVAL; - goto unlock; + goto done; } else { hyp_assigned = false; pr_debug("%s: hyp_assign_phys success\n", __func__); @@ -3461,11 +3460,9 @@ static int voice_send_cvp_deregister_cal_cmd(struct voice_data *v) v->async_err)); ret = adsp_err_get_lnx_err_code( v->async_err); - goto unlock; + goto done; } -unlock: - mutex_unlock(&common.cal_data[cal_index]->lock); done: return ret; } @@ -3948,20 +3945,20 @@ static int voice_unmap_cal_memory(int32_t cal_type, __func__, v->session_id, result2); result = result2; + } else { + if (cal_type == CVP_VOCPROC_DYNAMIC_CAL_TYPE) + voice_send_cvp_deregister_vol_cal_cmd(v); + else if (cal_type == CVP_VOCPROC_STATIC_CAL_TYPE) + voice_send_cvp_deregister_cal_cmd(v); + else if (cal_type == CVP_VOCDEV_CFG_CAL_TYPE) + voice_send_cvp_deregister_dev_cfg_cmd(v); + else if (cal_type == CVS_VOCSTRM_STATIC_CAL_TYPE) + voice_send_cvs_deregister_cal_cmd(v); + else + pr_err("%s: Invalid cal type %d!\n", + __func__, cal_type); } - if (cal_type == CVP_VOCPROC_DYNAMIC_CAL_TYPE) - voice_send_cvp_deregister_vol_cal_cmd(v); - else if (cal_type == CVP_VOCPROC_STATIC_CAL_TYPE) - voice_send_cvp_deregister_cal_cmd(v); - else if (cal_type == CVP_VOCDEV_CFG_CAL_TYPE) - voice_send_cvp_deregister_dev_cfg_cmd(v); - else if (cal_type == CVS_VOCSTRM_STATIC_CAL_TYPE) - voice_send_cvs_deregister_cal_cmd(v); - else - pr_err("%s: Invalid cal type %d!\n", - __func__, cal_type); - result2 = voice_send_start_voice_cmd(v); if (result2) { pr_err("%s: Voice_send_start_voice_cmd failed for session 0x%x, err %d!\n", @@ -5383,7 +5380,9 @@ static int voice_destroy_vocproc(struct voice_data *v) } voice_send_cvp_deregister_vol_cal_cmd(v); + mutex_lock(&common.cal_data[CVP_VOCPROC_CAL]->lock); voice_send_cvp_deregister_cal_cmd(v); + mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); voice_send_cvp_deregister_dev_cfg_cmd(v); voice_send_cvs_deregister_cal_cmd(v); @@ -7233,7 +7232,9 @@ int voc_disable_device(uint32_t session_id) } rtac_remove_voice(voice_get_cvs_handle(v)); voice_send_cvp_deregister_vol_cal_cmd(v); + mutex_lock(&common.cal_data[CVP_VOCPROC_CAL]->lock); voice_send_cvp_deregister_cal_cmd(v); + mutex_unlock(&common.cal_data[CVP_VOCPROC_CAL]->lock); voice_send_cvp_deregister_dev_cfg_cmd(v); /* Unload topology modules */ From 530a9c8d6e86814468d82500aec57601fd0d4919 Mon Sep 17 00:00:00 2001 From: Divya Sharma Date: Mon, 5 Oct 2020 19:04:16 -0700 Subject: [PATCH 41/59] Revert "asoc: bolero: switch clk to VA_CLK for LPI SVA" This reverts commit 1a7cee75ba63d6cce68924591b125d604bef39f5. Change-Id: I27f4b23650ed66560dca8e067ca010870e121e52 --- asoc/codecs/bolero/bolero-cdc.c | 2 +- asoc/codecs/bolero/tx-macro.c | 48 +++-------------- asoc/codecs/bolero/va-macro.c | 95 ++++++++++++++------------------- 3 files changed, 46 insertions(+), 99 deletions(-) diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index 1a9eeffef2..4a58c2cb34 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -1072,7 +1072,7 @@ EXPORT_SYMBOL(bolero_register_wake_irq); * * @component: pointer to codec component instance. * - * @clk_src: clk source + * @clk_src: 0 for TX_RCG and 1 for VA_RCG * * Returns 0 on success or -EINVAL on error. */ diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index 4ea66165ef..5af73081da 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -179,7 +179,6 @@ struct tx_macro_priv { int amic_sample_rate; bool lpi_enable; bool register_event_listener; - u16 current_clk_id; }; static bool tx_macro_get_data(struct snd_soc_component *component, @@ -1818,11 +1817,11 @@ static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v3[] = { SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", -1, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, tx_macro_tx_swr_clk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", -1, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, tx_macro_va_swr_clk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), }; @@ -2870,46 +2869,12 @@ static int tx_macro_clk_switch(struct snd_soc_component *component, int clk_src) "%s: priv is null for macro!\n", __func__); return -EINVAL; } - dev_dbg(component->dev, - "%s: va_swr_clk_cnt %d, tx_swr_clk_cnt %d, tx_clk_status %d\n", - __func__, tx_priv->va_swr_clk_cnt, - tx_priv->tx_swr_clk_cnt, tx_priv->tx_clk_status); - if (tx_priv->current_clk_id == clk_src) { - dev_dbg(component->dev, - "%s: requested clk %d is same as current\n", - __func__, clk_src); - return 0; - } else if (tx_priv->va_swr_clk_cnt != 0 && tx_priv->tx_clk_status) { - ret = bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - clk_src, - true); - if (ret) { - dev_dbg(component->dev, - "%s: request clock %d enable failed\n", - __func__, clk_src); - goto ret; - } - ret = bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - tx_priv->current_clk_id, - false); - if (ret) { - dev_dbg(component->dev, - "%s: request clock disable failed\n", - __func__); - bolero_clk_rsc_request_clock(tx_priv->dev, - TX_CORE_CLK, - clk_src, - false); - goto ret; - } - tx_priv->current_clk_id = clk_src; - } else { - ret = -EBUSY; + if (tx_priv->swr_ctrl_data) { + ret = swrm_wcd_notify( + tx_priv->swr_ctrl_data[0].tx_swr_pdev, + SWR_REQ_CLK_SWITCH, &clk_src); } -ret: return ret; } @@ -3495,7 +3460,6 @@ static int tx_macro_probe(struct platform_device *pdev) tx_macro_init_ops(&ops, tx_io_base); ops.clk_id_req = TX_CORE_CLK; ops.default_clk_id = TX_CORE_CLK; - tx_priv->current_clk_id = TX_CORE_CLK; ret = bolero_register_macro(&pdev->dev, TX_MACRO, &ops); if (ret) { dev_err(&pdev->dev, diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index 8e32a46cab..13c90fe632 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -381,6 +381,7 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, int ret = 0; struct device *va_dev = NULL; struct va_macro_priv *va_priv = NULL; + int clk_src = 0; if (!va_macro_get_data(component, &va_dev, &va_priv, __func__)) return -EINVAL; @@ -393,31 +394,14 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: - if (va_priv->default_clk_id != VA_CORE_CLK) { - ret = bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - VA_CORE_CLK, - true); - if (ret) { - dev_dbg(component->dev, - "%s: request clock VA_CLK enable failed\n", + if (va_priv->swr_ctrl_data) { + clk_src = CLK_SRC_VA_RCG; + ret = swrm_wcd_notify( + va_priv->swr_ctrl_data[0].va_swr_pdev, + SWR_REQ_CLK_SWITCH, &clk_src); + if (ret) + dev_dbg(va_dev, "%s: clock switch failed\n", __func__); - break; - } - ret = bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - TX_CORE_CLK, - false); - if (ret) { - dev_dbg(component->dev, - "%s: request clock TX_CLK enable failed\n", - __func__); - bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - VA_CORE_CLK, - false); - break; - } } msm_cdc_pinctrl_set_wakeup_capable( va_priv->va_swr_gpio_p, false); @@ -425,31 +409,14 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_POST_PMD: msm_cdc_pinctrl_set_wakeup_capable( va_priv->va_swr_gpio_p, true); - if (va_priv->default_clk_id == TX_CORE_CLK) { - ret = bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - TX_CORE_CLK, - true); - if (ret) { - dev_dbg(component->dev, - "%s: request clock TX_CLK disable failed\n", + if (va_priv->swr_ctrl_data) { + clk_src = CLK_SRC_TX_RCG; + ret = swrm_wcd_notify( + va_priv->swr_ctrl_data[0].va_swr_pdev, + SWR_REQ_CLK_SWITCH, &clk_src); + if (ret) + dev_dbg(va_dev, "%s: clock switch failed\n", __func__); - break; - } - ret = bolero_clk_rsc_request_clock(va_priv->dev, - va_priv->default_clk_id, - VA_CORE_CLK, - false); - if (ret) { - dev_dbg(component->dev, - "%s: request clock VA_CLK disable failed\n", - __func__); - bolero_clk_rsc_request_clock(va_priv->dev, - TX_CORE_CLK, - TX_CORE_CLK, - false); - break; - } } break; default: @@ -488,11 +455,10 @@ static int va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, "%s: lpass audio hw enable failed\n", __func__); } - if (!ret) { - if (bolero_tx_clk_switch(component, VA_CORE_CLK)) + if (!ret) + if (bolero_tx_clk_switch(component, CLK_SRC_VA_RCG)) dev_dbg(va_dev, "%s: clock switch failed\n", __func__); - } if (va_priv->lpi_enable && !va_priv->disable_afe_wakeup_event_listener) { bolero_register_event_listener(component, true); @@ -504,7 +470,7 @@ static int va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, va_priv->register_event_listener = false; bolero_register_event_listener(component, false); } - if (bolero_tx_clk_switch(component, TX_CORE_CLK)) + if (bolero_tx_clk_switch(component, CLK_SRC_TX_RCG)) dev_dbg(va_dev, "%s: clock switch failed\n",__func__); if (va_priv->lpass_audio_hw_vote) digital_cdc_rsc_mgr_hw_vote_disable( @@ -545,6 +511,7 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, int ret = 0; struct device *va_dev = NULL; struct va_macro_priv *va_priv = NULL; + int clk_src = 0; if (!va_macro_get_data(component, &va_dev, &va_priv, __func__)) return -EINVAL; @@ -566,6 +533,22 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, break; case SND_SOC_DAPM_POST_PMD: if (va_priv->lpi_enable) { + if (va_priv->version == BOLERO_VERSION_2_1) { + if (va_priv->swr_ctrl_data) { + clk_src = CLK_SRC_TX_RCG; + ret = swrm_wcd_notify( + va_priv->swr_ctrl_data[0].va_swr_pdev, + SWR_REQ_CLK_SWITCH, &clk_src); + if (ret) + dev_dbg(va_dev, + "%s: clock switch failed\n", + __func__); + } + } else if (bolero_tx_clk_switch(component, + CLK_SRC_TX_RCG)) { + dev_dbg(va_dev, "%s: clock switch failed\n", + __func__); + } va_macro_mclk_enable(va_priv, 0, true); } else { bolero_tx_mclk_enable(component, 0); @@ -1963,15 +1946,15 @@ static const struct snd_soc_dapm_widget va_macro_dapm_widgets_v2[] = { VA_MACRO_AIF3_CAP, 0, va_aif3_cap_mixer_v2, ARRAY_SIZE(va_aif3_cap_mixer_v2)), - SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", 0, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", -1, SND_SOC_NOPM, 0, 0, va_macro_swr_pwr_event_v2, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("VA_TX_SWR_CLK", -1, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("VA_TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, va_macro_tx_swr_clk_event_v2, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", -1, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0, va_macro_swr_clk_event_v2, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), }; @@ -2005,7 +1988,7 @@ static const struct snd_soc_dapm_widget va_macro_dapm_widgets_v3[] = { SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), - SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", 0, SND_SOC_NOPM, 0, 0, + SND_SOC_DAPM_SUPPLY_S("VA_SWR_PWR", -1, SND_SOC_NOPM, 0, 0, va_macro_swr_pwr_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), }; From 84e38038e53deab93f168d3ef995db09548a1ead Mon Sep 17 00:00:00 2001 From: Divya Sharma Date: Mon, 5 Oct 2020 19:04:19 -0700 Subject: [PATCH 42/59] Revert "Revert "Revert "ASoC: bolero: check clock source before clock switch""" This reverts commit 0dbd04d8712efd168e1bd258b2c4dda5d107da07. Change-Id: I690350b0f8e1cb9484961740294dbbbd5b1a0806 --- asoc/codecs/bolero/bolero-cdc.c | 36 ------------------------ asoc/codecs/bolero/bolero-cdc.h | 13 --------- asoc/codecs/bolero/tx-macro.c | 31 --------------------- asoc/codecs/bolero/va-macro.c | 49 ++------------------------------- 4 files changed, 3 insertions(+), 126 deletions(-) diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index 4a58c2cb34..dcc65452b0 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -688,7 +688,6 @@ int bolero_register_macro(struct device *dev, u16 macro_id, bolero_mclk_mux_tbl[macro_id][MCLK_MUX0]; if (macro_id == TX_MACRO) { priv->macro_params[macro_id].reg_wake_irq = ops->reg_wake_irq; - priv->macro_params[macro_id].clk_switch = ops->clk_switch; priv->macro_params[macro_id].reg_evt_listener = ops->reg_evt_listener; priv->macro_params[macro_id].clk_enable = ops->clk_enable; @@ -763,7 +762,6 @@ void bolero_unregister_macro(struct device *dev, u16 macro_id) priv->macro_params[macro_id].dev = NULL; if (macro_id == TX_MACRO) { priv->macro_params[macro_id].reg_wake_irq = NULL; - priv->macro_params[macro_id].clk_switch = NULL; priv->macro_params[macro_id].reg_evt_listener = NULL; priv->macro_params[macro_id].clk_enable = NULL; } @@ -1067,40 +1065,6 @@ int bolero_register_wake_irq(struct snd_soc_component *component, } EXPORT_SYMBOL(bolero_register_wake_irq); -/** - * bolero_tx_clk_switch - Switch tx macro clock - * - * @component: pointer to codec component instance. - * - * @clk_src: 0 for TX_RCG and 1 for VA_RCG - * - * Returns 0 on success or -EINVAL on error. - */ -int bolero_tx_clk_switch(struct snd_soc_component *component, int clk_src) -{ - struct bolero_priv *priv = NULL; - int ret = 0; - - if (!component) - return -EINVAL; - - priv = snd_soc_component_get_drvdata(component); - if (!priv) - return -EINVAL; - - if (!bolero_is_valid_codec_dev(priv->dev)) { - dev_err(component->dev, "%s: invalid codec\n", __func__); - return -EINVAL; - } - - if (priv->macro_params[TX_MACRO].clk_switch) - ret = priv->macro_params[TX_MACRO].clk_switch(component, - clk_src); - - return ret; -} -EXPORT_SYMBOL(bolero_tx_clk_switch); - /** * bolero_tx_mclk_enable - Enable/Disable TX Macro mclk * diff --git a/asoc/codecs/bolero/bolero-cdc.h b/asoc/codecs/bolero/bolero-cdc.h index 19b0c89d92..fe0aa64c0a 100644 --- a/asoc/codecs/bolero/bolero-cdc.h +++ b/asoc/codecs/bolero/bolero-cdc.h @@ -37,11 +37,6 @@ enum { BOLERO_ADC_MAX }; -enum { - CLK_SRC_TX_RCG = 0, - CLK_SRC_VA_RCG, -}; - enum { BOLERO_MACRO_EVT_RX_MUTE = 1, /* for RX mute/unmute */ BOLERO_MACRO_EVT_IMPED_TRUE, /* for imped true */ @@ -79,7 +74,6 @@ struct macro_ops { int (*set_port_map)(struct snd_soc_component *component, u32 uc, u32 size, void *data); int (*clk_div_get)(struct snd_soc_component *component); - int (*clk_switch)(struct snd_soc_component *component, int clk_src); int (*reg_evt_listener)(struct snd_soc_component *component, bool en); int (*clk_enable)(struct snd_soc_component *c, bool en); char __iomem *io_base; @@ -106,7 +100,6 @@ void bolero_clear_amic_tx_hold(struct device *dev, u16 adc_n); int bolero_runtime_resume(struct device *dev); int bolero_runtime_suspend(struct device *dev); int bolero_set_port_map(struct snd_soc_component *component, u32 size, void *data); -int bolero_tx_clk_switch(struct snd_soc_component *component, int clk_src); int bolero_register_event_listener(struct snd_soc_component *component, bool enable); void bolero_wsa_pa_on(struct device *dev, bool adie_lb); @@ -179,12 +172,6 @@ static inline int bolero_set_port_map(struct snd_soc_component *component, return 0; } -static inline int bolero_tx_clk_switch(struct snd_soc_component *component, - int clk_src) -{ - return 0; -} - static inline int bolero_register_event_listener( struct snd_soc_component *component, bool enable) diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index 5af73081da..ad7681ebcf 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -2848,36 +2848,6 @@ static int tx_macro_clk_div_get(struct snd_soc_component *component) return tx_priv->dmic_clk_div; } -static int tx_macro_clk_switch(struct snd_soc_component *component, int clk_src) -{ - struct device *tx_dev = NULL; - struct tx_macro_priv *tx_priv = NULL; - int ret = 0; - - if (!component) - return -EINVAL; - - tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO); - if (!tx_dev) { - dev_err(component->dev, - "%s: null device for macro!\n", __func__); - return -EINVAL; - } - tx_priv = dev_get_drvdata(tx_dev); - if (!tx_priv) { - dev_err(component->dev, - "%s: priv is null for macro!\n", __func__); - return -EINVAL; - } - if (tx_priv->swr_ctrl_data) { - ret = swrm_wcd_notify( - tx_priv->swr_ctrl_data[0].tx_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - } - - return ret; -} - static int tx_macro_core_vote(void *handle, bool enable) { struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle; @@ -3361,7 +3331,6 @@ static void tx_macro_init_ops(struct macro_ops *ops, ops->reg_wake_irq = tx_macro_reg_wake_irq; ops->set_port_map = tx_macro_set_port_map; ops->clk_div_get = tx_macro_clk_div_get; - ops->clk_switch = tx_macro_clk_switch; ops->reg_evt_listener = tx_macro_register_event_listener; ops->clk_enable = __tx_macro_mclk_enable; } diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index 13c90fe632..14e55d6a33 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -381,7 +381,6 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, int ret = 0; struct device *va_dev = NULL; struct va_macro_priv *va_priv = NULL; - int clk_src = 0; if (!va_macro_get_data(component, &va_dev, &va_priv, __func__)) return -EINVAL; @@ -394,30 +393,12 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: - if (va_priv->swr_ctrl_data) { - clk_src = CLK_SRC_VA_RCG; - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - if (ret) - dev_dbg(va_dev, "%s: clock switch failed\n", - __func__); - } msm_cdc_pinctrl_set_wakeup_capable( va_priv->va_swr_gpio_p, false); break; case SND_SOC_DAPM_POST_PMD: msm_cdc_pinctrl_set_wakeup_capable( va_priv->va_swr_gpio_p, true); - if (va_priv->swr_ctrl_data) { - clk_src = CLK_SRC_TX_RCG; - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - if (ret) - dev_dbg(va_dev, "%s: clock switch failed\n", - __func__); - } break; default: dev_err(va_priv->dev, @@ -455,12 +436,8 @@ static int va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, "%s: lpass audio hw enable failed\n", __func__); } - if (!ret) - if (bolero_tx_clk_switch(component, CLK_SRC_VA_RCG)) - dev_dbg(va_dev, "%s: clock switch failed\n", - __func__); if (va_priv->lpi_enable && - !va_priv->disable_afe_wakeup_event_listener) { + !va_priv->disable_afe_wakeup_event_listener) { bolero_register_event_listener(component, true); va_priv->register_event_listener = true; } @@ -470,8 +447,6 @@ static int va_macro_swr_pwr_event(struct snd_soc_dapm_widget *w, va_priv->register_event_listener = false; bolero_register_event_listener(component, false); } - if (bolero_tx_clk_switch(component, CLK_SRC_TX_RCG)) - dev_dbg(va_dev, "%s: clock switch failed\n",__func__); if (va_priv->lpass_audio_hw_vote) digital_cdc_rsc_mgr_hw_vote_disable( va_priv->lpass_audio_hw_vote); @@ -511,7 +486,6 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, int ret = 0; struct device *va_dev = NULL; struct va_macro_priv *va_priv = NULL; - int clk_src = 0; if (!va_macro_get_data(component, &va_dev, &va_priv, __func__)) return -EINVAL; @@ -532,27 +506,10 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, ret = bolero_tx_mclk_enable(component, 1); break; case SND_SOC_DAPM_POST_PMD: - if (va_priv->lpi_enable) { - if (va_priv->version == BOLERO_VERSION_2_1) { - if (va_priv->swr_ctrl_data) { - clk_src = CLK_SRC_TX_RCG; - ret = swrm_wcd_notify( - va_priv->swr_ctrl_data[0].va_swr_pdev, - SWR_REQ_CLK_SWITCH, &clk_src); - if (ret) - dev_dbg(va_dev, - "%s: clock switch failed\n", - __func__); - } - } else if (bolero_tx_clk_switch(component, - CLK_SRC_TX_RCG)) { - dev_dbg(va_dev, "%s: clock switch failed\n", - __func__); - } + if (va_priv->lpi_enable) va_macro_mclk_enable(va_priv, 0, true); - } else { + else bolero_tx_mclk_enable(component, 0); - } if (va_priv->tx_clk_status > 0) { bolero_clk_rsc_request_clock(va_priv->dev, From 984a4dcaf70391da84950c563ad9ca177273842f Mon Sep 17 00:00:00 2001 From: Divya Sharma Date: Mon, 5 Oct 2020 19:04:21 -0700 Subject: [PATCH 43/59] Revert "soc: remove error log in lpi gpio write" This reverts commit b0df2d8ab54348f908efe970eb0d29cc1e0d26ac. Change-Id: Ieff48a264ea0cdcd690bb40f1b67f965731161a8 --- soc/pinctrl-lpi.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/soc/pinctrl-lpi.c b/soc/pinctrl-lpi.c index 5f93cf5971..03d9112880 100644 --- a/soc/pinctrl-lpi.c +++ b/soc/pinctrl-lpi.c @@ -181,6 +181,8 @@ static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr, int ret = 0; if (!lpi_dev_up) { + pr_err_ratelimited("%s: ADSP is down due to SSR, return\n", + __func__); return 0; } pm_runtime_get_sync(lpi_dev); From be8401cbbd03989a3a01b6e4e4104c6a7952b532 Mon Sep 17 00:00:00 2001 From: Divya Sharma Date: Mon, 5 Oct 2020 19:04:23 -0700 Subject: [PATCH 44/59] Revert "dsp: ion: avoid dma_buf_put twice when msm_audio_ion_map_buf fails" This reverts commit 48ff19f07187319ac3a49d75b1ff2c7bdf49c3ea. Change-Id: I446016ea63e45ece389096cd02a60fdff1820b00 --- dsp/msm_audio_ion_vm.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dsp/msm_audio_ion_vm.c b/dsp/msm_audio_ion_vm.c index 2cf2861d9f..1d3002985b 100644 --- a/dsp/msm_audio_ion_vm.c +++ b/dsp/msm_audio_ion_vm.c @@ -582,13 +582,17 @@ int msm_audio_ion_alloc(struct dma_buf **dma_buf, size_t bufsz, rc = msm_audio_ion_map_buf(*dma_buf, paddr, plen, vaddr); if (rc) { pr_err("%s: failed to map ION buf, rc = %d\n", __func__, rc); - goto err; + goto err_dma_buf; } pr_debug("%s: mapped address = %pK, size=%zd\n", __func__, *vaddr, bufsz); memset(*vaddr, 0, bufsz); + return rc; + +err_dma_buf: + dma_buf_put(*dma_buf); err: return rc; } From a07613afcda82bf0775c42da7df1f6a5cb949159 Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Wed, 2 Sep 2020 19:59:00 +0530 Subject: [PATCH 45/59] soc: Add ratelimit to supress the pr_err/dev_err. Add ratelimit to supress the logs flooding at the time of SSR.In all places defined ratelimit as, in 1sec one debug msg prints. Change-Id: I6dfe140848e5cecb1b311c432f8311cdf0615a58 Signed-off-by: Prasad Kumpatla --- asoc/codecs/audio-ext-clk-up.c | 18 +++++++++++++----- asoc/codecs/bolero/bolero-cdc.c | 7 +++++-- asoc/codecs/bolero/bolero-clk-rsc.c | 17 ++++++++++++----- dsp/q6afe.c | 5 ++++- ipc/apr.c | 5 ++++- soc/pinctrl-lpi.c | 12 +++++++++--- 6 files changed, 47 insertions(+), 17 deletions(-) diff --git a/asoc/codecs/audio-ext-clk-up.c b/asoc/codecs/audio-ext-clk-up.c index d724850053..acd00da914 100644 --- a/asoc/codecs/audio-ext-clk-up.c +++ b/asoc/codecs/audio-ext-clk-up.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. */ #include @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "audio-ext-clk-up.h" @@ -67,6 +68,7 @@ static int audio_ext_clk_prepare(struct clk_hw *hw) struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); struct pinctrl_info *pnctrl_info = &clk_priv->audio_clk.pnctrl_info; int ret; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) && (clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) { @@ -75,7 +77,8 @@ static int audio_ext_clk_prepare(struct clk_hw *hw) __func__, clk_priv->clk_src); ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); if (ret < 0) { - pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n", + if (__ratelimit(&rtl)) + pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n", __func__); return ret; } @@ -101,6 +104,7 @@ static void audio_ext_clk_unprepare(struct clk_hw *hw) struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); struct pinctrl_info *pnctrl_info = &clk_priv->audio_clk.pnctrl_info; int ret; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (pnctrl_info->pinctrl) { ret = pinctrl_select_state(pnctrl_info->pinctrl, @@ -118,9 +122,11 @@ static void audio_ext_clk_unprepare(struct clk_hw *hw) trace_printk("%s: unvote for %d clock\n", __func__, clk_priv->clk_src); ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); - if (ret < 0) - pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n", + if (ret < 0) { + if (__ratelimit(&rtl)) + pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n", __func__, ret); + } } if (pnctrl_info->base) @@ -149,6 +155,7 @@ static int lpass_hw_vote_prepare(struct clk_hw *hw) { struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); int ret; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { trace_printk("%s: vote for %d clock\n", @@ -170,7 +177,8 @@ static int lpass_hw_vote_prepare(struct clk_hw *hw) "LPASS_HW_DCODEC", &clk_priv->lpass_audio_hwvote_client_handle); if (ret < 0) { - pr_err("%s lpass audio hw vote failed %d\n", + if (__ratelimit(&rtl)) + pr_err("%s lpass audio hw vote failed %d\n", __func__, ret); return ret; } diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index 1a9eeffef2..5603c388d1 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "bolero-cdc.h" #include "internal.h" #include "bolero-clk-rsc.h" @@ -1444,6 +1445,7 @@ int bolero_runtime_resume(struct device *dev) { struct bolero_priv *priv = dev_get_drvdata(dev->parent); int ret = 0; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); mutex_lock(&priv->vote_lock); if (priv->lpass_core_hw_vote == NULL) { @@ -1472,8 +1474,9 @@ audio_vote: if (priv->core_audio_vote_count == 0) { ret = digital_cdc_rsc_mgr_hw_vote_enable(priv->lpass_audio_hw_vote); if (ret < 0) { - dev_err(dev, "%s:lpass audio hw enable failed\n", - __func__); + if (__ratelimit(&rtl)) + dev_err(dev, "%s:lpass audio hw enable failed\n", + __func__); goto done; } } diff --git a/asoc/codecs/bolero/bolero-clk-rsc.c b/asoc/codecs/bolero/bolero-clk-rsc.c index b134819e0c..b20017a2ff 100644 --- a/asoc/codecs/bolero/bolero-clk-rsc.c +++ b/asoc/codecs/bolero/bolero-clk-rsc.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "bolero-cdc.h" #include "bolero-clk-rsc.h" @@ -193,13 +194,15 @@ static int bolero_clk_rsc_mux0_clk_request(struct bolero_clk_rsc *priv, bool enable) { int ret = 0; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (enable) { /* Enable Requested Core clk */ if (priv->clk_cnt[clk_id] == 0) { ret = clk_prepare_enable(priv->clk[clk_id]); if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + if (__ratelimit(&rtl)) + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", __func__, clk_id); goto done; } @@ -207,7 +210,8 @@ static int bolero_clk_rsc_mux0_clk_request(struct bolero_clk_rsc *priv, ret = clk_prepare_enable( priv->clk[clk_id + NPL_CLK_OFFSET]); if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + if (__ratelimit(&rtl)) + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", __func__, clk_id + NPL_CLK_OFFSET); goto err; @@ -246,6 +250,7 @@ static int bolero_clk_rsc_mux1_clk_request(struct bolero_clk_rsc *priv, int ret = 0; int default_clk_id = priv->default_clk_id[clk_id]; u32 muxsel = 0; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); clk_muxsel = bolero_clk_rsc_get_clk_muxsel(priv, clk_id); if (!clk_muxsel) { @@ -265,15 +270,17 @@ static int bolero_clk_rsc_mux1_clk_request(struct bolero_clk_rsc *priv, ret = clk_prepare_enable(priv->clk[clk_id]); if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", - __func__, clk_id); + if (__ratelimit(&rtl)) + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + __func__, clk_id); goto err_clk; } if (priv->clk[clk_id + NPL_CLK_OFFSET]) { ret = clk_prepare_enable( priv->clk[clk_id + NPL_CLK_OFFSET]); if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + if (__ratelimit(&rtl)) + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", __func__, clk_id + NPL_CLK_OFFSET); goto err_npl_clk; diff --git a/dsp/q6afe.c b/dsp/q6afe.c index dfb88d1780..7439929bfd 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include "adsp_err.h" @@ -9216,6 +9217,7 @@ int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg) { struct param_hdr_v3 param_hdr; int ret = 0; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!cfg) { pr_err("%s: clock cfg is NULL\n", __func__); @@ -9254,7 +9256,8 @@ int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg) ret = q6afe_svc_pack_and_set_param_in_band(index, param_hdr, (u8 *) cfg); if (ret < 0) { - pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n", + if (__ratelimit(&rtl)) + pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n", __func__, ret); trace_printk("%s: AFE clk cfg failed with ret %d\n", __func__, ret); diff --git a/ipc/apr.c b/ipc/apr.c index 87fb8907b5..07270cb376 100644 --- a/ipc/apr.c +++ b/ipc/apr.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -370,6 +371,7 @@ int apr_send_pkt(void *handle, uint32_t *buf) uint16_t w_len; int rc; unsigned long flags; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!handle || !buf) { pr_err("APR: Wrong parameters for %s\n", @@ -383,7 +385,8 @@ int apr_send_pkt(void *handle, uint32_t *buf) if ((svc->dest_id == APR_DEST_QDSP6) && (apr_get_q6_state() != APR_SUBSYS_LOADED)) { - pr_err_ratelimited("%s: Still dsp is not Up\n", __func__); + if (__ratelimit(&rtl)) + pr_err_ratelimited("%s: Still dsp is not Up\n", __func__); return -ENETRESET; } else if ((svc->dest_id == APR_DEST_MODEM) && (apr_get_modem_state() == APR_SUBSYS_DOWN)) { diff --git a/soc/pinctrl-lpi.c b/soc/pinctrl-lpi.c index 5f93cf5971..0f066beade 100644 --- a/soc/pinctrl-lpi.c +++ b/soc/pinctrl-lpi.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -148,16 +149,19 @@ static int lpi_gpio_read(struct lpi_gpio_pad *pad, unsigned int addr) { int ret = 0; struct lpi_gpio_state *state = dev_get_drvdata(lpi_dev); + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!lpi_dev_up) { - pr_err_ratelimited("%s: ADSP is down due to SSR, return\n", + if (__ratelimit(&rtl)) + pr_err("%s: ADSP is down due to SSR, return\n", __func__); return 0; } pm_runtime_get_sync(lpi_dev); mutex_lock(&state->core_hw_vote_lock); if (!state->core_hw_vote_status) { - pr_err_ratelimited("%s: core hw vote clk is not enabled\n", + if (__ratelimit(&rtl)) + pr_err("%s: core hw vote clk is not enabled\n", __func__); ret = -EINVAL; goto err; @@ -179,6 +183,7 @@ static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr, { struct lpi_gpio_state *state = dev_get_drvdata(lpi_dev); int ret = 0; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!lpi_dev_up) { return 0; @@ -186,7 +191,8 @@ static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr, pm_runtime_get_sync(lpi_dev); mutex_lock(&state->core_hw_vote_lock); if (!state->core_hw_vote_status) { - pr_err_ratelimited("%s: core hw vote clk is not enabled\n", + if (__ratelimit(&rtl)) + pr_err("%s: core hw vote clk is not enabled\n", __func__); ret = -EINVAL; goto err; From 2844b414802b83cc72a23325905db73b9c8ee078 Mon Sep 17 00:00:00 2001 From: Deeraj Soman Date: Fri, 20 Mar 2020 19:21:49 +0900 Subject: [PATCH 46/59] asoc: Add 32bit support in meta i2s Add 32bit PCM support in META I2S Change-Id: I9dc09f853858f09a8bcd0a6529416abf1e159e71 Signed-off-by: Deeraj Soman --- asoc/msm-dai-q6-v2.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c index 8b589a7787..3ed951c2fb 100644 --- a/asoc/msm-dai-q6-v2.c +++ b/asoc/msm-dai-q6-v2.c @@ -7021,6 +7021,10 @@ static int msm_dai_q6_meta_mi2s_hw_params(struct snd_pcm_substream *substream, port_cfg->bit_width = 24; dai_data->bitwidth = 24; break; + case SNDRV_PCM_FORMAT_S32_LE: + port_cfg->bit_width = 32; + dai_data->bitwidth = 32; + break; default: pr_err("%s: format %d\n", __func__, params_format(params)); From 0538f8320d5553ff1d2bbb4944da885a84f2139c Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Wed, 7 Oct 2020 11:44:43 +0530 Subject: [PATCH 47/59] asoc: codecs: add sem initialize for blocking notifier. add semaphore initialize for the notifier before the blocking notifier. Change-Id: I20a919215fdc0da1830368070063fbe2b8fc5f62 Signed-off-by: Prasad Kumpatla --- asoc/codecs/bolero/bolero-cdc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index 1a9eeffef2..8e71a842bd 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -1373,6 +1373,7 @@ static int bolero_probe(struct platform_device *pdev) bolero_reg_access[VA_MACRO] = bolero_va_reg_access_v3; } + BLOCKING_INIT_NOTIFIER_HEAD(&priv->notifier); priv->dev = &pdev->dev; priv->dev_up = true; priv->initial_boot = true; From dfa3df69ae2ac6f94ce868eab0db726eaf90595d Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Thu, 17 Sep 2020 14:46:54 +0800 Subject: [PATCH 48/59] asoc: bolero: update logic for va clk switch on bolero 2.1 On bolero 2.1, SVA switch is not retain at VA_CLK when switch between handset and headset mic sva. Update the clock release logic during swr power event. Change-Id: I62b492dcbff4b4f3249d1a6b3b792690b5b5c27c Signed-off-by: Meng Wang --- asoc/codecs/bolero/va-macro.c | 46 +++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index 08dabf3d30..486e157ca4 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -170,9 +170,11 @@ struct va_macro_priv { int va_swr_clk_cnt; int va_clk_status; int tx_clk_status; + int dapm_tx_clk_status; bool lpi_enable; bool register_event_listener; int dec_mode[VA_MACRO_NUM_DECIMATORS]; + u16 current_clk_id; }; static bool va_macro_get_data(struct snd_soc_component *component, @@ -392,7 +394,14 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: - if (va_priv->default_clk_id != VA_CORE_CLK) { + dev_dbg(component->dev, + "%s: va_swr_clk_cnt %d, tx_swr_clk_cnt %d, tx_clk_status %d\n", + __func__, va_priv->va_swr_clk_cnt, + va_priv->tx_swr_clk_cnt, va_priv->tx_clk_status); + if (va_priv->current_clk_id == VA_CORE_CLK) { + return 0; + } else if ( va_priv->va_swr_clk_cnt != 0 && + va_priv->tx_clk_status) { ret = bolero_clk_rsc_request_clock(va_priv->dev, va_priv->default_clk_id, VA_CORE_CLK, @@ -417,6 +426,7 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, false); break; } + va_priv->current_clk_id = VA_CORE_CLK; } msm_cdc_pinctrl_set_wakeup_capable( va_priv->va_swr_gpio_p, false); @@ -424,7 +434,9 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_POST_PMD: msm_cdc_pinctrl_set_wakeup_capable( va_priv->va_swr_gpio_p, true); - if (va_priv->default_clk_id == TX_CORE_CLK) { + if (va_priv->current_clk_id == VA_CORE_CLK && + va_priv->va_swr_clk_cnt != 0 && + va_priv->tx_clk_status) { ret = bolero_clk_rsc_request_clock(va_priv->dev, va_priv->default_clk_id, TX_CORE_CLK, @@ -449,6 +461,7 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, false); break; } + va_priv->current_clk_id = TX_CORE_CLK; } break; default: @@ -555,7 +568,7 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, TX_CORE_CLK, true); if (!ret) - va_priv->tx_clk_status++; + va_priv->dapm_tx_clk_status++; if (va_priv->lpi_enable) ret = va_macro_mclk_enable(va_priv, 1, true); @@ -569,12 +582,12 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, bolero_tx_mclk_enable(component, 0); } - if (va_priv->tx_clk_status > 0) { + if (va_priv->dapm_tx_clk_status > 0) { bolero_clk_rsc_request_clock(va_priv->dev, va_priv->default_clk_id, TX_CORE_CLK, false); - va_priv->tx_clk_status--; + va_priv->dapm_tx_clk_status--; } break; default: @@ -1313,12 +1326,12 @@ static int va_macro_enable_tx(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_POST_PMU: - if (va_priv->tx_clk_status > 0) { + if (va_priv->dapm_tx_clk_status > 0) { ret = bolero_clk_rsc_request_clock(va_priv->dev, va_priv->default_clk_id, TX_CORE_CLK, false); - va_priv->tx_clk_status--; + va_priv->dapm_tx_clk_status--; } break; case SND_SOC_DAPM_PRE_PMD: @@ -1327,7 +1340,7 @@ static int va_macro_enable_tx(struct snd_soc_dapm_widget *w, TX_CORE_CLK, true); if (!ret) - va_priv->tx_clk_status++; + va_priv->dapm_tx_clk_status++; break; default: dev_err(va_priv->dev, @@ -2225,18 +2238,6 @@ static const struct snd_soc_dapm_route va_audio_map_common[] = { {"VA SMIC MUX1", "SWR_MIC11", "VA SWR_INPUT"}, {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - {"VA SWR_INPUT", NULL, "VA_SWR_PWR"}, - }; static const struct snd_soc_dapm_route va_audio_map_v3[] = { @@ -2299,9 +2300,7 @@ static const struct snd_soc_dapm_route va_audio_map_v3[] = { }; static const struct snd_soc_dapm_route va_audio_map_v2[] = { - {"VA_AIF1 CAP", NULL, "VA_SWR_CLK"}, - {"VA_AIF2 CAP", NULL, "VA_SWR_CLK"}, - {"VA_AIF3 CAP", NULL, "VA_SWR_CLK"}, + {"VA SWR_INPUT", NULL, "VA_SWR_CLK"}, }; static const struct snd_soc_dapm_route va_audio_map[] = { @@ -3170,6 +3169,7 @@ static int va_macro_probe(struct platform_device *pdev) } va_priv->clk_id = VA_CORE_CLK; va_priv->default_clk_id = default_clk_id; + va_priv->current_clk_id = TX_CORE_CLK; if (is_used_va_swr_gpio) { va_priv->reset_swr = true; From aba0be655a99ea5e09290ec2a2d18b9518adb780 Mon Sep 17 00:00:00 2001 From: "Vangala, Amarnath" Date: Wed, 7 Oct 2020 21:31:04 +0530 Subject: [PATCH 49/59] asoc: holi: use new pm_qos API This change ensure all concurrent low latency/ ultra low latency use cases run on core 1 and 2. Change-Id: I187787ea609768bbfb6098a844dab4ebef611a9c --- asoc/holi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/asoc/holi.c b/asoc/holi.c index 8c3bdbf24d..04d2c2ddf8 100644 --- a/asoc/holi.c +++ b/asoc/holi.c @@ -4343,7 +4343,8 @@ err: static int msm_fe_qos_prepare(struct snd_pcm_substream *substream) { - (void)substream; + if (pm_qos_request_active(&substream->latency_pm_qos_req)) + pm_qos_remove_request(&substream->latency_pm_qos_req); qos_client_active_cnt++; if (qos_client_active_cnt == 1) From 51cbf9ddffb00a599659a3c77300d10e4663fc05 Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Wed, 2 Sep 2020 19:59:00 +0530 Subject: [PATCH 50/59] soc: Add ratelimit to supress the pr_err/dev_err. Add ratelimit to supress the logs flooding at the time of SSR.In all places defined ratelimit as, in 1sec one debug msg prints. Change-Id: I6dfe140848e5cecb1b311c432f8311cdf0615a58 Signed-off-by: Prasad Kumpatla --- asoc/codecs/audio-ext-clk-up.c | 18 +++++++++++++----- asoc/codecs/bolero/bolero-cdc.c | 7 +++++-- asoc/codecs/bolero/bolero-clk-rsc.c | 17 ++++++++++++----- dsp/q6afe.c | 5 ++++- ipc/apr.c | 5 ++++- soc/pinctrl-lpi.c | 12 +++++++++--- 6 files changed, 47 insertions(+), 17 deletions(-) diff --git a/asoc/codecs/audio-ext-clk-up.c b/asoc/codecs/audio-ext-clk-up.c index d724850053..acd00da914 100644 --- a/asoc/codecs/audio-ext-clk-up.c +++ b/asoc/codecs/audio-ext-clk-up.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. */ #include @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "audio-ext-clk-up.h" @@ -67,6 +68,7 @@ static int audio_ext_clk_prepare(struct clk_hw *hw) struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); struct pinctrl_info *pnctrl_info = &clk_priv->audio_clk.pnctrl_info; int ret; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) && (clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) { @@ -75,7 +77,8 @@ static int audio_ext_clk_prepare(struct clk_hw *hw) __func__, clk_priv->clk_src); ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); if (ret < 0) { - pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n", + if (__ratelimit(&rtl)) + pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n", __func__); return ret; } @@ -101,6 +104,7 @@ static void audio_ext_clk_unprepare(struct clk_hw *hw) struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); struct pinctrl_info *pnctrl_info = &clk_priv->audio_clk.pnctrl_info; int ret; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (pnctrl_info->pinctrl) { ret = pinctrl_select_state(pnctrl_info->pinctrl, @@ -118,9 +122,11 @@ static void audio_ext_clk_unprepare(struct clk_hw *hw) trace_printk("%s: unvote for %d clock\n", __func__, clk_priv->clk_src); ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); - if (ret < 0) - pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n", + if (ret < 0) { + if (__ratelimit(&rtl)) + pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n", __func__, ret); + } } if (pnctrl_info->base) @@ -149,6 +155,7 @@ static int lpass_hw_vote_prepare(struct clk_hw *hw) { struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); int ret; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { trace_printk("%s: vote for %d clock\n", @@ -170,7 +177,8 @@ static int lpass_hw_vote_prepare(struct clk_hw *hw) "LPASS_HW_DCODEC", &clk_priv->lpass_audio_hwvote_client_handle); if (ret < 0) { - pr_err("%s lpass audio hw vote failed %d\n", + if (__ratelimit(&rtl)) + pr_err("%s lpass audio hw vote failed %d\n", __func__, ret); return ret; } diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index 1a9eeffef2..5603c388d1 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "bolero-cdc.h" #include "internal.h" #include "bolero-clk-rsc.h" @@ -1444,6 +1445,7 @@ int bolero_runtime_resume(struct device *dev) { struct bolero_priv *priv = dev_get_drvdata(dev->parent); int ret = 0; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); mutex_lock(&priv->vote_lock); if (priv->lpass_core_hw_vote == NULL) { @@ -1472,8 +1474,9 @@ audio_vote: if (priv->core_audio_vote_count == 0) { ret = digital_cdc_rsc_mgr_hw_vote_enable(priv->lpass_audio_hw_vote); if (ret < 0) { - dev_err(dev, "%s:lpass audio hw enable failed\n", - __func__); + if (__ratelimit(&rtl)) + dev_err(dev, "%s:lpass audio hw enable failed\n", + __func__); goto done; } } diff --git a/asoc/codecs/bolero/bolero-clk-rsc.c b/asoc/codecs/bolero/bolero-clk-rsc.c index b134819e0c..b20017a2ff 100644 --- a/asoc/codecs/bolero/bolero-clk-rsc.c +++ b/asoc/codecs/bolero/bolero-clk-rsc.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "bolero-cdc.h" #include "bolero-clk-rsc.h" @@ -193,13 +194,15 @@ static int bolero_clk_rsc_mux0_clk_request(struct bolero_clk_rsc *priv, bool enable) { int ret = 0; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (enable) { /* Enable Requested Core clk */ if (priv->clk_cnt[clk_id] == 0) { ret = clk_prepare_enable(priv->clk[clk_id]); if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + if (__ratelimit(&rtl)) + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", __func__, clk_id); goto done; } @@ -207,7 +210,8 @@ static int bolero_clk_rsc_mux0_clk_request(struct bolero_clk_rsc *priv, ret = clk_prepare_enable( priv->clk[clk_id + NPL_CLK_OFFSET]); if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + if (__ratelimit(&rtl)) + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", __func__, clk_id + NPL_CLK_OFFSET); goto err; @@ -246,6 +250,7 @@ static int bolero_clk_rsc_mux1_clk_request(struct bolero_clk_rsc *priv, int ret = 0; int default_clk_id = priv->default_clk_id[clk_id]; u32 muxsel = 0; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); clk_muxsel = bolero_clk_rsc_get_clk_muxsel(priv, clk_id); if (!clk_muxsel) { @@ -265,15 +270,17 @@ static int bolero_clk_rsc_mux1_clk_request(struct bolero_clk_rsc *priv, ret = clk_prepare_enable(priv->clk[clk_id]); if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", - __func__, clk_id); + if (__ratelimit(&rtl)) + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + __func__, clk_id); goto err_clk; } if (priv->clk[clk_id + NPL_CLK_OFFSET]) { ret = clk_prepare_enable( priv->clk[clk_id + NPL_CLK_OFFSET]); if (ret < 0) { - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + if (__ratelimit(&rtl)) + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", __func__, clk_id + NPL_CLK_OFFSET); goto err_npl_clk; diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 5a944a6a9d..a7a7c4a536 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include "adsp_err.h" @@ -9222,6 +9223,7 @@ int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg) { struct param_hdr_v3 param_hdr; int ret = 0; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!cfg) { pr_err("%s: clock cfg is NULL\n", __func__); @@ -9260,7 +9262,8 @@ int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg) ret = q6afe_svc_pack_and_set_param_in_band(index, param_hdr, (u8 *) cfg); if (ret < 0) { - pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n", + if (__ratelimit(&rtl)) + pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n", __func__, ret); trace_printk("%s: AFE clk cfg failed with ret %d\n", __func__, ret); diff --git a/ipc/apr.c b/ipc/apr.c index 87fb8907b5..07270cb376 100644 --- a/ipc/apr.c +++ b/ipc/apr.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -370,6 +371,7 @@ int apr_send_pkt(void *handle, uint32_t *buf) uint16_t w_len; int rc; unsigned long flags; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!handle || !buf) { pr_err("APR: Wrong parameters for %s\n", @@ -383,7 +385,8 @@ int apr_send_pkt(void *handle, uint32_t *buf) if ((svc->dest_id == APR_DEST_QDSP6) && (apr_get_q6_state() != APR_SUBSYS_LOADED)) { - pr_err_ratelimited("%s: Still dsp is not Up\n", __func__); + if (__ratelimit(&rtl)) + pr_err_ratelimited("%s: Still dsp is not Up\n", __func__); return -ENETRESET; } else if ((svc->dest_id == APR_DEST_MODEM) && (apr_get_modem_state() == APR_SUBSYS_DOWN)) { diff --git a/soc/pinctrl-lpi.c b/soc/pinctrl-lpi.c index 5f93cf5971..0f066beade 100644 --- a/soc/pinctrl-lpi.c +++ b/soc/pinctrl-lpi.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -148,16 +149,19 @@ static int lpi_gpio_read(struct lpi_gpio_pad *pad, unsigned int addr) { int ret = 0; struct lpi_gpio_state *state = dev_get_drvdata(lpi_dev); + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!lpi_dev_up) { - pr_err_ratelimited("%s: ADSP is down due to SSR, return\n", + if (__ratelimit(&rtl)) + pr_err("%s: ADSP is down due to SSR, return\n", __func__); return 0; } pm_runtime_get_sync(lpi_dev); mutex_lock(&state->core_hw_vote_lock); if (!state->core_hw_vote_status) { - pr_err_ratelimited("%s: core hw vote clk is not enabled\n", + if (__ratelimit(&rtl)) + pr_err("%s: core hw vote clk is not enabled\n", __func__); ret = -EINVAL; goto err; @@ -179,6 +183,7 @@ static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr, { struct lpi_gpio_state *state = dev_get_drvdata(lpi_dev); int ret = 0; + static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!lpi_dev_up) { return 0; @@ -186,7 +191,8 @@ static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr, pm_runtime_get_sync(lpi_dev); mutex_lock(&state->core_hw_vote_lock); if (!state->core_hw_vote_status) { - pr_err_ratelimited("%s: core hw vote clk is not enabled\n", + if (__ratelimit(&rtl)) + pr_err("%s: core hw vote clk is not enabled\n", __func__); ret = -EINVAL; goto err; From a34f3576dca71e9276f77e4a297407b55a3549cb Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Mon, 12 Oct 2020 15:42:06 +0800 Subject: [PATCH 51/59] asoc: routing: remove unnecessary routing for TDM_TX Remove unnecessary routing for TDM_TX to reduce error log during bootup. Change-Id: I1e8c9e2caccd77405a82696c86c4cf2ed29c3ce6 Signed-off-by: Meng Wang --- asoc/msm-pcm-routing-v2.c | 143 -------------------------------------- 1 file changed, 143 deletions(-) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index eab92e9e3d..e45691df41 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -27882,31 +27882,6 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"PRI_TDM_RX_3 Audio Mixer", "MultiMedia34", "MM_DL34"}, {"PRI_TDM_RX_3", NULL, "PRI_TDM_RX_3 Audio Mixer"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia24", "MM_DL24"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia25", "MM_DL25"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia31", "MM_DL31"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia32", "MM_DL32"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia33", "MM_DL33"}, - {"PRI_TDM_TX_0 Audio Mixer", "MultiMedia34", "MM_DL34"}, - {"PRI_TDM_TX_0", NULL, "PRI_TDM_TX_0 Audio Mixer"}, - {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, {"SEC_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, @@ -28015,31 +27990,6 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"SEC_TDM_RX_3 Audio Mixer", "MultiMedia34", "MM_DL34"}, {"SEC_TDM_RX_3", NULL, "SEC_TDM_RX_3 Audio Mixer"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia24", "MM_DL24"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia25", "MM_DL25"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia31", "MM_DL31"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia32", "MM_DL32"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia33", "MM_DL33"}, - {"SEC_TDM_TX_0 Audio Mixer", "MultiMedia34", "MM_DL34"}, - {"SEC_TDM_TX_0", NULL, "SEC_TDM_TX_0 Audio Mixer"}, - {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, @@ -28067,31 +28017,6 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"TERT_TDM_RX_0 Audio Mixer", "MultiMedia34", "MM_DL34"}, {"TERT_TDM_RX_0", NULL, "TERT_TDM_RX_0 Audio Mixer"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia24", "MM_DL24"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia25", "MM_DL25"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia31", "MM_DL31"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia32", "MM_DL32"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia33", "MM_DL33"}, - {"TERT_TDM_TX_0 Audio Mixer", "MultiMedia34", "MM_DL34"}, - {"TERT_TDM_TX_0", NULL, "TERT_TDM_TX_0 Audio Mixer"}, - {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, {"TERT_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, @@ -28228,31 +28153,6 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"QUAT_TDM_RX_0 Audio Mixer", "MultiMedia34", "MM_DL34"}, {"QUAT_TDM_RX_0", NULL, "QUAT_TDM_RX_0 Audio Mixer"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia24", "MM_DL24"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia25", "MM_DL25"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia31", "MM_DL31"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia32", "MM_DL32"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia33", "MM_DL33"}, - {"QUAT_TDM_TX_0 Audio Mixer", "MultiMedia34", "MM_DL34"}, - {"QUAT_TDM_TX_0", NULL, "QUAT_TDM_TX_0 Audio Mixer"}, - {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, {"QUAT_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, @@ -28365,31 +28265,6 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"QUIN_TDM_RX_0 Audio Mixer", "MultiMedia34", "MM_DL34"}, {"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0 Audio Mixer"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia23", "MM_DL23"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia24", "MM_DL24"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia25", "MM_DL25"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia31", "MM_DL31"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia32", "MM_DL32"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia33", "MM_DL33"}, - {"QUIN_TDM_TX_0 Audio Mixer", "MultiMedia34", "MM_DL34"}, - {"QUIN_TDM_TX_0", NULL, "QUIN_TDM_TX_0 Audio Mixer"}, - {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, {"QUIN_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, @@ -28494,24 +28369,6 @@ static const struct snd_soc_dapm_route intercon_tdm[] = { {"SEN_TDM_RX_0 Audio Mixer", "MultiMedia21", "MM_DL21"}, {"SEN_TDM_RX_0", NULL, "SEN_TDM_RX_0 Audio Mixer"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia1", "MM_DL1"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia2", "MM_DL2"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia3", "MM_DL3"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia4", "MM_DL4"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia5", "MM_DL5"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia6", "MM_DL6"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia7", "MM_DL7"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia8", "MM_DL8"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia9", "MM_DL9"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia10", "MM_DL10"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia11", "MM_DL11"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia12", "MM_DL12"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia13", "MM_DL13"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia14", "MM_DL14"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia15", "MM_DL15"}, - {"SEN_TDM_TX_0 Audio Mixer", "MultiMedia16", "MM_DL16"}, - {"SEN_TDM_TX_0", NULL, "SEN_TDM_TX_0 Audio Mixer"}, - {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia1", "MM_DL1"}, {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia2", "MM_DL2"}, {"SEN_TDM_RX_1 Audio Mixer", "MultiMedia3", "MM_DL3"}, From da866c30a683b383cf7b1ea6843f0a5220815a08 Mon Sep 17 00:00:00 2001 From: Manisha Agarwal Date: Thu, 17 Oct 2019 18:19:25 +0800 Subject: [PATCH 52/59] q6afe: add support for lc3 codec playback Add support for lc3 codec playback. Change-Id: I96ee7bb869c89c71bf8ee986529bf8575efd4b5b Signed-off-by: Manisha Agarwal --- asoc/msm-dai-q6-v2.c | 104 +++++++++++++++++++- dsp/q6afe.c | 197 +++++++++++++++++++++++++++++++------ include/dsp/apr_audio-v2.h | 93 +++++++++++++++++ include/dsp/q6afe-v2.h | 7 ++ 4 files changed, 368 insertions(+), 33 deletions(-) diff --git a/asoc/msm-dai-q6-v2.c b/asoc/msm-dai-q6-v2.c index 8b589a7787..dcd538b480 100644 --- a/asoc/msm-dai-q6-v2.c +++ b/asoc/msm-dai-q6-v2.c @@ -31,6 +31,9 @@ #define MSM_DAI_TWS_CHANNEL_MODE_ONE 1 #define MSM_DAI_TWS_CHANNEL_MODE_TWO 2 +#define MSM_DAI_LC3_CHANNEL_MODE_ONE 1 +#define MSM_DAI_LC3_CHANNEL_MODE_TWO 2 + #define spdif_clock_value(rate) (2*rate*32*2) #define CHANNEL_STATUS_SIZE 24 #define CHANNEL_STATUS_MASK_INIT 0x0 @@ -63,6 +66,7 @@ enum { DEC_FMT_MP3 = ASM_MEDIA_FMT_MP3, ENC_FMT_APTX_AD_SPEECH = ASM_MEDIA_FMT_APTX_AD_SPEECH, DEC_FMT_APTX_AD_SPEECH = ASM_MEDIA_FMT_APTX_AD_SPEECH, + ENC_FMT_LC3 = ASM_MEDIA_FMT_LC3, }; enum { @@ -3234,7 +3238,11 @@ static int msm_dai_q6_afe_enc_cfg_get(struct snd_kcontrol *kcontrol, &dai_data->enc_config.data, sizeof(struct asm_aptx_ad_speech_enc_cfg_t)); break; - + case ENC_FMT_LC3: + memcpy(ucontrol->value.bytes.data + format_size, + &dai_data->enc_config.data, + sizeof(struct asm_enc_lc3_cfg_t)); + break; default: pr_debug("%s: unknown format = %d\n", __func__, dai_data->enc_config.format); @@ -3303,6 +3311,11 @@ static int msm_dai_q6_afe_enc_cfg_put(struct snd_kcontrol *kcontrol, ucontrol->value.bytes.data + format_size, sizeof(struct asm_aptx_ad_speech_enc_cfg_t)); break; + case ENC_FMT_LC3: + memcpy(&dai_data->enc_config.data, + ucontrol->value.bytes.data + format_size, + sizeof(struct asm_enc_lc3_cfg_t)); + break; default: pr_debug("%s: Ignore enc config for unknown format = %d\n", @@ -3335,6 +3348,12 @@ static const struct soc_enum tws_chs_mode_enum[] = { SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tws_chs_mode_text), tws_chs_mode_text), }; +static const char *const lc3_chs_mode_text[] = {"Zero", "One", "Two"}; + +static const struct soc_enum lc3_chs_mode_enum[] = { + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(lc3_chs_mode_text), lc3_chs_mode_text), +}; + static int msm_dai_q6_afe_input_channel_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -3424,6 +3443,67 @@ exit: return ret; } +static int msm_dai_q6_lc3_channel_mode_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_dai *dai = kcontrol->private_data; + struct msm_dai_q6_dai_data *dai_data = NULL; + + if (dai) + dai_data = dev_get_drvdata(dai->dev); + + if (dai_data) { + ucontrol->value.integer.value[0] = + dai_data->enc_config.lc3_mono_mode; + pr_debug("%s:lc3 channel mode = %d\n", + __func__, dai_data->enc_config.lc3_mono_mode); + } + + return 0; +} + +static int msm_dai_q6_lc3_channel_mode_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_dai *dai = kcontrol->private_data; + struct msm_dai_q6_dai_data *dai_data = NULL; + int ret = 0; + u32 format = 0; + + if (dai) + dai_data = dev_get_drvdata(dai->dev); + + if (dai_data) + format = dai_data->enc_config.format; + else + goto exit; + + if (format == ENC_FMT_LC3) { + if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { + ret = afe_set_lc3_channel_mode(format, + dai->id, ucontrol->value.integer.value[0]); + if (ret < 0) { + pr_err("%s: channel mode setting failed for LC3\n", + __func__); + goto exit; + } else { + pr_debug("%s: updating lc3 channel mode : %d\n", + __func__, dai_data->enc_config.lc3_mono_mode); + } + } + if (ucontrol->value.integer.value[0] == + MSM_DAI_LC3_CHANNEL_MODE_ONE || + ucontrol->value.integer.value[0] == + MSM_DAI_LC3_CHANNEL_MODE_TWO) + dai_data->enc_config.lc3_mono_mode = + ucontrol->value.integer.value[0]; + else + return -EINVAL; + } +exit: + return ret; +} + static int msm_dai_q6_afe_input_bit_format_get( struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) @@ -3628,7 +3708,10 @@ static const struct snd_kcontrol_new afe_enc_config_controls[] = { .info = msm_dai_q6_afe_enc_cfg_info, .get = msm_dai_q6_afe_enc_cfg_get, .put = msm_dai_q6_afe_enc_cfg_put, - } + }, + SOC_ENUM_EXT("LC3 Channel Mode", lc3_chs_mode_enum[0], + msm_dai_q6_lc3_channel_mode_get, + msm_dai_q6_lc3_channel_mode_put) }; static int msm_dai_q6_afe_dec_cfg_info(struct snd_kcontrol *kcontrol, @@ -3672,6 +3755,13 @@ static int msm_dai_q6_afe_feedback_dec_cfg_get(struct snd_kcontrol *kcontrol, &dai_data->dec_config.data, sizeof(struct asm_aptx_ad_speech_dec_cfg_t)); break; + case ASM_MEDIA_FMT_LC3: + pr_debug("%s: afe_dec_cfg for %d format\n", + __func__, dai_data->dec_config.format); + memcpy(ucontrol->value.bytes.data + format_size + abr_size, + &dai_data->dec_config.data, + sizeof(struct asm_lc3_dec_cfg_t)); + break; default: pr_debug("%s: no afe_dec_cfg for format %d\n", __func__, dai_data->dec_config.format); @@ -3716,6 +3806,13 @@ static int msm_dai_q6_afe_feedback_dec_cfg_put(struct snd_kcontrol *kcontrol, ucontrol->value.bytes.data + format_size + abr_size, sizeof(struct asm_aptx_ad_speech_dec_cfg_t)); break; + case ASM_MEDIA_FMT_LC3: + pr_debug("%s: afe_dec_cfg for %d format\n", + __func__, dai_data->dec_config.format); + memcpy(&dai_data->dec_config.data, + ucontrol->value.bytes.data + format_size + abr_size, + sizeof(struct asm_lc3_dec_cfg_t)); + break; default: pr_debug("%s: no afe_dec_cfg for format %d\n", __func__, dai_data->dec_config.format); @@ -4148,6 +4245,9 @@ static int msm_dai_q6_dai_probe(struct snd_soc_dai *dai) rc = snd_ctl_add(dai->component->card->snd_card, snd_ctl_new1(&afe_enc_config_controls[5], dai_data)); + rc = snd_ctl_add(dai->component->card->snd_card, + snd_ctl_new1(&afe_enc_config_controls[6], + dai)); rc = snd_ctl_add(dai->component->card->snd_card, snd_ctl_new1(&avd_drift_config_controls[2], dai)); diff --git a/dsp/q6afe.c b/dsp/q6afe.c index 5a944a6a9d..af36ca2fd3 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -400,6 +400,10 @@ static int q6afe_load_avcs_modules(int num_modules, u16 port_id, AMDB_MODULE_TYPE_PACKETIZER; pm[i]->payload->load_unload_info[0].id1 = AVS_MODULE_ID_PACKETIZER_COP; + if (format_id == ASM_MEDIA_FMT_LC3) + pm[i]->payload->load_unload_info[0].id1 = + AVS_MODULE_ID_PACKETIZER_COP_V2; + pm[i]->payload->load_unload_info[1].module_type = AMDB_MODULE_TYPE_ENCODER; pm[i]->payload->load_unload_info[1].id1 = @@ -415,6 +419,11 @@ static int q6afe_load_avcs_modules(int num_modules, u16 port_id, AVS_MODULE_ID_DEPACKETIZER_COP; goto load_unload; } + if (format_id == ASM_MEDIA_FMT_LC3) { + pm[i]->payload->load_unload_info[0].id1 = + AVS_MODULE_ID_DEPACKETIZER_COP_V2; + goto load_unload; + } pm[i]->payload->load_unload_info[1].module_type = AMDB_MODULE_TYPE_DECODER; @@ -4897,6 +4906,7 @@ static int q6afe_send_dec_config(u16 port_id, struct afe_matched_port_t matched_port_param; struct asm_aptx_ad_speech_mode_cfg_t speech_codec_init_param; struct param_hdr_v3 param_hdr; + struct avs_cop_v2_param_id_stream_info_t lc3_enc_stream_info; int ret; u32 dec_fmt; @@ -4906,6 +4916,7 @@ static int q6afe_send_dec_config(u16 port_id, memset(&media_type, 0, sizeof(media_type)); memset(&matched_port_param, 0, sizeof(matched_port_param)); memset(&speech_codec_init_param, 0, sizeof(speech_codec_init_param)); + memset(&lc3_enc_stream_info, 0, sizeof(lc3_enc_stream_info)); memset(¶m_hdr, 0, sizeof(param_hdr)); param_hdr.module_id = AFE_MODULE_ID_DECODER; @@ -4920,6 +4931,12 @@ static int q6afe_send_dec_config(u16 port_id, if (cfg->format == ENC_CODEC_TYPE_LDAC) dec_depkt_id_param.dec_depacketizer_id = AFE_MODULE_ID_DEPACKETIZER_COP; + if (format == ASM_MEDIA_FMT_LC3) { + pr_debug("%s: sending AFE_MODULE_ID_DEPACKETIZER_COP_V2 to DSP payload\n", + __func__); + dec_depkt_id_param.dec_depacketizer_id = + AFE_MODULE_ID_DEPACKETIZER_COP_V2; + } ret = q6afe_pack_and_set_param_in_band(port_id, q6audio_get_port_index(port_id), param_hdr, @@ -5027,6 +5044,9 @@ static int q6afe_send_dec_config(u16 port_id, case ASM_MEDIA_FMT_APTX_AD_SPEECH: media_type.sample_rate = AFE_PORT_SAMPLE_RATE_32K; break; + case ASM_MEDIA_FMT_LC3: + media_type.sample_rate = AFE_PORT_SAMPLE_RATE_48K; + break; default: media_type.sample_rate = afe_config.slim_sch.sample_rate; @@ -5054,18 +5074,15 @@ static int q6afe_send_dec_config(u16 port_id, if (format != ASM_MEDIA_FMT_SBC && format != ASM_MEDIA_FMT_AAC_V2 && format != ASM_MEDIA_FMT_APTX_ADAPTIVE && - format != ASM_MEDIA_FMT_APTX_AD_SPEECH) { + format != ASM_MEDIA_FMT_APTX_AD_SPEECH && + format != ASM_MEDIA_FMT_LC3) { pr_debug("%s:Unsuppported dec format. Ignore AFE config %u\n", __func__, format); goto exit; } - if (format == ASM_MEDIA_FMT_APTX_ADAPTIVE && - cfg->abr_dec_cfg.is_abr_enabled) { - pr_debug("%s: Ignore AFE config for abr case\n", __func__); - goto exit; - } - if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) { + if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH || + format == ASM_MEDIA_FMT_LC3) { pr_debug("%s: sending AFE_PARAM_ID_RATE_MATCHED_PORT to DSP payload\n", __func__); param_hdr.param_id = AFE_PARAM_ID_RATE_MATCHED_PORT; @@ -5084,6 +5101,32 @@ static int q6afe_send_dec_config(u16 port_id, } } + if (format == ASM_MEDIA_FMT_LC3) { + pr_debug("%s: sending AVS_COP_V2_PARAM_ID_STREAM_INFO to DSP\n", + __func__); + param_hdr.module_id = AFE_MODULE_ID_DECODER; + param_hdr.instance_id = INSTANCE_ID_0; + param_hdr.param_id = AVS_COP_V2_PARAM_ID_STREAM_INFO; + param_hdr.param_size = + sizeof(struct avs_cop_v2_param_id_stream_info_t); + lc3_enc_stream_info = cfg->data.lc3_dec_config.dec_codec.streamMapToAir; + ret = q6afe_pack_and_set_param_in_band(port_id, + q6audio_get_port_index(port_id), + param_hdr, + (u8 *) &lc3_enc_stream_info); + if (ret) { + pr_err("%s: AVS_COP_V2_PARAM_ID_STREAM_INFO for port 0x%x failed %d\n", + __func__, port_id, ret); + goto exit; + } + } + + if ((format == ASM_MEDIA_FMT_APTX_ADAPTIVE || format == ASM_MEDIA_FMT_LC3) && + cfg->abr_dec_cfg.is_abr_enabled) { + pr_debug("%s: Ignore AFE config for abr case\n", __func__); + goto exit; + } + pr_debug("%s: sending AFE_DECODER_PARAM_ID_DEC_MEDIA_FMT to DSP payload\n", __func__); param_hdr.module_id = AFE_MODULE_ID_DECODER; @@ -5167,6 +5210,8 @@ static int q6afe_send_enc_config(u16 port_id, struct aptx_channel_mode_param_t channel_mode_param; struct afe_matched_port_t matched_port_param; struct asm_aptx_ad_speech_mode_cfg_t speech_codec_init_param; + struct avs_cop_v2_param_id_stream_info_t lc3_enc_stream_info; + struct afe_lc3_enc_cfg_t lc3_enc_config_init; struct param_hdr_v3 param_hdr; int ret; uint32_t frame_size_ctl_value_v2; @@ -5184,13 +5229,16 @@ static int q6afe_send_enc_config(u16 port_id, memset(&media_type, 0, sizeof(media_type)); memset(&matched_port_param, 0, sizeof(matched_port_param)); memset(&speech_codec_init_param, 0, sizeof(speech_codec_init_param)); + memset(&lc3_enc_stream_info, 0, sizeof(lc3_enc_stream_info)); + memset(&lc3_enc_config_init, 0, sizeof(lc3_enc_config_init)); memset(¶m_hdr, 0, sizeof(param_hdr)); if (format != ASM_MEDIA_FMT_SBC && format != ASM_MEDIA_FMT_AAC_V2 && format != ASM_MEDIA_FMT_APTX && format != ASM_MEDIA_FMT_APTX_HD && format != ASM_MEDIA_FMT_CELT && format != ASM_MEDIA_FMT_LDAC && format != ASM_MEDIA_FMT_APTX_ADAPTIVE && - format != ASM_MEDIA_FMT_APTX_AD_SPEECH) { + format != ASM_MEDIA_FMT_APTX_AD_SPEECH && + format != ASM_MEDIA_FMT_LC3) { pr_err("%s:Unsuppported enc format. Ignore AFE config\n", __func__); return 0; @@ -5228,23 +5276,26 @@ static int q6afe_send_enc_config(u16 port_id, } else if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) { param_hdr.param_size = sizeof(struct afe_enc_aptx_ad_speech_cfg_blk_param_t); enc_blk_param.enc_cfg_blk_size = sizeof(struct asm_custom_enc_cfg_t); - } else { + } else if (format != ASM_MEDIA_FMT_LC3) { param_hdr.param_size = sizeof(struct afe_enc_cfg_blk_param_t); enc_blk_param.enc_cfg_blk_size = sizeof(union afe_enc_config_data); } - pr_debug("%s:send AFE_ENCODER_PARAM_ID_ENC_CFG_BLK to DSP payload\n", - __func__); - param_hdr.param_id = AFE_ENCODER_PARAM_ID_ENC_CFG_BLK; - enc_blk_param.enc_blk_config = *cfg; - ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &enc_blk_param); - if (ret) { - pr_err("%s: AFE_ENCODER_PARAM_ID_ENC_CFG_BLK for port 0x%x failed %d\n", - __func__, port_id, ret); - goto exit; + + if (format != ASM_MEDIA_FMT_LC3) { + pr_debug("%s:send AFE_ENCODER_PARAM_ID_ENC_CFG_BLK to DSP payload\n", + __func__); + param_hdr.param_id = AFE_ENCODER_PARAM_ID_ENC_CFG_BLK; + enc_blk_param.enc_blk_config = *cfg; + ret = q6afe_pack_and_set_param_in_band(port_id, + q6audio_get_port_index(port_id), + param_hdr, + (u8 *) &enc_blk_param); + if (ret) { + pr_err("%s: AFE_ENCODER_PARAM_ID_ENC_CFG_BLK for port 0x%x failed %d\n", + __func__, port_id, ret); + goto exit; + } } if (format == ASM_MEDIA_FMT_AAC_V2) { @@ -5352,21 +5403,59 @@ static int q6afe_send_enc_config(u16 port_id, } pr_debug("%s:sending AFE_ENCODER_PARAM_ID_PACKETIZER to DSP\n", - __func__); + __func__); param_hdr.param_id = AFE_ENCODER_PARAM_ID_PACKETIZER_ID; param_hdr.param_size = sizeof(struct avs_enc_packetizer_id_param_t); enc_pkt_id_param.enc_packetizer_id = AFE_MODULE_ID_PACKETIZER_COP; + if (format == ASM_MEDIA_FMT_LC3) + enc_pkt_id_param.enc_packetizer_id = AFE_MODULE_ID_PACKETIZER_COP_V2; ret = q6afe_pack_and_set_param_in_band(port_id, - q6audio_get_port_index(port_id), - param_hdr, - (u8 *) &enc_pkt_id_param); + q6audio_get_port_index(port_id), + param_hdr, + (u8 *) &enc_pkt_id_param); if (ret) { pr_err("%s: AFE_ENCODER_PARAM_ID_PACKETIZER for port 0x%x failed %d\n", - __func__, port_id, ret); + __func__, port_id, ret); goto exit; } - if (format != ASM_MEDIA_FMT_APTX_AD_SPEECH) { + if (format == ASM_MEDIA_FMT_LC3) { + pr_debug("%s: sending CAPI_V2_PARAM_LC3_ENC_INIT to DSP\n", + __func__); + param_hdr.param_id = CAPI_V2_PARAM_LC3_ENC_INIT; + param_hdr.param_size = + sizeof(struct afe_lc3_enc_cfg_t); + lc3_enc_config_init = cfg->lc3_enc_config.enc_codec.to_Air_cfg; + ret = q6afe_pack_and_set_param_in_band(port_id, + q6audio_get_port_index(port_id), + param_hdr, + (u8 *) &lc3_enc_config_init); + if (ret) { + pr_err("%s: CAPI_V2_PARAM_LC3_ENC_INIT for port 0x%x failed %d\n", + __func__, port_id, ret); + goto exit; + } + + pr_debug("%s: sending AVS_COP_V2_PARAM_ID_STREAM_INFO to DSP\n", + __func__); + param_hdr.param_id = AVS_COP_V2_PARAM_ID_STREAM_INFO; + param_hdr.param_size = + sizeof(struct avs_cop_v2_param_id_stream_info_t); + lc3_enc_stream_info = cfg->lc3_enc_config.enc_codec.streamMapToAir; + + ret = q6afe_pack_and_set_param_in_band(port_id, + q6audio_get_port_index(port_id), + param_hdr, + (u8 *) &lc3_enc_stream_info); + if (ret) { + pr_err("%s: AVS_COP_V2_PARAM_ID_STREAM_INFO for port 0x%x failed %d\n", + __func__, port_id, ret); + goto exit; + } + } + + if (format != ASM_MEDIA_FMT_APTX_AD_SPEECH && + format != ASM_MEDIA_FMT_LC3) { pr_debug("%s:sending AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING mode= %d to DSP payload\n", __func__, scrambler_mode); param_hdr.param_id = AFE_ENCODER_PARAM_ID_ENABLE_SCRAMBLING; @@ -5403,8 +5492,10 @@ static int q6afe_send_enc_config(u16 port_id, if ((format == ASM_MEDIA_FMT_LDAC && cfg->ldac_config.abr_config.is_abr_enabled) || format == ASM_MEDIA_FMT_APTX_ADAPTIVE || - format == ASM_MEDIA_FMT_APTX_AD_SPEECH) { - if (format != ASM_MEDIA_FMT_APTX_AD_SPEECH) { + format == ASM_MEDIA_FMT_APTX_AD_SPEECH || + format == ASM_MEDIA_FMT_LC3) { + if (format != ASM_MEDIA_FMT_APTX_AD_SPEECH && + format != ASM_MEDIA_FMT_LC3) { pr_debug("%s:sending AFE_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP to DSP payload", __func__); param_hdr.param_id = AFE_ENCODER_PARAM_ID_BIT_RATE_LEVEL_MAP; @@ -5435,6 +5526,9 @@ static int q6afe_send_enc_config(u16 port_id, else if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) imc_info_param.imc_info = cfg->aptx_ad_speech_config.imc_info; + else if (format == ASM_MEDIA_FMT_LC3) + imc_info_param.imc_info = + cfg->lc3_enc_config.imc_info; else imc_info_param.imc_info = cfg->ldac_config.abr_config.imc_info; @@ -5463,6 +5557,9 @@ static int q6afe_send_enc_config(u16 port_id, else if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) media_type.sample_rate = cfg->aptx_ad_speech_config.custom_cfg.sample_rate; + else if (format == ASM_MEDIA_FMT_LC3) + media_type.sample_rate = + cfg->lc3_enc_config.enc_codec.to_Air_cfg.toAirConfig.sampling_freq; else media_type.sample_rate = afe_config.slim_sch.sample_rate; @@ -5488,7 +5585,8 @@ static int q6afe_send_enc_config(u16 port_id, goto exit; } - if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH) { + if (format == ASM_MEDIA_FMT_APTX_AD_SPEECH || + format == ASM_MEDIA_FMT_LC3) { pr_debug("%s: sending AFE_PARAM_ID_RATE_MATCHED_PORT to DSP payload", __func__); param_hdr.param_id = AFE_PARAM_ID_RATE_MATCHED_PORT; @@ -5549,6 +5647,42 @@ int afe_set_tws_channel_mode(u32 format, u16 port_id, u32 channel_mode) } EXPORT_SYMBOL(afe_set_tws_channel_mode); +int afe_set_lc3_channel_mode(u32 format, u16 port_id, u32 channel_mode) +{ + struct lc3_channel_mode_param_t channel_mode_param; + struct param_hdr_v3 param_info; + int ret = 0; + u32 param_id = 0; + + if (format == ASM_MEDIA_FMT_LC3) { + param_id = CAPI_V2_PARAM_SET_LC3_ENC_DOWNMIX_2_MONO; + } else { + pr_err("%s: Not supported format 0x%x\n", __func__, format); + return -EINVAL; + } + + memset(¶m_info, 0, sizeof(param_info)); + memset(&channel_mode_param, 0, sizeof(channel_mode_param)); + + param_info.module_id = AFE_MODULE_ID_ENCODER; + param_info.instance_id = INSTANCE_ID_0; + param_info.param_id = param_id; + param_info.param_size = sizeof(channel_mode_param); + + channel_mode_param.channel_mode = channel_mode; + + ret = q6afe_pack_and_set_param_in_band(port_id, + q6audio_get_port_index(port_id), + param_info, + (u8 *) &channel_mode_param); + if (ret) + pr_err("%s: AFE set channel mode cfg for port 0x%x failed %d\n", + __func__, port_id, ret); + + return ret; +} +EXPORT_SYMBOL(afe_set_lc3_channel_mode); + static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, u32 rate, u16 afe_in_channels, u16 afe_in_bit_width, union afe_enc_config_data *enc_cfg, @@ -5913,7 +6047,8 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config, * Only loading de-packetizer module. */ if (codec_format == ENC_CODEC_TYPE_LDAC || - codec_format == ASM_MEDIA_FMT_APTX_ADAPTIVE) + codec_format == ASM_MEDIA_FMT_APTX_ADAPTIVE || + codec_format == ASM_MEDIA_FMT_LC3) ret = q6afe_load_avcs_modules(1, port_id, DECODER_CASE, codec_format); else diff --git a/include/dsp/apr_audio-v2.h b/include/dsp/apr_audio-v2.h index 1d6d3debcc..87173c79da 100644 --- a/include/dsp/apr_audio-v2.h +++ b/include/dsp/apr_audio-v2.h @@ -4103,6 +4103,9 @@ struct afe_id_aptx_adaptive_enc_init /* Macro for defining the packetizer ID: COP. */ #define AFE_MODULE_ID_PACKETIZER_COP 0x0001322A +/* Macro for defining the packetizer ID: COP V2 */ +#define AFE_MODULE_ID_PACKETIZER_COP_V2 0x000132F9 + /* * Packetizer type parameter for the #AVS_MODULE_ID_ENCODER module. * This parameter cannot be set runtime. @@ -4168,6 +4171,7 @@ struct afe_id_aptx_adaptive_enc_init */ #define AFE_MODULE_ID_DEPACKETIZER_COP 0x00013233 #define AFE_MODULE_ID_DEPACKETIZER_COP_V1 0x000132E9 +#define AFE_MODULE_ID_DEPACKETIZER_COP_V2 0x000132FC /* Macros for dynamic loading of modules by AVCS */ @@ -4175,10 +4179,22 @@ struct afe_id_aptx_adaptive_enc_init #define AVS_MODULE_ID_PACKETIZER_COP_V1 0x000132E8 +#define AVS_MODULE_ID_PACKETIZER_COP_V2 0x000132F9 + #define AVS_MODULE_ID_DEPACKETIZER_COP 0x00013233 #define AVS_MODULE_ID_DEPACKETIZER_COP_V1 0x000132E9 +#define AVS_MODULE_ID_DEPACKETIZER_COP_V2 0x000132FC + +/* + * Depacketizer and packetizer type parameter for the + * #AVS_MODULE_ID_DEPACKETIZER_COP_V2 module and + * #AVS_MODULE_ID_PACKETIZER_COP_V2 module. + */ + +#define AVS_COP_V2_PARAM_ID_STREAM_INFO 0x000132FD + /* * Depacketizer type parameter for the #AVS_MODULE_ID_DECODER module. * This parameter cannot be set runtime. @@ -4192,6 +4208,12 @@ struct afe_id_aptx_adaptive_enc_init struct aptx_channel_mode_param_t { u32 channel_mode; } __packed; + +#define CAPI_V2_PARAM_SET_LC3_ENC_DOWNMIX_2_MONO 0x00013384 +struct lc3_channel_mode_param_t { + u32 channel_mode; +} __packed; + /* * Decoder buffer ID parameter for the #AVS_MODULE_ID_DECODER module. * This parameter cannot be set runtime. @@ -4410,6 +4432,10 @@ struct asm_aac_enc_cfg_t { /* FMT ID for apt-X Adaptive speech */ #define ASM_MEDIA_FMT_APTX_AD_SPEECH 0x00013208 +/* FMT ID for lc3 codec */ +#define ASM_MEDIA_FMT_LC3 0x0001337E +#define ENC_CODEC_TYPE_LC3 0x2B000000 + #define PCM_CHANNEL_L 1 #define PCM_CHANNEL_R 2 #define PCM_CHANNEL_C 3 @@ -4470,6 +4496,70 @@ struct asm_aptx_ad_speech_enc_cfg_t struct asm_aptx_ad_speech_mode_cfg_t speech_mode; } __attribute__ ((packed)); + +#define CAPI_V2_PARAM_LC3_ENC_INIT 0x00013381 +#define CAPI_V2_PARAM_LC3_DEC_MODULE_INIT 0x00013391 +struct afe_lc3_stream_map_t { + uint32_t stream_id; + uint32_t direction; + uint32_t channel_mask_lsw; + uint32_t channel_mask_msw; +} __packed; + +struct afe_stream_map_t { + uint32_t audio_location; + uint8_t stream_id; + uint8_t direction; +} __packed; + +struct afe_lc3_cfg_t { + uint32_t api_version; + uint32_t sampling_freq; + uint32_t max_octets_per_frame; + uint32_t frame_duration; + uint32_t bit_depth; + uint32_t num_blocks; + uint8_t default_q_level; + uint8_t vendor_specific[16]; + uint32_t mode; +} __packed; + +struct afe_lc3_enc_cfg_t { + struct afe_lc3_cfg_t toAirConfig; + uint32_t stream_map_size; + struct afe_stream_map_t streamMapOut[16]; +} __packed; + +struct afe_lc3_dec_cfg_t { + struct afe_lc3_cfg_t FromAir; + uint32_t decoder_output_channel; + uint32_t stream_map_size; + struct afe_stream_map_t streamMapIn[16]; +} __packed; + +struct avs_cop_v2_param_id_stream_info_t { + uint32_t stream_map_size; + struct afe_lc3_stream_map_t streamMap[16]; +} __packed; + +struct afe_lc3_dec_config_t { + struct avs_cop_v2_param_id_stream_info_t streamMapToAir; +} __packed; + +struct afe_lc3_enc_config_t { + struct afe_lc3_enc_cfg_t to_Air_cfg; + struct avs_cop_v2_param_id_stream_info_t streamMapToAir; +} __packed; + +struct asm_enc_lc3_cfg_t { + struct afe_imc_dec_enc_info imc_info; + struct afe_lc3_enc_config_t enc_codec; +} __packed; + +struct asm_lc3_dec_cfg_t { + struct afe_lc3_dec_config_t dec_codec; +} __packed; + struct afe_matched_port_t { uint32_t minor_version; @@ -4765,12 +4855,14 @@ union afe_enc_config_data { struct asm_ldac_enc_cfg_t ldac_config; struct asm_aptx_ad_enc_cfg_t aptx_ad_config; struct asm_aptx_ad_speech_enc_cfg_t aptx_ad_speech_config; + struct asm_enc_lc3_cfg_t lc3_enc_config; }; struct afe_enc_config { u32 format; u32 scrambler_mode; u32 mono_mode; + u32 lc3_mono_mode; union afe_enc_config_data data; }; @@ -4830,6 +4922,7 @@ union afe_dec_config_data { struct asm_mp3_dec_cfg_t mp3_config; struct asm_aptx_ad_dec_cfg_t aptx_ad_config; struct asm_aptx_ad_speech_dec_cfg_t aptx_ad_speech_config; + struct asm_lc3_dec_cfg_t lc3_dec_config; }; struct afe_dec_config { diff --git a/include/dsp/q6afe-v2.h b/include/dsp/q6afe-v2.h index 09afc2e2aa..5c66b4b5ca 100644 --- a/include/dsp/q6afe-v2.h +++ b/include/dsp/q6afe-v2.h @@ -54,6 +54,12 @@ #define AFE_API_VERSION_V8 8 +/* the different modes for data*/ +#define BAP_UNICAST 1 +#define BAP_BROADCAST 2 +#define BAP_BA_SIMULCAST 3 + + typedef int (*routing_cb)(int port); enum { @@ -426,6 +432,7 @@ int afe_get_power_mode_cfg(u16 port_id, u32 *enable_flag); int afe_port_start(u16 port_id, union afe_port_config *afe_config, u32 rate); int afe_set_tws_channel_mode(u32 foramt, u16 port_id, u32 channel_mode); +int afe_set_lc3_channel_mode(u32 foramt, u16 port_id, u32 channel_mode); int afe_port_start_v2(u16 port_id, union afe_port_config *afe_config, u32 rate, u16 afe_in_channels, u16 afe_in_bit_width, struct afe_enc_config *enc_config, From 5712083a09da4e9d90b3ff88e3fadc417d567768 Mon Sep 17 00:00:00 2001 From: Aditya Bavanari Date: Tue, 13 Oct 2020 11:55:14 +0530 Subject: [PATCH 53/59] asoc: Fix LSM2 mixer control array LSM2 mixer control mapping for VA_CDC_DMA_TX_0 was added in MI2S controls. Move it out to fix the concurrency issues seen in SVA. Change-Id: I1e375b2ea86755b935f3d706d2955ad4aa6ef42f Signed-off-by: Aditya Bavanari --- asoc/msm-pcm-routing-v2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c index eab92e9e3d..de0f2f08b5 100644 --- a/asoc/msm-pcm-routing-v2.c +++ b/asoc/msm-pcm-routing-v2.c @@ -22428,11 +22428,11 @@ static const struct snd_kcontrol_new lsm2_mixer_controls[] = { MSM_BACKEND_DAI_INT3_MI2S_TX, MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, msm_routing_put_listen_mixer), +#endif SOC_DOUBLE_EXT("VA_CDC_DMA_TX_0", SND_SOC_NOPM, MSM_BACKEND_DAI_VA_CDC_DMA_TX_0, MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, msm_routing_put_listen_mixer), -#endif SOC_DOUBLE_EXT("VA_CDC_DMA_TX_1", SND_SOC_NOPM, MSM_BACKEND_DAI_VA_CDC_DMA_TX_1, MSM_FRONTEND_DAI_LSM2, 1, 0, msm_routing_get_listen_mixer, From e0ea9653c315c2ec23c891f6321b75ac2683f31f Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Wed, 7 Oct 2020 10:20:13 +0530 Subject: [PATCH 54/59] asoc: bolero: control wakeup of swr_tx during clock setup Move the enable and disable of wakeup capability of swr_tx gpios to clock setup to disable or enable it in all required usecases. Change-Id: I9fb76926d8520c382e7f19777190357c50f98994 Signed-off-by: Laxminath Kasam --- asoc/codecs/bolero/tx-macro.c | 8 ++++---- asoc/codecs/bolero/va-macro.c | 14 ++++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index 135ea087cf..e63a23c193 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -2650,11 +2650,7 @@ static int tx_macro_register_event_listener(struct snd_soc_component *component, ret = swrm_wcd_notify( tx_priv->swr_ctrl_data[0].tx_swr_pdev, SWR_REGISTER_WAKEUP, NULL); - msm_cdc_pinctrl_set_wakeup_capable( - tx_priv->tx_swr_gpio_p, false); } else { - msm_cdc_pinctrl_set_wakeup_capable( - tx_priv->tx_swr_gpio_p, true); if (!tx_priv->disable_afe_wakeup_event_listener) ret = swrm_wcd_notify( tx_priv->swr_ctrl_data[0].tx_swr_pdev, @@ -2690,6 +2686,8 @@ static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv, __func__); goto exit; } + msm_cdc_pinctrl_set_wakeup_capable( + tx_priv->tx_swr_gpio_p, false); } clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev, @@ -2818,6 +2816,8 @@ tx_clk: TX_CORE_CLK, false); if (tx_priv->swr_clk_users == 0) { + msm_cdc_pinctrl_set_wakeup_capable( + tx_priv->tx_swr_gpio_p, true); ret = msm_cdc_pinctrl_select_sleep_state( tx_priv->tx_swr_gpio_p); if (ret < 0) { diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index 486e157ca4..9869fb51aa 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -428,12 +428,8 @@ static int va_macro_swr_pwr_event_v2(struct snd_soc_dapm_widget *w, } va_priv->current_clk_id = VA_CORE_CLK; } - msm_cdc_pinctrl_set_wakeup_capable( - va_priv->va_swr_gpio_p, false); break; case SND_SOC_DAPM_POST_PMD: - msm_cdc_pinctrl_set_wakeup_capable( - va_priv->va_swr_gpio_p, true); if (va_priv->current_clk_id == VA_CORE_CLK && va_priv->va_swr_clk_cnt != 0 && va_priv->tx_clk_status) { @@ -610,9 +606,12 @@ static int va_macro_tx_va_mclk_enable(struct va_macro_priv *va_priv, (enable ? "enable" : "disable"), va_priv->va_mclk_users); if (enable) { - if (va_priv->swr_clk_users == 0) + if (va_priv->swr_clk_users == 0) { msm_cdc_pinctrl_select_active_state( va_priv->va_swr_gpio_p); + msm_cdc_pinctrl_set_wakeup_capable( + va_priv->va_swr_gpio_p, false); + } clk_tx_ret = bolero_clk_rsc_request_clock(va_priv->dev, TX_CORE_CLK, TX_CORE_CLK, @@ -705,9 +704,12 @@ static int va_macro_tx_va_mclk_enable(struct va_macro_priv *va_priv, TX_CORE_CLK, TX_CORE_CLK, false); - if (va_priv->swr_clk_users == 0) + if (va_priv->swr_clk_users == 0) { + msm_cdc_pinctrl_set_wakeup_capable( + va_priv->va_swr_gpio_p, true); msm_cdc_pinctrl_select_sleep_state( va_priv->va_swr_gpio_p); + } } return 0; From 4fc789273f384f1cd8c07c935a39f28318597ff6 Mon Sep 17 00:00:00 2001 From: Ashwini Muduganti Date: Tue, 20 Oct 2020 21:02:42 -0700 Subject: [PATCH 55/59] Revert "soc: Add ratelimit to supress the pr_err/dev_err" This reverts commit 51cbf9ddffb00a599659a3c77300d10e4663fc05. Change-Id: Ia582005c879263e1c12ea922f0bc07d1de197e0b --- asoc/codecs/audio-ext-clk-up.c | 18 +++++------------- asoc/codecs/bolero/bolero-cdc.c | 7 ++----- asoc/codecs/bolero/bolero-clk-rsc.c | 17 +++++------------ dsp/q6afe.c | 5 +---- ipc/apr.c | 5 +---- soc/pinctrl-lpi.c | 12 +++--------- 6 files changed, 17 insertions(+), 47 deletions(-) diff --git a/asoc/codecs/audio-ext-clk-up.c b/asoc/codecs/audio-ext-clk-up.c index acd00da914..d724850053 100644 --- a/asoc/codecs/audio-ext-clk-up.c +++ b/asoc/codecs/audio-ext-clk-up.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. */ #include @@ -14,7 +14,6 @@ #include #include #include -#include #include #include "audio-ext-clk-up.h" @@ -68,7 +67,6 @@ static int audio_ext_clk_prepare(struct clk_hw *hw) struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); struct pinctrl_info *pnctrl_info = &clk_priv->audio_clk.pnctrl_info; int ret; - static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) && (clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) { @@ -77,8 +75,7 @@ static int audio_ext_clk_prepare(struct clk_hw *hw) __func__, clk_priv->clk_src); ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); if (ret < 0) { - if (__ratelimit(&rtl)) - pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n", + pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n", __func__); return ret; } @@ -104,7 +101,6 @@ static void audio_ext_clk_unprepare(struct clk_hw *hw) struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); struct pinctrl_info *pnctrl_info = &clk_priv->audio_clk.pnctrl_info; int ret; - static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (pnctrl_info->pinctrl) { ret = pinctrl_select_state(pnctrl_info->pinctrl, @@ -122,11 +118,9 @@ static void audio_ext_clk_unprepare(struct clk_hw *hw) trace_printk("%s: unvote for %d clock\n", __func__, clk_priv->clk_src); ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg); - if (ret < 0) { - if (__ratelimit(&rtl)) - pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n", + if (ret < 0) + pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n", __func__, ret); - } } if (pnctrl_info->base) @@ -155,7 +149,6 @@ static int lpass_hw_vote_prepare(struct clk_hw *hw) { struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); int ret; - static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { trace_printk("%s: vote for %d clock\n", @@ -177,8 +170,7 @@ static int lpass_hw_vote_prepare(struct clk_hw *hw) "LPASS_HW_DCODEC", &clk_priv->lpass_audio_hwvote_client_handle); if (ret < 0) { - if (__ratelimit(&rtl)) - pr_err("%s lpass audio hw vote failed %d\n", + pr_err("%s lpass audio hw vote failed %d\n", __func__, ret); return ret; } diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index 5603c388d1..1a9eeffef2 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -15,7 +15,6 @@ #include #include #include -#include #include "bolero-cdc.h" #include "internal.h" #include "bolero-clk-rsc.h" @@ -1445,7 +1444,6 @@ int bolero_runtime_resume(struct device *dev) { struct bolero_priv *priv = dev_get_drvdata(dev->parent); int ret = 0; - static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); mutex_lock(&priv->vote_lock); if (priv->lpass_core_hw_vote == NULL) { @@ -1474,9 +1472,8 @@ audio_vote: if (priv->core_audio_vote_count == 0) { ret = digital_cdc_rsc_mgr_hw_vote_enable(priv->lpass_audio_hw_vote); if (ret < 0) { - if (__ratelimit(&rtl)) - dev_err(dev, "%s:lpass audio hw enable failed\n", - __func__); + dev_err(dev, "%s:lpass audio hw enable failed\n", + __func__); goto done; } } diff --git a/asoc/codecs/bolero/bolero-clk-rsc.c b/asoc/codecs/bolero/bolero-clk-rsc.c index b20017a2ff..b134819e0c 100644 --- a/asoc/codecs/bolero/bolero-clk-rsc.c +++ b/asoc/codecs/bolero/bolero-clk-rsc.c @@ -11,7 +11,6 @@ #include #include #include -#include #include "bolero-cdc.h" #include "bolero-clk-rsc.h" @@ -194,15 +193,13 @@ static int bolero_clk_rsc_mux0_clk_request(struct bolero_clk_rsc *priv, bool enable) { int ret = 0; - static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (enable) { /* Enable Requested Core clk */ if (priv->clk_cnt[clk_id] == 0) { ret = clk_prepare_enable(priv->clk[clk_id]); if (ret < 0) { - if (__ratelimit(&rtl)) - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", __func__, clk_id); goto done; } @@ -210,8 +207,7 @@ static int bolero_clk_rsc_mux0_clk_request(struct bolero_clk_rsc *priv, ret = clk_prepare_enable( priv->clk[clk_id + NPL_CLK_OFFSET]); if (ret < 0) { - if (__ratelimit(&rtl)) - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", __func__, clk_id + NPL_CLK_OFFSET); goto err; @@ -250,7 +246,6 @@ static int bolero_clk_rsc_mux1_clk_request(struct bolero_clk_rsc *priv, int ret = 0; int default_clk_id = priv->default_clk_id[clk_id]; u32 muxsel = 0; - static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); clk_muxsel = bolero_clk_rsc_get_clk_muxsel(priv, clk_id); if (!clk_muxsel) { @@ -270,17 +265,15 @@ static int bolero_clk_rsc_mux1_clk_request(struct bolero_clk_rsc *priv, ret = clk_prepare_enable(priv->clk[clk_id]); if (ret < 0) { - if (__ratelimit(&rtl)) - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", - __func__, clk_id); + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + __func__, clk_id); goto err_clk; } if (priv->clk[clk_id + NPL_CLK_OFFSET]) { ret = clk_prepare_enable( priv->clk[clk_id + NPL_CLK_OFFSET]); if (ret < 0) { - if (__ratelimit(&rtl)) - dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", + dev_err_ratelimited(priv->dev, "%s:clk_id %d enable failed\n", __func__, clk_id + NPL_CLK_OFFSET); goto err_npl_clk; diff --git a/dsp/q6afe.c b/dsp/q6afe.c index a7a7c4a536..5a944a6a9d 100644 --- a/dsp/q6afe.c +++ b/dsp/q6afe.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include "adsp_err.h" @@ -9223,7 +9222,6 @@ int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg) { struct param_hdr_v3 param_hdr; int ret = 0; - static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!cfg) { pr_err("%s: clock cfg is NULL\n", __func__); @@ -9262,8 +9260,7 @@ int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg) ret = q6afe_svc_pack_and_set_param_in_band(index, param_hdr, (u8 *) cfg); if (ret < 0) { - if (__ratelimit(&rtl)) - pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n", + pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n", __func__, ret); trace_printk("%s: AFE clk cfg failed with ret %d\n", __func__, ret); diff --git a/ipc/apr.c b/ipc/apr.c index 07270cb376..87fb8907b5 100644 --- a/ipc/apr.c +++ b/ipc/apr.c @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include @@ -371,7 +370,6 @@ int apr_send_pkt(void *handle, uint32_t *buf) uint16_t w_len; int rc; unsigned long flags; - static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!handle || !buf) { pr_err("APR: Wrong parameters for %s\n", @@ -385,8 +383,7 @@ int apr_send_pkt(void *handle, uint32_t *buf) if ((svc->dest_id == APR_DEST_QDSP6) && (apr_get_q6_state() != APR_SUBSYS_LOADED)) { - if (__ratelimit(&rtl)) - pr_err_ratelimited("%s: Still dsp is not Up\n", __func__); + pr_err_ratelimited("%s: Still dsp is not Up\n", __func__); return -ENETRESET; } else if ((svc->dest_id == APR_DEST_MODEM) && (apr_get_modem_state() == APR_SUBSYS_DOWN)) { diff --git a/soc/pinctrl-lpi.c b/soc/pinctrl-lpi.c index 0f066beade..5f93cf5971 100644 --- a/soc/pinctrl-lpi.c +++ b/soc/pinctrl-lpi.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -149,19 +148,16 @@ static int lpi_gpio_read(struct lpi_gpio_pad *pad, unsigned int addr) { int ret = 0; struct lpi_gpio_state *state = dev_get_drvdata(lpi_dev); - static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!lpi_dev_up) { - if (__ratelimit(&rtl)) - pr_err("%s: ADSP is down due to SSR, return\n", + pr_err_ratelimited("%s: ADSP is down due to SSR, return\n", __func__); return 0; } pm_runtime_get_sync(lpi_dev); mutex_lock(&state->core_hw_vote_lock); if (!state->core_hw_vote_status) { - if (__ratelimit(&rtl)) - pr_err("%s: core hw vote clk is not enabled\n", + pr_err_ratelimited("%s: core hw vote clk is not enabled\n", __func__); ret = -EINVAL; goto err; @@ -183,7 +179,6 @@ static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr, { struct lpi_gpio_state *state = dev_get_drvdata(lpi_dev); int ret = 0; - static DEFINE_RATELIMIT_STATE(rtl, 1 * HZ, 1); if (!lpi_dev_up) { return 0; @@ -191,8 +186,7 @@ static int lpi_gpio_write(struct lpi_gpio_pad *pad, unsigned int addr, pm_runtime_get_sync(lpi_dev); mutex_lock(&state->core_hw_vote_lock); if (!state->core_hw_vote_status) { - if (__ratelimit(&rtl)) - pr_err("%s: core hw vote clk is not enabled\n", + pr_err_ratelimited("%s: core hw vote clk is not enabled\n", __func__); ret = -EINVAL; goto err; From 83d1640b7bf614327a85abdbfc270e93332fe310 Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Wed, 14 Oct 2020 20:52:09 +0530 Subject: [PATCH 56/59] asoc: bolero: Add core_vote before gfmux access GFMUX access happen during RX macro usecase. Update rx macro to do core_vote before clock request. Change-Id: I1afd38ae13066dcfbda307308afce7c4291142d9 Signed-off-by: Laxminath Kasam --- asoc/codecs/bolero/rx-macro.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c index 7d54d4281a..a924c24026 100644 --- a/asoc/codecs/bolero/rx-macro.c +++ b/asoc/codecs/bolero/rx-macro.c @@ -350,6 +350,7 @@ struct rx_macro_bcl_pmic_params { u8 ppid; }; +static int rx_macro_core_vote(void *handle, bool enable); static int rx_macro_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai); @@ -1274,6 +1275,7 @@ static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv, if (rx_priv->rx_mclk_users == 0) { if (rx_priv->is_native_on) rx_priv->clk_id = RX_CORE_CLK; + rx_macro_core_vote(rx_priv, true); ret = bolero_clk_rsc_request_clock(rx_priv->dev, rx_priv->default_clk_id, rx_priv->clk_id, @@ -1327,6 +1329,7 @@ static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv, 0x01, 0x00); bolero_clk_rsc_fs_gen_request(rx_priv->dev, false); + rx_macro_core_vote(rx_priv, true); bolero_clk_rsc_request_clock(rx_priv->dev, rx_priv->default_clk_id, rx_priv->clk_id, @@ -1440,18 +1443,21 @@ static int rx_macro_event_handler(struct snd_soc_component *component, } break; case BOLERO_MACRO_EVT_PRE_SSR_UP: + rx_macro_core_vote(rx_priv, true); /* enable&disable RX_CORE_CLK to reset GFMUX reg */ ret = bolero_clk_rsc_request_clock(rx_priv->dev, rx_priv->default_clk_id, RX_CORE_CLK, true); - if (ret < 0) + if (ret < 0) { dev_err_ratelimited(rx_priv->dev, "%s, failed to enable clk, ret:%d\n", __func__, ret); - else + } else { + rx_macro_core_vote(rx_priv, true); bolero_clk_rsc_request_clock(rx_priv->dev, rx_priv->default_clk_id, RX_CORE_CLK, false); + } break; case BOLERO_MACRO_EVT_SSR_UP: trace_printk("%s, enter SSR up\n", __func__); From 7c9ef4221ed8dd7dbc338880206d1800fcebfe08 Mon Sep 17 00:00:00 2001 From: Ashwini Muduganti Date: Tue, 13 Oct 2020 17:10:09 -0700 Subject: [PATCH 57/59] soc: add check condition before enabling irq. Enable interrupt request only when the interrupt is in disabled state. Change-Id: I67795bf0ee344661e02b0fec3181cd7980d56652 Signed-off-by: Vignesh Kulothungan --- soc/swr-mstr-ctrl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c index 6e9b7c1eec..c172ce8129 100644 --- a/soc/swr-mstr-ctrl.c +++ b/soc/swr-mstr-ctrl.c @@ -3250,7 +3250,9 @@ static int swrm_runtime_suspend(struct device *dev) } if (swrm->clk_stop_mode0_supp) { - if (swrm->wake_irq > 0) { + if ((swrm->wake_irq > 0) && + (irqd_irq_disabled( + irq_get_irq_data(swrm->wake_irq)))) { enable_irq(swrm->wake_irq); } else if (swrm->ipc_wakeup) { msm_aud_evt_blocking_notifier_call_chain( From dfe67394906ea2224f0fec78af41fdf120962e53 Mon Sep 17 00:00:00 2001 From: Ashwini Muduganti Date: Thu, 15 Oct 2020 11:25:08 +0530 Subject: [PATCH 58/59] asoc: va-macro: Update clk_div switch based on decimation rate. Update clk_div setting for low power decimations based on decimation rate instead of lpi flag. Change-Id: I6e445618af4bf159f3d88a7bc5d07a403a06c1ab Signed-off-by: Laxminath Kasam --- asoc/codecs/bolero/va-macro.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index 9869fb51aa..eed5d31619 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -173,6 +173,7 @@ struct va_macro_priv { int dapm_tx_clk_status; bool lpi_enable; bool register_event_listener; + bool clk_div_switch; int dec_mode[VA_MACRO_NUM_DECIMATORS]; u16 current_clk_id; }; @@ -206,7 +207,7 @@ static int va_macro_clk_div_get(struct snd_soc_component *component) return -EINVAL; if ((va_priv->version >= BOLERO_VERSION_2_0) - && !va_priv->lpi_enable + && va_priv->clk_div_switch && (va_priv->dmic_clk_div == VA_MACRO_CLK_DIV_16)) return VA_MACRO_CLK_DIV_8; @@ -1524,6 +1525,10 @@ static int va_macro_hw_params(struct snd_pcm_substream *substream, params_channels(params)); sample_rate = params_rate(params); + if (sample_rate > 16000) + va_priv->clk_div_switch = true; + else + va_priv->clk_div_switch = false; switch (sample_rate) { case 8000: tx_fs_rate = 0; From 9f11335e693a441524b663b77f36f66865f57e0d Mon Sep 17 00:00:00 2001 From: Ashwini Muduganti Date: Mon, 19 Oct 2020 13:40:39 +0800 Subject: [PATCH 59/59] ASoC: bolero: Update clock sequence to clear Fs counter Update codec clock sequence to clear Fs counter to avoid unexpected behavior during bootup. Change-Id: I78da6dadd26989cf1f39f71b941a209c2af4cef2 Signed-off-by: Meng Wang --- asoc/codecs/bolero/bolero-clk-rsc.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/asoc/codecs/bolero/bolero-clk-rsc.c b/asoc/codecs/bolero/bolero-clk-rsc.c index b20017a2ff..7dad4b60e5 100644 --- a/asoc/codecs/bolero/bolero-clk-rsc.c +++ b/asoc/codecs/bolero/bolero-clk-rsc.c @@ -476,14 +476,15 @@ void bolero_clk_rsc_fs_gen_request(struct device *dev, bool enable) mutex_lock(&priv->fs_gen_lock); if (enable) { if (priv->reg_seq_en_cnt++ == 0) { - for (i = 0; i < (priv->num_fs_reg * 2); i += 2) { - dev_dbg(priv->dev, "%s: Register: %d, value: %d\n", + for (i = 0; i < (priv->num_fs_reg * 3); i += 3) { + dev_dbg(priv->dev, "%s: Register: %d, mask: %d, value %d\n", __func__, priv->fs_gen_seq[i], - priv->fs_gen_seq[i + 1]); + priv->fs_gen_seq[i + 1], + priv->fs_gen_seq[i + 2]); regmap_update_bits(regmap, priv->fs_gen_seq[i], priv->fs_gen_seq[i + 1], - priv->fs_gen_seq[i + 1]); + priv->fs_gen_seq[i + 2]); } } } else { @@ -495,8 +496,8 @@ void bolero_clk_rsc_fs_gen_request(struct device *dev, bool enable) return; } if (--priv->reg_seq_en_cnt == 0) { - for (i = ((priv->num_fs_reg - 1) * 2); i >= 0; i -= 2) { - dev_dbg(priv->dev, "%s: Register: %d, value: %d\n", + for (i = ((priv->num_fs_reg - 1) * 3); i >= 0; i -= 3) { + dev_dbg(priv->dev, "%s: Register: %d, mask: %d\n", __func__, priv->fs_gen_seq[i], priv->fs_gen_seq[i + 1]); regmap_update_bits(regmap, priv->fs_gen_seq[i], @@ -621,7 +622,7 @@ static int bolero_clk_rsc_probe(struct platform_device *pdev) ret = -EINVAL; goto err; } - priv->num_fs_reg = fs_gen_size/(2 * sizeof(u32)); + priv->num_fs_reg = fs_gen_size/(3 * sizeof(u32)); priv->fs_gen_seq = devm_kzalloc(&pdev->dev, fs_gen_size, GFP_KERNEL); if (!priv->fs_gen_seq) { ret = -ENOMEM; @@ -632,7 +633,7 @@ static int bolero_clk_rsc_probe(struct platform_device *pdev) ret = of_property_read_u32_array(pdev->dev.of_node, "qcom,fs-gen-sequence", priv->fs_gen_seq, - priv->num_fs_reg * 2); + priv->num_fs_reg * 3); if (ret < 0) { dev_err(&pdev->dev, "%s: unable to parse fs-gen-sequence, ret = %d\n", __func__, ret);