Loading asoc/codecs/audio-ext-clk-up.c +52 −1 Original line number Diff line number Diff line /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -33,6 +33,7 @@ enum { AUDIO_EXT_CLK_LPASS5, AUDIO_EXT_CLK_LPASS6, AUDIO_EXT_CLK_LPASS7, AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE, AUDIO_EXT_CLK_LPASS_MAX, AUDIO_EXT_CLK_MAX = AUDIO_EXT_CLK_LPASS_MAX, }; Loading @@ -55,6 +56,7 @@ struct audio_ext_clk_priv { struct afe_clk_set clk_cfg; struct audio_ext_clk audio_clk; const char *clk_name; uint32_t lpass_core_hwvote_client_handle; }; static inline struct audio_ext_clk_priv *to_audio_clk(struct clk_hw *hw) Loading Loading @@ -141,16 +143,56 @@ static u8 audio_ext_clk_get_parent(struct clk_hw *hw) return 0; } static int lpass_hw_vote_prepare(struct clk_hw *hw) { struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); int ret = 0; if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { ret = afe_vote_lpass_core_hw(AFE_LPASS_CORE_HW_MACRO_BLOCK, "LPASS_HW_MACRO", &clk_priv->lpass_core_hwvote_client_handle); if (ret < 0) { pr_err("%s lpass core hw vote failed %d\n", __func__, ret); return ret; } } return 0; } static void lpass_hw_vote_unprepare(struct clk_hw *hw) { struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); int ret = 0; if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { ret = afe_unvote_lpass_core_hw( AFE_LPASS_CORE_HW_MACRO_BLOCK, clk_priv->lpass_core_hwvote_client_handle); if (ret < 0) pr_err("%s lpass core hw vote failed %d\n", __func__, ret); } } static const struct clk_ops audio_ext_clk_ops = { .prepare = audio_ext_clk_prepare, .unprepare = audio_ext_clk_unprepare, .get_parent = audio_ext_clk_get_parent, }; static const struct clk_ops lpass_hw_vote_ops = { .prepare = lpass_hw_vote_prepare, .unprepare = lpass_hw_vote_unprepare, }; static const char * const audio_ext_pmi_div_clk[] = { "qpnp_clkdiv_1", "pms405_div_clk1", "pm6150_div_clk1", "pm6125_div_clk1", }; static int audio_ext_clk_dummy_prepare(struct clk_hw *hw) Loading Loading @@ -274,6 +316,15 @@ static struct audio_ext_clk audio_clk_array[] = { }, }, }, { .pnctrl_info = {NULL}, .fact = { .hw.init = &(struct clk_init_data){ .name = "lpass_hw_vote_clk", .ops = &lpass_hw_vote_ops, }, }, }, }; static int audio_get_pinctrl(struct platform_device *pdev) Loading asoc/codecs/bolero/rx-macro.c +39 −0 Original line number Diff line number Diff line Loading @@ -460,6 +460,10 @@ static const struct snd_kcontrol_new rx_int2_1_vbat_mix_switch[] = { SOC_DAPM_SINGLE("RX AUX VBAT Enable", SND_SOC_NOPM, 0, 1, 0) }; static const char * const hph_idle_detect_text[] = {"OFF", "ON"}; static SOC_ENUM_SINGLE_EXT_DECL(hph_idle_detect_enum, hph_idle_detect_text); RX_MACRO_DAPM_ENUM(rx_int0_2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 0, rx_int_mix_mux_text); RX_MACRO_DAPM_ENUM(rx_int1_2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 0, Loading Loading @@ -1633,6 +1637,38 @@ static void rx_macro_hd2_control(struct snd_soc_codec *codec, } } static int rx_macro_hph_idle_detect_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); struct rx_macro_priv *rx_priv = NULL; struct device *rx_dev = NULL; if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) return -EINVAL; ucontrol->value.integer.value[0] = rx_priv->idle_det_cfg.hph_idle_detect_en; return 0; } static int rx_macro_hph_idle_detect_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); struct rx_macro_priv *rx_priv = NULL; struct device *rx_dev = NULL; if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) return -EINVAL; rx_priv->idle_det_cfg.hph_idle_detect_en = ucontrol->value.integer.value[0]; return 0; } static int rx_macro_get_compander(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { Loading Loading @@ -2511,6 +2547,9 @@ static const struct snd_kcontrol_new rx_macro_snd_controls[] = { SOC_SINGLE_EXT("RX_COMP2 Switch", SND_SOC_NOPM, RX_MACRO_COMP2, 1, 0, rx_macro_get_compander, rx_macro_set_compander), SOC_ENUM_EXT("HPH Idle Detect", hph_idle_detect_enum, rx_macro_hph_idle_detect_get, rx_macro_hph_idle_detect_put), SOC_ENUM_EXT("RX_EAR Mode", rx_macro_ear_mode_enum, rx_macro_get_ear_mode, rx_macro_put_ear_mode), Loading asoc/codecs/wcd937x/wcd937x.c +5 −1 Original line number Diff line number Diff line Loading @@ -127,7 +127,8 @@ static int wcd937x_init_reg(struct snd_soc_codec *codec) snd_soc_update_bits(codec, WCD937X_ANA_BIAS, 0x40, 0x00); snd_soc_update_bits(codec, WCD937X_HPH_OCP_CTL, 0xFF, 0x3A); snd_soc_update_bits(codec, WCD937X_RX_OCP_CTL, 0x0F, 0x02); snd_soc_update_bits(codec, WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xFF, 0xD9); return 0; } Loading Loading @@ -1400,6 +1401,9 @@ static int wcd937x_event_notify(struct notifier_block *block, wcd937x_get_logical_addr(wcd937x->rx_swr_dev); regcache_mark_dirty(wcd937x->regmap); regcache_sync(wcd937x->regmap); /* Enable surge protection */ snd_soc_update_bits(codec, WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xFF, 0xD9); /* Initialize MBHC module */ mbhc = &wcd937x->mbhc->wcd_mbhc; ret = wcd937x_mbhc_post_ssr_init(wcd937x->mbhc, codec); Loading asoc/sm6150.c +29 −48 Original line number Diff line number Diff line /* * Copyright (c) 2018, The Linux Foundation. All rights reserved. * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -4724,28 +4724,6 @@ static void msm_afe_clear_config(void) afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG); } static int msm_config_hph_en0_gpio(struct snd_soc_codec *codec, bool high) { struct snd_soc_card *card = codec->component.card; struct msm_asoc_mach_data *pdata; int val; if (!card) return 0; pdata = snd_soc_card_get_drvdata(card); if (!pdata || !gpio_is_valid(pdata->hph_en0_gpio)) return 0; val = gpio_get_value_cansleep(pdata->hph_en0_gpio); if ((!!val) == high) return 0; gpio_direction_output(pdata->hph_en0_gpio, (int)high); return 1; } static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd) { int ret = 0; Loading Loading @@ -4870,6 +4848,7 @@ static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd) } card = rtd->card->snd_card; if (!pdata->codec_root) { entry = snd_info_create_subdir(card->module, "codecs", card->proc_root); if (!entry) { Loading @@ -4879,6 +4858,7 @@ static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd) goto err; } pdata->codec_root = entry; } tavil_codec_info_create_codec_entry(pdata->codec_root, codec); codec_reg_done = true; Loading Loading @@ -5038,6 +5018,7 @@ static int msm_audrx_tasha_init(struct snd_soc_pcm_runtime *rtd) } card = rtd->card->snd_card; if (!pdata->codec_root) { entry = snd_info_create_subdir(card->module, "codecs", card->proc_root); if (!entry) { Loading @@ -5047,8 +5028,8 @@ static int msm_audrx_tasha_init(struct snd_soc_pcm_runtime *rtd) goto err; } pdata->codec_root = entry; } tasha_codec_info_create_codec_entry(pdata->codec_root, codec); tasha_mbhc_zdet_gpio_ctrl(msm_config_hph_en0_gpio, rtd->codec); codec_reg_done = true; return 0; Loading Loading @@ -8795,8 +8776,8 @@ static int msm_init_aux_dev(struct platform_device *pdev, __func__, found); codec_aux_dev: if (!strnstr(card->name, "tavil", sizeof("tavil")) && !strnstr(card->name, "tasha", sizeof("tasha"))) { if (!strnstr(card->name, "tavil", strlen(card->name)) && !strnstr(card->name, "tasha", strlen(card->name))) { /* Get count of aux codec device phandles for this platform */ codec_aux_dev_cnt = of_count_phandle_with_args( pdev->dev.of_node, Loading Loading @@ -8984,8 +8965,8 @@ static int sm6150_ssr_enable(struct device *dev, void *data) goto err; } if (strnstr(card->name, "tavil", sizeof("tavil")) || strnstr(card->name, "tasha", sizeof("tasha"))) { if (strnstr(card->name, "tavil", strlen(card->name)) || strnstr(card->name, "tasha", strlen(card->name))) { pdata = snd_soc_card_get_drvdata(card); if (!pdata->is_afe_config_done) { const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; Loading Loading @@ -9028,8 +9009,8 @@ static void sm6150_ssr_disable(struct device *dev, void *data) dev_dbg(dev, "%s: setting snd_card to OFFLINE\n", __func__); snd_soc_card_change_online_state(card, 0); if (strnstr(card->name, "tavil", sizeof("tavil")) || strnstr(card->name, "tasha", sizeof("tasha"))) { if (strnstr(card->name, "tavil", strlen(card->name)) || strnstr(card->name, "tasha", strlen(card->name))) { pdata = snd_soc_card_get_drvdata(card); msm_afe_clear_config(); pdata->is_afe_config_done = false; Loading Loading @@ -9252,8 +9233,8 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) } msm_i2s_auxpcm_init(pdev); if (!strnstr(card->name, "tavil", sizeof("tavil")) && !strnstr(card->name, "tasha", sizeof("tasha"))) { if (!strnstr(card->name, "tavil", strlen(card->name)) && !strnstr(card->name, "tasha", strlen(card->name))) { pdata->dmic01_gpio_p = of_parse_phandle(pdev->dev.of_node, "qcom,cdc-dmic01-gpios", 0); Loading config/sm8150auto.conf +1 −0 Original line number Diff line number Diff line Loading @@ -38,3 +38,4 @@ CONFIG_DTS_SRS_TM=m CONFIG_SND_SOC_MSM_STUB=m CONFIG_MSM_AVTIMER=m CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m CONFIG_VOICE_MHI=m Loading
asoc/codecs/audio-ext-clk-up.c +52 −1 Original line number Diff line number Diff line /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -33,6 +33,7 @@ enum { AUDIO_EXT_CLK_LPASS5, AUDIO_EXT_CLK_LPASS6, AUDIO_EXT_CLK_LPASS7, AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE, AUDIO_EXT_CLK_LPASS_MAX, AUDIO_EXT_CLK_MAX = AUDIO_EXT_CLK_LPASS_MAX, }; Loading @@ -55,6 +56,7 @@ struct audio_ext_clk_priv { struct afe_clk_set clk_cfg; struct audio_ext_clk audio_clk; const char *clk_name; uint32_t lpass_core_hwvote_client_handle; }; static inline struct audio_ext_clk_priv *to_audio_clk(struct clk_hw *hw) Loading Loading @@ -141,16 +143,56 @@ static u8 audio_ext_clk_get_parent(struct clk_hw *hw) return 0; } static int lpass_hw_vote_prepare(struct clk_hw *hw) { struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); int ret = 0; if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { ret = afe_vote_lpass_core_hw(AFE_LPASS_CORE_HW_MACRO_BLOCK, "LPASS_HW_MACRO", &clk_priv->lpass_core_hwvote_client_handle); if (ret < 0) { pr_err("%s lpass core hw vote failed %d\n", __func__, ret); return ret; } } return 0; } static void lpass_hw_vote_unprepare(struct clk_hw *hw) { struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw); int ret = 0; if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) { ret = afe_unvote_lpass_core_hw( AFE_LPASS_CORE_HW_MACRO_BLOCK, clk_priv->lpass_core_hwvote_client_handle); if (ret < 0) pr_err("%s lpass core hw vote failed %d\n", __func__, ret); } } static const struct clk_ops audio_ext_clk_ops = { .prepare = audio_ext_clk_prepare, .unprepare = audio_ext_clk_unprepare, .get_parent = audio_ext_clk_get_parent, }; static const struct clk_ops lpass_hw_vote_ops = { .prepare = lpass_hw_vote_prepare, .unprepare = lpass_hw_vote_unprepare, }; static const char * const audio_ext_pmi_div_clk[] = { "qpnp_clkdiv_1", "pms405_div_clk1", "pm6150_div_clk1", "pm6125_div_clk1", }; static int audio_ext_clk_dummy_prepare(struct clk_hw *hw) Loading Loading @@ -274,6 +316,15 @@ static struct audio_ext_clk audio_clk_array[] = { }, }, }, { .pnctrl_info = {NULL}, .fact = { .hw.init = &(struct clk_init_data){ .name = "lpass_hw_vote_clk", .ops = &lpass_hw_vote_ops, }, }, }, }; static int audio_get_pinctrl(struct platform_device *pdev) Loading
asoc/codecs/bolero/rx-macro.c +39 −0 Original line number Diff line number Diff line Loading @@ -460,6 +460,10 @@ static const struct snd_kcontrol_new rx_int2_1_vbat_mix_switch[] = { SOC_DAPM_SINGLE("RX AUX VBAT Enable", SND_SOC_NOPM, 0, 1, 0) }; static const char * const hph_idle_detect_text[] = {"OFF", "ON"}; static SOC_ENUM_SINGLE_EXT_DECL(hph_idle_detect_enum, hph_idle_detect_text); RX_MACRO_DAPM_ENUM(rx_int0_2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 0, rx_int_mix_mux_text); RX_MACRO_DAPM_ENUM(rx_int1_2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 0, Loading Loading @@ -1633,6 +1637,38 @@ static void rx_macro_hd2_control(struct snd_soc_codec *codec, } } static int rx_macro_hph_idle_detect_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); struct rx_macro_priv *rx_priv = NULL; struct device *rx_dev = NULL; if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) return -EINVAL; ucontrol->value.integer.value[0] = rx_priv->idle_det_cfg.hph_idle_detect_en; return 0; } static int rx_macro_hph_idle_detect_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); struct rx_macro_priv *rx_priv = NULL; struct device *rx_dev = NULL; if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__)) return -EINVAL; rx_priv->idle_det_cfg.hph_idle_detect_en = ucontrol->value.integer.value[0]; return 0; } static int rx_macro_get_compander(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { Loading Loading @@ -2511,6 +2547,9 @@ static const struct snd_kcontrol_new rx_macro_snd_controls[] = { SOC_SINGLE_EXT("RX_COMP2 Switch", SND_SOC_NOPM, RX_MACRO_COMP2, 1, 0, rx_macro_get_compander, rx_macro_set_compander), SOC_ENUM_EXT("HPH Idle Detect", hph_idle_detect_enum, rx_macro_hph_idle_detect_get, rx_macro_hph_idle_detect_put), SOC_ENUM_EXT("RX_EAR Mode", rx_macro_ear_mode_enum, rx_macro_get_ear_mode, rx_macro_put_ear_mode), Loading
asoc/codecs/wcd937x/wcd937x.c +5 −1 Original line number Diff line number Diff line Loading @@ -127,7 +127,8 @@ static int wcd937x_init_reg(struct snd_soc_codec *codec) snd_soc_update_bits(codec, WCD937X_ANA_BIAS, 0x40, 0x00); snd_soc_update_bits(codec, WCD937X_HPH_OCP_CTL, 0xFF, 0x3A); snd_soc_update_bits(codec, WCD937X_RX_OCP_CTL, 0x0F, 0x02); snd_soc_update_bits(codec, WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xFF, 0xD9); return 0; } Loading Loading @@ -1400,6 +1401,9 @@ static int wcd937x_event_notify(struct notifier_block *block, wcd937x_get_logical_addr(wcd937x->rx_swr_dev); regcache_mark_dirty(wcd937x->regmap); regcache_sync(wcd937x->regmap); /* Enable surge protection */ snd_soc_update_bits(codec, WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xFF, 0xD9); /* Initialize MBHC module */ mbhc = &wcd937x->mbhc->wcd_mbhc; ret = wcd937x_mbhc_post_ssr_init(wcd937x->mbhc, codec); Loading
asoc/sm6150.c +29 −48 Original line number Diff line number Diff line /* * Copyright (c) 2018, The Linux Foundation. All rights reserved. * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -4724,28 +4724,6 @@ static void msm_afe_clear_config(void) afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG); } static int msm_config_hph_en0_gpio(struct snd_soc_codec *codec, bool high) { struct snd_soc_card *card = codec->component.card; struct msm_asoc_mach_data *pdata; int val; if (!card) return 0; pdata = snd_soc_card_get_drvdata(card); if (!pdata || !gpio_is_valid(pdata->hph_en0_gpio)) return 0; val = gpio_get_value_cansleep(pdata->hph_en0_gpio); if ((!!val) == high) return 0; gpio_direction_output(pdata->hph_en0_gpio, (int)high); return 1; } static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd) { int ret = 0; Loading Loading @@ -4870,6 +4848,7 @@ static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd) } card = rtd->card->snd_card; if (!pdata->codec_root) { entry = snd_info_create_subdir(card->module, "codecs", card->proc_root); if (!entry) { Loading @@ -4879,6 +4858,7 @@ static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd) goto err; } pdata->codec_root = entry; } tavil_codec_info_create_codec_entry(pdata->codec_root, codec); codec_reg_done = true; Loading Loading @@ -5038,6 +5018,7 @@ static int msm_audrx_tasha_init(struct snd_soc_pcm_runtime *rtd) } card = rtd->card->snd_card; if (!pdata->codec_root) { entry = snd_info_create_subdir(card->module, "codecs", card->proc_root); if (!entry) { Loading @@ -5047,8 +5028,8 @@ static int msm_audrx_tasha_init(struct snd_soc_pcm_runtime *rtd) goto err; } pdata->codec_root = entry; } tasha_codec_info_create_codec_entry(pdata->codec_root, codec); tasha_mbhc_zdet_gpio_ctrl(msm_config_hph_en0_gpio, rtd->codec); codec_reg_done = true; return 0; Loading Loading @@ -8795,8 +8776,8 @@ static int msm_init_aux_dev(struct platform_device *pdev, __func__, found); codec_aux_dev: if (!strnstr(card->name, "tavil", sizeof("tavil")) && !strnstr(card->name, "tasha", sizeof("tasha"))) { if (!strnstr(card->name, "tavil", strlen(card->name)) && !strnstr(card->name, "tasha", strlen(card->name))) { /* Get count of aux codec device phandles for this platform */ codec_aux_dev_cnt = of_count_phandle_with_args( pdev->dev.of_node, Loading Loading @@ -8984,8 +8965,8 @@ static int sm6150_ssr_enable(struct device *dev, void *data) goto err; } if (strnstr(card->name, "tavil", sizeof("tavil")) || strnstr(card->name, "tasha", sizeof("tasha"))) { if (strnstr(card->name, "tavil", strlen(card->name)) || strnstr(card->name, "tasha", strlen(card->name))) { pdata = snd_soc_card_get_drvdata(card); if (!pdata->is_afe_config_done) { const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX; Loading Loading @@ -9028,8 +9009,8 @@ static void sm6150_ssr_disable(struct device *dev, void *data) dev_dbg(dev, "%s: setting snd_card to OFFLINE\n", __func__); snd_soc_card_change_online_state(card, 0); if (strnstr(card->name, "tavil", sizeof("tavil")) || strnstr(card->name, "tasha", sizeof("tasha"))) { if (strnstr(card->name, "tavil", strlen(card->name)) || strnstr(card->name, "tasha", strlen(card->name))) { pdata = snd_soc_card_get_drvdata(card); msm_afe_clear_config(); pdata->is_afe_config_done = false; Loading Loading @@ -9252,8 +9233,8 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) } msm_i2s_auxpcm_init(pdev); if (!strnstr(card->name, "tavil", sizeof("tavil")) && !strnstr(card->name, "tasha", sizeof("tasha"))) { if (!strnstr(card->name, "tavil", strlen(card->name)) && !strnstr(card->name, "tasha", strlen(card->name))) { pdata->dmic01_gpio_p = of_parse_phandle(pdev->dev.of_node, "qcom,cdc-dmic01-gpios", 0); Loading
config/sm8150auto.conf +1 −0 Original line number Diff line number Diff line Loading @@ -38,3 +38,4 @@ CONFIG_DTS_SRS_TM=m CONFIG_SND_SOC_MSM_STUB=m CONFIG_MSM_AVTIMER=m CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m CONFIG_VOICE_MHI=m