Loading asoc/sdm660-external.c +96 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #include "msm-pcm-routing-v2.h" #include "sdm660-common.h" #include "sdm660-external.h" #include "codecs/msm-cdc-pinctrl.h" #include "codecs/wcd9335.h" #include "codecs/wcd934x/wcd934x.h" #include "codecs/wcd934x/wcd934x-mbhc.h" Loading @@ -37,6 +38,8 @@ #define WSA8810_NAME_1 "wsa881x.20170211" #define WSA8810_NAME_2 "wsa881x.20170212" #define MSM_HIFI_ON 1 static int msm_ext_spk_control = 1; static struct wcd_mbhc_config *wcd_mbhc_cfg_ptr; Loading @@ -48,6 +51,7 @@ struct msm_asoc_wcd93xx_codec { static struct msm_asoc_wcd93xx_codec msm_codec_fn; static struct platform_device *spdev; static int msm_hifi_control; static bool is_initial_boot; Loading Loading @@ -109,7 +113,9 @@ static struct dev_config slim_tx_cfg[] = { }; static int msm_vi_feed_tx_ch = 2; static const char *const slim_rx_ch_text[] = {"One", "Two"}; static const char *const slim_rx_ch_text[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"}; static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"}; Loading @@ -130,6 +136,8 @@ static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16", static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16", "KHZ_44P1", "KHZ_48", "KHZ_88P2", "KHZ_96"}; static const char *const hifi_text[] = {"Off", "On"}; static SOC_ENUM_SINGLE_EXT_DECL(spk_func_en, spk_function_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text); Loading @@ -150,6 +158,7 @@ static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text); static SOC_ENUM_SINGLE_EXT_DECL(hifi_function, hifi_text); static int slim_get_sample_rate_val(int sample_rate) { Loading Loading @@ -738,6 +747,56 @@ static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, return 1; } static int msm_hifi_ctrl(struct snd_soc_codec *codec) { struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); struct snd_soc_card *card = codec->component.card; struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); pr_debug("%s: msm_hifi_control = %d\n", __func__, msm_hifi_control); if (!pdata || !pdata->hph_en1_gpio_p) { pr_err("%s: hph_en1_gpio is invalid\n", __func__); return -EINVAL; } if (msm_hifi_control == MSM_HIFI_ON) { msm_cdc_pinctrl_select_active_state(pdata->hph_en1_gpio_p); /* 5msec delay needed as per HW requirement */ usleep_range(5000, 5010); } else { msm_cdc_pinctrl_select_sleep_state(pdata->hph_en1_gpio_p); } snd_soc_dapm_sync(dapm); return 0; } static int msm_hifi_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { pr_debug("%s: msm_hifi_control = %d\n", __func__, msm_hifi_control); ucontrol->value.integer.value[0] = msm_hifi_control; return 0; } static int msm_hifi_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s() ucontrol->value.integer.value[0] = %ld\n", __func__, ucontrol->value.integer.value[0]); msm_hifi_control = ucontrol->value.integer.value[0]; msm_hifi_ctrl(codec); return 0; } static void *def_ext_mbhc_cal(void) { void *wcd_mbhc_cal; Loading Loading @@ -887,6 +946,8 @@ static const struct snd_kcontrol_new msm_snd_controls[] = { SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx, msm_bt_sample_rate_tx_get, msm_bt_sample_rate_tx_put), SOC_ENUM_EXT("HiFi Function", hifi_function, msm_hifi_get, msm_hifi_put), }; static int msm_slim_get_ch_from_beid(int32_t id) Loading Loading @@ -1536,6 +1597,39 @@ static int msm_ext_mclk_event(struct snd_soc_dapm_widget *w, return 0; } static int msm_hifi_ctrl_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); struct snd_soc_card *card = codec->component.card; struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); pr_debug("%s: msm_hifi_control = %d\n", __func__, msm_hifi_control); if (!pdata || !pdata->hph_en0_gpio_p) { pr_err("%s: hph_en0_gpio is invalid\n", __func__); return -EINVAL; } if (msm_hifi_control != MSM_HIFI_ON) { pr_debug("%s: HiFi mixer control is not set\n", __func__); return 0; } switch (event) { case SND_SOC_DAPM_POST_PMU: msm_cdc_pinctrl_select_active_state(pdata->hph_en0_gpio_p); break; case SND_SOC_DAPM_PRE_PMD: msm_cdc_pinctrl_select_sleep_state(pdata->hph_en0_gpio_p); break; } return 0; } static int msm_ext_prepare_hifi(struct msm_asoc_mach_data *pdata) { int ret = 0; Loading Loading @@ -1575,6 +1669,7 @@ static const struct snd_soc_dapm_widget msm_dapm_widgets[] = { SND_SOC_DAPM_SPK("Lineout_3 amp", NULL), SND_SOC_DAPM_SPK("Lineout_2 amp", NULL), SND_SOC_DAPM_SPK("Lineout_4 amp", NULL), SND_SOC_DAPM_SPK("hifi amp", msm_hifi_ctrl_event), SND_SOC_DAPM_MIC("Handset Mic", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Secondary Mic", NULL), Loading Loading
asoc/sdm660-external.c +96 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #include "msm-pcm-routing-v2.h" #include "sdm660-common.h" #include "sdm660-external.h" #include "codecs/msm-cdc-pinctrl.h" #include "codecs/wcd9335.h" #include "codecs/wcd934x/wcd934x.h" #include "codecs/wcd934x/wcd934x-mbhc.h" Loading @@ -37,6 +38,8 @@ #define WSA8810_NAME_1 "wsa881x.20170211" #define WSA8810_NAME_2 "wsa881x.20170212" #define MSM_HIFI_ON 1 static int msm_ext_spk_control = 1; static struct wcd_mbhc_config *wcd_mbhc_cfg_ptr; Loading @@ -48,6 +51,7 @@ struct msm_asoc_wcd93xx_codec { static struct msm_asoc_wcd93xx_codec msm_codec_fn; static struct platform_device *spdev; static int msm_hifi_control; static bool is_initial_boot; Loading Loading @@ -109,7 +113,9 @@ static struct dev_config slim_tx_cfg[] = { }; static int msm_vi_feed_tx_ch = 2; static const char *const slim_rx_ch_text[] = {"One", "Two"}; static const char *const slim_rx_ch_text[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"}; static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"}; Loading @@ -130,6 +136,8 @@ static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16", static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16", "KHZ_44P1", "KHZ_48", "KHZ_88P2", "KHZ_96"}; static const char *const hifi_text[] = {"Off", "On"}; static SOC_ENUM_SINGLE_EXT_DECL(spk_func_en, spk_function_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text); static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text); Loading @@ -150,6 +158,7 @@ static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text); static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text); static SOC_ENUM_SINGLE_EXT_DECL(hifi_function, hifi_text); static int slim_get_sample_rate_val(int sample_rate) { Loading Loading @@ -738,6 +747,56 @@ static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol, return 1; } static int msm_hifi_ctrl(struct snd_soc_codec *codec) { struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); struct snd_soc_card *card = codec->component.card; struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); pr_debug("%s: msm_hifi_control = %d\n", __func__, msm_hifi_control); if (!pdata || !pdata->hph_en1_gpio_p) { pr_err("%s: hph_en1_gpio is invalid\n", __func__); return -EINVAL; } if (msm_hifi_control == MSM_HIFI_ON) { msm_cdc_pinctrl_select_active_state(pdata->hph_en1_gpio_p); /* 5msec delay needed as per HW requirement */ usleep_range(5000, 5010); } else { msm_cdc_pinctrl_select_sleep_state(pdata->hph_en1_gpio_p); } snd_soc_dapm_sync(dapm); return 0; } static int msm_hifi_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { pr_debug("%s: msm_hifi_control = %d\n", __func__, msm_hifi_control); ucontrol->value.integer.value[0] = msm_hifi_control; return 0; } static int msm_hifi_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s() ucontrol->value.integer.value[0] = %ld\n", __func__, ucontrol->value.integer.value[0]); msm_hifi_control = ucontrol->value.integer.value[0]; msm_hifi_ctrl(codec); return 0; } static void *def_ext_mbhc_cal(void) { void *wcd_mbhc_cal; Loading Loading @@ -887,6 +946,8 @@ static const struct snd_kcontrol_new msm_snd_controls[] = { SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx, msm_bt_sample_rate_tx_get, msm_bt_sample_rate_tx_put), SOC_ENUM_EXT("HiFi Function", hifi_function, msm_hifi_get, msm_hifi_put), }; static int msm_slim_get_ch_from_beid(int32_t id) Loading Loading @@ -1536,6 +1597,39 @@ static int msm_ext_mclk_event(struct snd_soc_dapm_widget *w, return 0; } static int msm_hifi_ctrl_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); struct snd_soc_card *card = codec->component.card; struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); pr_debug("%s: msm_hifi_control = %d\n", __func__, msm_hifi_control); if (!pdata || !pdata->hph_en0_gpio_p) { pr_err("%s: hph_en0_gpio is invalid\n", __func__); return -EINVAL; } if (msm_hifi_control != MSM_HIFI_ON) { pr_debug("%s: HiFi mixer control is not set\n", __func__); return 0; } switch (event) { case SND_SOC_DAPM_POST_PMU: msm_cdc_pinctrl_select_active_state(pdata->hph_en0_gpio_p); break; case SND_SOC_DAPM_PRE_PMD: msm_cdc_pinctrl_select_sleep_state(pdata->hph_en0_gpio_p); break; } return 0; } static int msm_ext_prepare_hifi(struct msm_asoc_mach_data *pdata) { int ret = 0; Loading Loading @@ -1575,6 +1669,7 @@ static const struct snd_soc_dapm_widget msm_dapm_widgets[] = { SND_SOC_DAPM_SPK("Lineout_3 amp", NULL), SND_SOC_DAPM_SPK("Lineout_2 amp", NULL), SND_SOC_DAPM_SPK("Lineout_4 amp", NULL), SND_SOC_DAPM_SPK("hifi amp", msm_hifi_ctrl_event), SND_SOC_DAPM_MIC("Handset Mic", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Secondary Mic", NULL), Loading