Loading asoc/bengal-port-config.h +15 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #ifndef _BENGAL_PORT_CONFIG Loading @@ -21,6 +21,15 @@ static struct port_params rx_frame_params_default[SWR_MSTR_PORT_LEN] = { {0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0}, }; static struct port_params rx_frame_params_rouleur[SWR_MSTR_PORT_LEN] = { {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1}, {31, 0, 0, 3, 6, 7, 0, 0xFF, 0}, {31, 1, 0, 0xFF, 0xFF, 4, 1, 0xFF, 0}, {7, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, {0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0}, }; static struct port_params rx_frame_params_dsd[SWR_MSTR_PORT_LEN] = { {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1}, {31, 0, 0, 3, 6, 7, 0, 0xFF, 0}, Loading @@ -42,4 +51,9 @@ static struct swr_mstr_port_map sm_port_map[] = { {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, }; static struct swr_mstr_port_map sm_port_map_rouleur[] = { {VA_MACRO, SWR_UC0, tx_frame_params_default}, {RX_MACRO, SWR_UC0, rx_frame_params_rouleur}, {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, }; #endif /* _BENGAL_PORT_CONFIG */ asoc/bengal.c +107 −11 Original line number Diff line number Diff line Loading @@ -59,10 +59,12 @@ #define WCD9XXX_MBHC_DEF_RLOADS 5 #define WCD9XXX_MBHC_DEF_BUTTONS 8 #define ROULEUR_MBHC_DEF_BUTTONS 5 #define CODEC_EXT_CLK_RATE 9600000 #define ADSP_STATE_READY_TIMEOUT_MS 3000 #define DEV_NAME_STR_LEN 32 #define WCD_MBHC_HS_V_MAX 1600 #define ROULEUR_MBHC_HS_V_MAX 1700 #define TDM_CHANNEL_MAX 8 #define DEV_NAME_STR_LEN 32 Loading Loading @@ -555,6 +557,7 @@ static int dmic_0_1_gpio_cnt; static int dmic_2_3_gpio_cnt; static void *def_wcd_mbhc_cal(void); static void *def_rouleur_mbhc_cal(void); /* * Need to report LINEIN Loading Loading @@ -4218,6 +4221,9 @@ static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd) struct snd_soc_dapm_context *dapm; struct snd_card *card; struct snd_info_entry *entry; struct platform_device *pdev = NULL; int i = 0; char *data = NULL; struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card); Loading Loading @@ -4260,8 +4266,38 @@ static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd) snd_soc_dapm_sync(dapm); bolero_set_port_map(component, ARRAY_SIZE(sm_port_map), for (i = 0; i < rtd->card->num_aux_devs; i++) { if (msm_aux_dev[i].name != NULL ) { if (strstr(msm_aux_dev[i].name, "wsa")) continue; } if (msm_aux_dev[i].codec_of_node) { pdev = of_find_device_by_node( msm_aux_dev[i].codec_of_node); if (pdev) data = (char*) of_device_get_match_data( &pdev->dev); if (data != NULL) { if (!strncmp(data, "wcd937x", sizeof("wcd937x"))) { bolero_set_port_map(component, ARRAY_SIZE(sm_port_map), sm_port_map); break; } else if (!strncmp( data, "rouleur", sizeof("rouleur"))) { bolero_set_port_map(component, ARRAY_SIZE(sm_port_map_rouleur), sm_port_map_rouleur); break; } } } } card = rtd->card->snd_card; if (!pdata->codec_root) { entry = snd_info_create_subdir(card->module, "codecs", Loading Loading @@ -4311,6 +4347,34 @@ static void *def_wcd_mbhc_cal(void) return wcd_mbhc_cal; } static void *def_rouleur_mbhc_cal(void) { void *wcd_mbhc_cal; struct wcd_mbhc_btn_detect_cfg *btn_cfg; u16 *btn_high; wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(ROULEUR_MBHC_DEF_BUTTONS, WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); if (!wcd_mbhc_cal) return NULL; WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->v_hs_max = ROULEUR_MBHC_HS_V_MAX; WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->num_btn = ROULEUR_MBHC_DEF_BUTTONS; btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal); btn_high = ((void *)&btn_cfg->_v_btn_low) + (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); btn_high[0] = 75; btn_high[1] = 150; btn_high[2] = 237; btn_high[3] = 500; btn_high[4] = 500; return wcd_mbhc_cal; } /* Digital audio interface glue - connects codec <---> CPU */ static struct snd_soc_dai_link msm_common_dai_links[] = { /* FrontEnd DAI Links */ Loading Loading @@ -5030,6 +5094,33 @@ static struct snd_soc_dai_link msm_common_be_dai_links[] = { .ignore_suspend = 1, .ignore_pmdown_time = 1, }, /* Proxy Tx BACK END DAI Link */ { .name = LPASS_BE_PROXY_TX, .stream_name = "Proxy Capture", .cpu_dai_name = "msm-dai-q6-dev.8195", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_PROXY_TX, .ignore_suspend = 1, }, /* Proxy Rx BACK END DAI Link */ { .name = LPASS_BE_PROXY_RX, .stream_name = "Proxy Playback", .cpu_dai_name = "msm-dai-q6-dev.8194", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_PROXY_RX, .ignore_pmdown_time = 1, .ignore_suspend = 1, }, { .name = LPASS_BE_USB_AUDIO_RX, .stream_name = "USB Audio Playback", Loading Loading @@ -6056,16 +6147,21 @@ static int msm_aux_codec_init(struct snd_soc_component *component) } mbhc_cfg_cal: if (data != NULL) { if (!strncmp(data, "wcd937x", sizeof("wcd937x"))) { mbhc_calibration = def_wcd_mbhc_cal(); if (!mbhc_calibration) return -ENOMEM; wcd_mbhc_cfg.calibration = mbhc_calibration; if (data != NULL) { if (!strncmp(data, "wcd937x", sizeof("wcd937x"))) ret = wcd937x_mbhc_hs_detect(component, &wcd_mbhc_cfg); else if (!strncmp( data, "rouleur", sizeof("rouleur"))) } else if (!strncmp( data, "rouleur", sizeof("rouleur"))) { mbhc_calibration = def_rouleur_mbhc_cal(); if (!mbhc_calibration) return -ENOMEM; wcd_mbhc_cfg.calibration = mbhc_calibration; ret = rouleur_mbhc_hs_detect(component, &wcd_mbhc_cfg); } } if (ret) { dev_err(component->dev, "%s: mbhc hs detect failed, err:%d\n", Loading asoc/codecs/bolero/rx-macro.c +19 −12 Original line number Diff line number Diff line Loading @@ -1687,13 +1687,6 @@ static int rx_macro_config_compander(struct snd_soc_component *component, dev_dbg(component->dev, "%s: event %d compander %d, enabled %d\n", __func__, event, comp + 1, rx_priv->comp_enabled[comp]); if (!rx_priv->comp_enabled[comp]) return 0; comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 + (comp * RX_MACRO_COMP_OFFSET); rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 + (comp * RX_MACRO_RX_PATH_OFFSET); rx_path_cfg3_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG3 + (comp * RX_MACRO_RX_PATH_OFFSET); rx0_path_ctl_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + Loading @@ -1709,6 +1702,19 @@ static int rx_macro_config_compander(struct snd_soc_component *component, else val = 0x00; if (SND_SOC_DAPM_EVENT_ON(event)) snd_soc_component_update_bits(component, rx_path_cfg3_reg, 0x03, val); if (SND_SOC_DAPM_EVENT_OFF(event)) snd_soc_component_update_bits(component, rx_path_cfg3_reg, 0x03, 0x03); if (!rx_priv->comp_enabled[comp]) return 0; comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 + (comp * RX_MACRO_COMP_OFFSET); rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 + (comp * RX_MACRO_RX_PATH_OFFSET); if (SND_SOC_DAPM_EVENT_ON(event)) { /* Enable Compander Clock */ snd_soc_component_update_bits(component, comp_ctl0_reg, Loading @@ -1719,8 +1725,6 @@ static int rx_macro_config_compander(struct snd_soc_component *component, 0x02, 0x00); snd_soc_component_update_bits(component, rx_path_cfg0_reg, 0x02, 0x02); snd_soc_component_update_bits(component, rx_path_cfg3_reg, 0x03, val); } if (SND_SOC_DAPM_EVENT_OFF(event)) { Loading @@ -1732,8 +1736,6 @@ static int rx_macro_config_compander(struct snd_soc_component *component, 0x01, 0x00); snd_soc_component_update_bits(component, comp_ctl0_reg, 0x04, 0x00); snd_soc_component_update_bits(component, rx_path_cfg3_reg, 0x03, 0x03); } return 0; Loading Loading @@ -1908,6 +1910,11 @@ static int rx_macro_config_classh(struct snd_soc_component *component, 0x40, 0x40); break; case INTERP_HPHR: if (rx_priv->is_ear_mode_on) snd_soc_component_update_bits(component, BOLERO_CDC_RX_CLSH_HPH_V_PA, 0x3F, 0x39); else snd_soc_component_update_bits(component, BOLERO_CDC_RX_CLSH_HPH_V_PA, 0x3F, 0x1C); Loading asoc/codecs/bolero/wsa-macro.c +30 −4 Original line number Diff line number Diff line Loading @@ -241,6 +241,7 @@ struct wsa_macro_priv { struct wsa_macro_bcl_pmic_params bcl_pmic_params; char __iomem *mclk_mode_muxsel; u16 default_clk_id; u32 pcm_rate_vi; int wsa_digital_mute_status[WSA_MACRO_RX_MAX]; }; Loading Loading @@ -747,6 +748,15 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_component *component = dai->component; int ret; struct device *wsa_dev = NULL; struct wsa_macro_priv *wsa_priv = NULL; if (!wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__)) return -EINVAL; wsa_priv = dev_get_drvdata(wsa_dev); if (!wsa_priv) return -EINVAL; dev_dbg(component->dev, "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, Loading @@ -764,6 +774,8 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream, } break; case SNDRV_PCM_STREAM_CAPTURE: if (dai->id == WSA_MACRO_AIF_VI) wsa_priv->pcm_rate_vi = params_rate(params); default: break; } Loading Loading @@ -1046,10 +1058,24 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, snd_soc_dapm_to_component(w->dapm); struct device *wsa_dev = NULL; struct wsa_macro_priv *wsa_priv = NULL; u8 val = 0x0; if (!wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__)) return -EINVAL; switch (wsa_priv->pcm_rate_vi) { case 48000: val = 0x04; break; case 24000: val = 0x02; break; case 8000: default: val = 0x00; break; } switch (event) { case SND_SOC_DAPM_POST_PMU: if (test_bit(WSA_MACRO_TX0, Loading @@ -1064,10 +1090,10 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, 0x20, 0x20); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x0F, 0x00); 0x0F, val); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, 0x0F, 0x00); 0x0F, val); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x10, 0x10); Loading @@ -1093,10 +1119,10 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, 0x20, 0x20); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x0F, 0x00); 0x0F, val); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, 0x0F, 0x00); 0x0F, val); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x10, 0x10); Loading asoc/codecs/csra66x0/csra66x0.c +20 −1 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #include <linux/init.h> #include <linux/delay.h> Loading Loading @@ -602,6 +602,25 @@ static const struct snd_soc_dapm_route csra66x0_dapm_routes[] = { {"PGA", NULL, "DAC"}, {"SPKR", NULL, "PGA"}, }; /* * csra66x0_hw_free_mute - Update csra66x0 mute register * * @component - csra66x0 component * */ void csra66x0_hw_free_mute(struct snd_soc_component *component) { int val = 0; if (component == NULL) return; val = snd_soc_component_read32(component, CSRA66X0_MISC_CONTROL_STATUS_1_FA); snd_soc_component_write(component, CSRA66X0_MISC_CONTROL_STATUS_1_FA, val | 0x04); } EXPORT_SYMBOL(csra66x0_hw_free_mute); static int csra66x0_wait_for_config_state(struct snd_soc_component *component) { Loading Loading
asoc/bengal-port-config.h +15 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #ifndef _BENGAL_PORT_CONFIG Loading @@ -21,6 +21,15 @@ static struct port_params rx_frame_params_default[SWR_MSTR_PORT_LEN] = { {0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0}, }; static struct port_params rx_frame_params_rouleur[SWR_MSTR_PORT_LEN] = { {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1}, {31, 0, 0, 3, 6, 7, 0, 0xFF, 0}, {31, 1, 0, 0xFF, 0xFF, 4, 1, 0xFF, 0}, {7, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, {0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0}, }; static struct port_params rx_frame_params_dsd[SWR_MSTR_PORT_LEN] = { {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1}, {31, 0, 0, 3, 6, 7, 0, 0xFF, 0}, Loading @@ -42,4 +51,9 @@ static struct swr_mstr_port_map sm_port_map[] = { {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, }; static struct swr_mstr_port_map sm_port_map_rouleur[] = { {VA_MACRO, SWR_UC0, tx_frame_params_default}, {RX_MACRO, SWR_UC0, rx_frame_params_rouleur}, {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, }; #endif /* _BENGAL_PORT_CONFIG */
asoc/bengal.c +107 −11 Original line number Diff line number Diff line Loading @@ -59,10 +59,12 @@ #define WCD9XXX_MBHC_DEF_RLOADS 5 #define WCD9XXX_MBHC_DEF_BUTTONS 8 #define ROULEUR_MBHC_DEF_BUTTONS 5 #define CODEC_EXT_CLK_RATE 9600000 #define ADSP_STATE_READY_TIMEOUT_MS 3000 #define DEV_NAME_STR_LEN 32 #define WCD_MBHC_HS_V_MAX 1600 #define ROULEUR_MBHC_HS_V_MAX 1700 #define TDM_CHANNEL_MAX 8 #define DEV_NAME_STR_LEN 32 Loading Loading @@ -555,6 +557,7 @@ static int dmic_0_1_gpio_cnt; static int dmic_2_3_gpio_cnt; static void *def_wcd_mbhc_cal(void); static void *def_rouleur_mbhc_cal(void); /* * Need to report LINEIN Loading Loading @@ -4218,6 +4221,9 @@ static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd) struct snd_soc_dapm_context *dapm; struct snd_card *card; struct snd_info_entry *entry; struct platform_device *pdev = NULL; int i = 0; char *data = NULL; struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(rtd->card); Loading Loading @@ -4260,8 +4266,38 @@ static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd) snd_soc_dapm_sync(dapm); bolero_set_port_map(component, ARRAY_SIZE(sm_port_map), for (i = 0; i < rtd->card->num_aux_devs; i++) { if (msm_aux_dev[i].name != NULL ) { if (strstr(msm_aux_dev[i].name, "wsa")) continue; } if (msm_aux_dev[i].codec_of_node) { pdev = of_find_device_by_node( msm_aux_dev[i].codec_of_node); if (pdev) data = (char*) of_device_get_match_data( &pdev->dev); if (data != NULL) { if (!strncmp(data, "wcd937x", sizeof("wcd937x"))) { bolero_set_port_map(component, ARRAY_SIZE(sm_port_map), sm_port_map); break; } else if (!strncmp( data, "rouleur", sizeof("rouleur"))) { bolero_set_port_map(component, ARRAY_SIZE(sm_port_map_rouleur), sm_port_map_rouleur); break; } } } } card = rtd->card->snd_card; if (!pdata->codec_root) { entry = snd_info_create_subdir(card->module, "codecs", Loading Loading @@ -4311,6 +4347,34 @@ static void *def_wcd_mbhc_cal(void) return wcd_mbhc_cal; } static void *def_rouleur_mbhc_cal(void) { void *wcd_mbhc_cal; struct wcd_mbhc_btn_detect_cfg *btn_cfg; u16 *btn_high; wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(ROULEUR_MBHC_DEF_BUTTONS, WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL); if (!wcd_mbhc_cal) return NULL; WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->v_hs_max = ROULEUR_MBHC_HS_V_MAX; WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->num_btn = ROULEUR_MBHC_DEF_BUTTONS; btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal); btn_high = ((void *)&btn_cfg->_v_btn_low) + (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn); btn_high[0] = 75; btn_high[1] = 150; btn_high[2] = 237; btn_high[3] = 500; btn_high[4] = 500; return wcd_mbhc_cal; } /* Digital audio interface glue - connects codec <---> CPU */ static struct snd_soc_dai_link msm_common_dai_links[] = { /* FrontEnd DAI Links */ Loading Loading @@ -5030,6 +5094,33 @@ static struct snd_soc_dai_link msm_common_be_dai_links[] = { .ignore_suspend = 1, .ignore_pmdown_time = 1, }, /* Proxy Tx BACK END DAI Link */ { .name = LPASS_BE_PROXY_TX, .stream_name = "Proxy Capture", .cpu_dai_name = "msm-dai-q6-dev.8195", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-tx", .no_pcm = 1, .dpcm_capture = 1, .id = MSM_BACKEND_DAI_PROXY_TX, .ignore_suspend = 1, }, /* Proxy Rx BACK END DAI Link */ { .name = LPASS_BE_PROXY_RX, .stream_name = "Proxy Playback", .cpu_dai_name = "msm-dai-q6-dev.8194", .platform_name = "msm-pcm-routing", .codec_name = "msm-stub-codec.1", .codec_dai_name = "msm-stub-rx", .no_pcm = 1, .dpcm_playback = 1, .id = MSM_BACKEND_DAI_PROXY_RX, .ignore_pmdown_time = 1, .ignore_suspend = 1, }, { .name = LPASS_BE_USB_AUDIO_RX, .stream_name = "USB Audio Playback", Loading Loading @@ -6056,16 +6147,21 @@ static int msm_aux_codec_init(struct snd_soc_component *component) } mbhc_cfg_cal: if (data != NULL) { if (!strncmp(data, "wcd937x", sizeof("wcd937x"))) { mbhc_calibration = def_wcd_mbhc_cal(); if (!mbhc_calibration) return -ENOMEM; wcd_mbhc_cfg.calibration = mbhc_calibration; if (data != NULL) { if (!strncmp(data, "wcd937x", sizeof("wcd937x"))) ret = wcd937x_mbhc_hs_detect(component, &wcd_mbhc_cfg); else if (!strncmp( data, "rouleur", sizeof("rouleur"))) } else if (!strncmp( data, "rouleur", sizeof("rouleur"))) { mbhc_calibration = def_rouleur_mbhc_cal(); if (!mbhc_calibration) return -ENOMEM; wcd_mbhc_cfg.calibration = mbhc_calibration; ret = rouleur_mbhc_hs_detect(component, &wcd_mbhc_cfg); } } if (ret) { dev_err(component->dev, "%s: mbhc hs detect failed, err:%d\n", Loading
asoc/codecs/bolero/rx-macro.c +19 −12 Original line number Diff line number Diff line Loading @@ -1687,13 +1687,6 @@ static int rx_macro_config_compander(struct snd_soc_component *component, dev_dbg(component->dev, "%s: event %d compander %d, enabled %d\n", __func__, event, comp + 1, rx_priv->comp_enabled[comp]); if (!rx_priv->comp_enabled[comp]) return 0; comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 + (comp * RX_MACRO_COMP_OFFSET); rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 + (comp * RX_MACRO_RX_PATH_OFFSET); rx_path_cfg3_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG3 + (comp * RX_MACRO_RX_PATH_OFFSET); rx0_path_ctl_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + Loading @@ -1709,6 +1702,19 @@ static int rx_macro_config_compander(struct snd_soc_component *component, else val = 0x00; if (SND_SOC_DAPM_EVENT_ON(event)) snd_soc_component_update_bits(component, rx_path_cfg3_reg, 0x03, val); if (SND_SOC_DAPM_EVENT_OFF(event)) snd_soc_component_update_bits(component, rx_path_cfg3_reg, 0x03, 0x03); if (!rx_priv->comp_enabled[comp]) return 0; comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 + (comp * RX_MACRO_COMP_OFFSET); rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 + (comp * RX_MACRO_RX_PATH_OFFSET); if (SND_SOC_DAPM_EVENT_ON(event)) { /* Enable Compander Clock */ snd_soc_component_update_bits(component, comp_ctl0_reg, Loading @@ -1719,8 +1725,6 @@ static int rx_macro_config_compander(struct snd_soc_component *component, 0x02, 0x00); snd_soc_component_update_bits(component, rx_path_cfg0_reg, 0x02, 0x02); snd_soc_component_update_bits(component, rx_path_cfg3_reg, 0x03, val); } if (SND_SOC_DAPM_EVENT_OFF(event)) { Loading @@ -1732,8 +1736,6 @@ static int rx_macro_config_compander(struct snd_soc_component *component, 0x01, 0x00); snd_soc_component_update_bits(component, comp_ctl0_reg, 0x04, 0x00); snd_soc_component_update_bits(component, rx_path_cfg3_reg, 0x03, 0x03); } return 0; Loading Loading @@ -1908,6 +1910,11 @@ static int rx_macro_config_classh(struct snd_soc_component *component, 0x40, 0x40); break; case INTERP_HPHR: if (rx_priv->is_ear_mode_on) snd_soc_component_update_bits(component, BOLERO_CDC_RX_CLSH_HPH_V_PA, 0x3F, 0x39); else snd_soc_component_update_bits(component, BOLERO_CDC_RX_CLSH_HPH_V_PA, 0x3F, 0x1C); Loading
asoc/codecs/bolero/wsa-macro.c +30 −4 Original line number Diff line number Diff line Loading @@ -241,6 +241,7 @@ struct wsa_macro_priv { struct wsa_macro_bcl_pmic_params bcl_pmic_params; char __iomem *mclk_mode_muxsel; u16 default_clk_id; u32 pcm_rate_vi; int wsa_digital_mute_status[WSA_MACRO_RX_MAX]; }; Loading Loading @@ -747,6 +748,15 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_component *component = dai->component; int ret; struct device *wsa_dev = NULL; struct wsa_macro_priv *wsa_priv = NULL; if (!wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__)) return -EINVAL; wsa_priv = dev_get_drvdata(wsa_dev); if (!wsa_priv) return -EINVAL; dev_dbg(component->dev, "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__, Loading @@ -764,6 +774,8 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream, } break; case SNDRV_PCM_STREAM_CAPTURE: if (dai->id == WSA_MACRO_AIF_VI) wsa_priv->pcm_rate_vi = params_rate(params); default: break; } Loading Loading @@ -1046,10 +1058,24 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, snd_soc_dapm_to_component(w->dapm); struct device *wsa_dev = NULL; struct wsa_macro_priv *wsa_priv = NULL; u8 val = 0x0; if (!wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__)) return -EINVAL; switch (wsa_priv->pcm_rate_vi) { case 48000: val = 0x04; break; case 24000: val = 0x02; break; case 8000: default: val = 0x00; break; } switch (event) { case SND_SOC_DAPM_POST_PMU: if (test_bit(WSA_MACRO_TX0, Loading @@ -1064,10 +1090,10 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, 0x20, 0x20); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x0F, 0x00); 0x0F, val); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL, 0x0F, 0x00); 0x0F, val); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x10, 0x10); Loading @@ -1093,10 +1119,10 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w, 0x20, 0x20); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x0F, 0x00); 0x0F, val); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL, 0x0F, 0x00); 0x0F, val); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x10, 0x10); Loading
asoc/codecs/csra66x0/csra66x0.c +20 −1 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #include <linux/init.h> #include <linux/delay.h> Loading Loading @@ -602,6 +602,25 @@ static const struct snd_soc_dapm_route csra66x0_dapm_routes[] = { {"PGA", NULL, "DAC"}, {"SPKR", NULL, "PGA"}, }; /* * csra66x0_hw_free_mute - Update csra66x0 mute register * * @component - csra66x0 component * */ void csra66x0_hw_free_mute(struct snd_soc_component *component) { int val = 0; if (component == NULL) return; val = snd_soc_component_read32(component, CSRA66X0_MISC_CONTROL_STATUS_1_FA); snd_soc_component_write(component, CSRA66X0_MISC_CONTROL_STATUS_1_FA, val | 0x04); } EXPORT_SYMBOL(csra66x0_hw_free_mute); static int csra66x0_wait_for_config_state(struct snd_soc_component *component) { Loading