Lines Matching +full:dmic +full:- +full:sample +full:- +full:rate
1 // SPDX-License-Identifier: GPL-2.0
6 #include <linux/clk-provider.h>
21 #include <sound/soc-dapm.h>
23 #include "wcd-clsh-v2.h"
24 #include "wcd-mbhc-v2.h"
26 #include <dt-bindings/sound/qcom,wcd934x.h>
218 {"ADC MUX" #id, "DMIC", "DMIC MUX" #id }, \
220 {"DMIC MUX" #id, "DMIC0", "DMIC0"}, \
221 {"DMIC MUX" #id, "DMIC1", "DMIC1"}, \
222 {"DMIC MUX" #id, "DMIC2", "DMIC2"}, \
223 {"DMIC MUX" #id, "DMIC3", "DMIC3"}, \
224 {"DMIC MUX" #id, "DMIC4", "DMIC4"}, \
225 {"DMIC MUX" #id, "DMIC5", "DMIC5"}, \
433 COMPANDER_5, /* LO3_SE - not used in Tavil */
434 COMPANDER_6, /* LO4_SE - not used in Tavil */
505 .name = "WCD9335-IFC-DEV",
537 int rate; member
571 static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
587 "Class H Invalid", "Class-H Hi-Fi", "Class-H Low Power", "Class-AB",
588 "Class-H Hi-Fi Low Power"
692 "DMIC", "AMIC", "ANC_FB_TUNE1", "ANC_FB_TUNE2"
1256 if (sido_src == wcd->sido_input_src) in wcd934x_set_sido_input_src()
1260 regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO, in wcd934x_set_sido_input_src()
1265 wcd->sido_input_src = sido_src; in wcd934x_set_sido_input_src()
1272 mutex_lock(&wcd->sysclk_mutex); in wcd934x_enable_ana_bias_and_sysclk()
1274 if (++wcd->sysclk_users != 1) { in wcd934x_enable_ana_bias_and_sysclk()
1275 mutex_unlock(&wcd->sysclk_mutex); in wcd934x_enable_ana_bias_and_sysclk()
1278 mutex_unlock(&wcd->sysclk_mutex); in wcd934x_enable_ana_bias_and_sysclk()
1280 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_enable_ana_bias_and_sysclk()
1283 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_enable_ana_bias_and_sysclk()
1287 * 1ms delay is required after pre-charge is enabled in wcd934x_enable_ana_bias_and_sysclk()
1291 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_enable_ana_bias_and_sysclk()
1293 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_enable_ana_bias_and_sysclk()
1301 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, in wcd934x_enable_ana_bias_and_sysclk()
1304 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, in wcd934x_enable_ana_bias_and_sysclk()
1307 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, in wcd934x_enable_ana_bias_and_sysclk()
1310 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, in wcd934x_enable_ana_bias_and_sysclk()
1312 regmap_update_bits(wcd->regmap, in wcd934x_enable_ana_bias_and_sysclk()
1316 regmap_update_bits(wcd->regmap, in wcd934x_enable_ana_bias_and_sysclk()
1320 regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_GATE, in wcd934x_enable_ana_bias_and_sysclk()
1335 mutex_lock(&wcd->sysclk_mutex); in wcd934x_disable_ana_bias_and_syclk()
1336 if (--wcd->sysclk_users != 0) { in wcd934x_disable_ana_bias_and_syclk()
1337 mutex_unlock(&wcd->sysclk_mutex); in wcd934x_disable_ana_bias_and_syclk()
1340 mutex_unlock(&wcd->sysclk_mutex); in wcd934x_disable_ana_bias_and_syclk()
1342 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, in wcd934x_disable_ana_bias_and_syclk()
1345 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_disable_ana_bias_and_syclk()
1347 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_disable_ana_bias_and_syclk()
1358 ret = clk_prepare_enable(wcd->extclk); in __wcd934x_cdc_mclk_enable()
1361 dev_err(wcd->dev, "%s: ext clk enable failed\n", in __wcd934x_cdc_mclk_enable()
1369 regmap_read(wcd->regmap, WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL, in __wcd934x_cdc_mclk_enable()
1377 clk_disable_unprepare(wcd->extclk); in __wcd934x_cdc_mclk_enable()
1386 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_mclk()
1387 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_enable_mclk()
1406 regmap = wcd->regmap; in wcd934x_get_version()
1436 wcd->version = ver; in wcd934x_get_version()
1437 dev_info(wcd->dev, "WCD934X Minor:0x%x Version:0x%x\n", id_minor, ver); in wcd934x_get_version()
1448 regmap_update_bits(wcd->regmap, in wcd934x_enable_efuse_sensing()
1452 regmap_update_bits(wcd->regmap, in wcd934x_enable_efuse_sensing()
1463 rc = regmap_read(wcd->regmap, in wcd934x_enable_efuse_sensing()
1476 regmap_update_bits(wcd->regmap, in wcd934x_swrm_clock()
1481 regmap_update_bits(wcd->regmap, in wcd934x_swrm_clock()
1491 u8 rate_val, u32 rate) in wcd934x_set_prim_interpolator_rate() argument
1493 struct snd_soc_component *comp = dai->component; in wcd934x_set_prim_interpolator_rate()
1494 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_set_prim_interpolator_rate()
1499 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) { in wcd934x_set_prim_interpolator_rate()
1500 inp = ch->shift + INTn_1_INP_SEL_RX0; in wcd934x_set_prim_interpolator_rate()
1525 /* rate is in Hz */ in wcd934x_set_prim_interpolator_rate()
1528 * native sample rates in wcd934x_set_prim_interpolator_rate()
1531 j == INTERP_SPKR2) && rate == 44100) in wcd934x_set_prim_interpolator_rate()
1532 dev_err(wcd->dev, in wcd934x_set_prim_interpolator_rate()
1548 int rate_val, u32 rate) in wcd934x_set_mix_interpolator_rate() argument
1550 struct snd_soc_component *component = dai->component; in wcd934x_set_mix_interpolator_rate()
1551 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_set_mix_interpolator_rate()
1555 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) { in wcd934x_set_mix_interpolator_rate()
1564 if (val == (ch->shift + INTn_2_INP_SEL_RX0)) { in wcd934x_set_mix_interpolator_rate()
1572 dev_err(component->dev, in wcd934x_set_mix_interpolator_rate()
1573 "Invalid rate for AIF_PB DAI(%d)\n", in wcd934x_set_mix_interpolator_rate()
1574 dai->id); in wcd934x_set_mix_interpolator_rate()
1575 return -EINVAL; in wcd934x_set_mix_interpolator_rate()
1602 dev_err(dai->dev, "Unsupported sample rate: %d\n", sample_rate); in wcd934x_set_interpolator_rate()
1603 return -EINVAL; in wcd934x_set_interpolator_rate()
1617 u8 rate_val, u32 rate) in wcd934x_set_decimator_rate() argument
1619 struct snd_soc_component *comp = dai->component; in wcd934x_set_decimator_rate()
1624 int decimator = -1; in wcd934x_set_decimator_rate()
1626 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) { in wcd934x_set_decimator_rate()
1627 tx_port = ch->port; in wcd934x_set_decimator_rate()
1628 /* Find the SB TX MUX input - which decimator is connected */ in wcd934x_set_decimator_rate()
1637 shift = ((tx_port - 4) << 1); in wcd934x_set_decimator_rate()
1642 shift = ((tx_port - 8) << 1); in wcd934x_set_decimator_rate()
1656 dev_err(wcd->dev, "Invalid SLIM TX%u port DAI ID:%d\n", in wcd934x_set_decimator_rate()
1657 tx_port, dai->id); in wcd934x_set_decimator_rate()
1658 return -EINVAL; in wcd934x_set_decimator_rate()
1676 decimator = tx_mux_sel - 1; in wcd934x_set_decimator_rate()
1683 dev_err(wcd->dev, "ERROR: Invalid tx_port: %d\n", in wcd934x_set_decimator_rate()
1685 return -EINVAL; in wcd934x_set_decimator_rate()
1701 struct list_head *slim_ch_list = &dai_data->slim_ch_list; in wcd934x_slim_set_hw_params()
1702 struct slim_stream_config *cfg = &dai_data->sconfig; in wcd934x_slim_set_hw_params()
1707 cfg->ch_count = 0; in wcd934x_slim_set_hw_params()
1708 cfg->direction = direction; in wcd934x_slim_set_hw_params()
1709 cfg->port_mask = 0; in wcd934x_slim_set_hw_params()
1713 cfg->ch_count++; in wcd934x_slim_set_hw_params()
1714 payload |= 1 << ch->shift; in wcd934x_slim_set_hw_params()
1715 cfg->port_mask |= BIT(ch->port); in wcd934x_slim_set_hw_params()
1718 cfg->chs = kcalloc(cfg->ch_count, sizeof(unsigned int), GFP_KERNEL); in wcd934x_slim_set_hw_params()
1719 if (!cfg->chs) in wcd934x_slim_set_hw_params()
1720 return -ENOMEM; in wcd934x_slim_set_hw_params()
1724 cfg->chs[i++] = ch->ch_num; in wcd934x_slim_set_hw_params()
1727 ret = regmap_write(wcd->if_regmap, in wcd934x_slim_set_hw_params()
1728 WCD934X_SLIM_PGD_RX_PORT_MULTI_CHNL_0(ch->port), in wcd934x_slim_set_hw_params()
1735 ret = regmap_write(wcd->if_regmap, in wcd934x_slim_set_hw_params()
1736 WCD934X_SLIM_PGD_RX_PORT_CFG(ch->port), in wcd934x_slim_set_hw_params()
1741 ret = regmap_write(wcd->if_regmap, in wcd934x_slim_set_hw_params()
1742 WCD934X_SLIM_PGD_TX_PORT_MULTI_CHNL_0(ch->port), in wcd934x_slim_set_hw_params()
1748 ret = regmap_write(wcd->if_regmap, in wcd934x_slim_set_hw_params()
1749 WCD934X_SLIM_PGD_TX_PORT_MULTI_CHNL_1(ch->port), in wcd934x_slim_set_hw_params()
1755 ret = regmap_write(wcd->if_regmap, in wcd934x_slim_set_hw_params()
1756 WCD934X_SLIM_PGD_TX_PORT_CFG(ch->port), in wcd934x_slim_set_hw_params()
1764 dai_data->sruntime = slim_stream_allocate(wcd->sdev, "WCD934x-SLIM"); in wcd934x_slim_set_hw_params()
1769 dev_err(wcd->dev, "Error Setting slim hw params\n"); in wcd934x_slim_set_hw_params()
1770 kfree(cfg->chs); in wcd934x_slim_set_hw_params()
1771 cfg->chs = NULL; in wcd934x_slim_set_hw_params()
1783 wcd = snd_soc_component_get_drvdata(dai->component); in wcd934x_hw_params()
1785 switch (substream->stream) { in wcd934x_hw_params()
1789 dev_err(wcd->dev, "cannot set sample rate: %u\n", in wcd934x_hw_params()
1795 wcd->dai[dai->id].sconfig.bps = params_width(params); in wcd934x_hw_params()
1798 dev_err(wcd->dev, "Invalid format 0x%x\n", in wcd934x_hw_params()
1800 return -EINVAL; in wcd934x_hw_params()
1828 dev_err(wcd->dev, "Invalid TX sample rate: %d\n", in wcd934x_hw_params()
1830 return -EINVAL; in wcd934x_hw_params()
1837 dev_err(wcd->dev, "Cannot set TX Decimator rate\n"); in wcd934x_hw_params()
1842 wcd->dai[dai->id].sconfig.bps = params_width(params); in wcd934x_hw_params()
1845 dev_err(wcd->dev, "Invalid format 0x%x\n", in wcd934x_hw_params()
1847 return -EINVAL; in wcd934x_hw_params()
1851 dev_err(wcd->dev, "Invalid stream type %d\n", in wcd934x_hw_params()
1852 substream->stream); in wcd934x_hw_params()
1853 return -EINVAL; in wcd934x_hw_params()
1856 wcd->dai[dai->id].sconfig.rate = params_rate(params); in wcd934x_hw_params()
1858 return wcd934x_slim_set_hw_params(wcd, &wcd->dai[dai->id], substream->stream); in wcd934x_hw_params()
1867 wcd = snd_soc_component_get_drvdata(dai->component); in wcd934x_hw_free()
1869 dai_data = &wcd->dai[dai->id]; in wcd934x_hw_free()
1871 kfree(dai_data->sconfig.chs); in wcd934x_hw_free()
1883 wcd = snd_soc_component_get_drvdata(dai->component); in wcd934x_trigger()
1885 dai_data = &wcd->dai[dai->id]; in wcd934x_trigger()
1891 cfg = &dai_data->sconfig; in wcd934x_trigger()
1892 slim_stream_prepare(dai_data->sruntime, cfg); in wcd934x_trigger()
1893 slim_stream_enable(dai_data->sruntime); in wcd934x_trigger()
1898 slim_stream_disable(dai_data->sruntime); in wcd934x_trigger()
1899 slim_stream_unprepare(dai_data->sruntime); in wcd934x_trigger()
1917 wcd = snd_soc_component_get_drvdata(dai->component); in wcd934x_set_channel_map()
1920 dev_err(wcd->dev, "Invalid tx %d or rx %d channel count\n", in wcd934x_set_channel_map()
1922 return -EINVAL; in wcd934x_set_channel_map()
1926 dev_err(wcd->dev, "Invalid tx_slot=%p, rx_slot=%p\n", in wcd934x_set_channel_map()
1928 return -EINVAL; in wcd934x_set_channel_map()
1931 wcd->num_rx_port = rx_num; in wcd934x_set_channel_map()
1933 wcd->rx_chs[i].ch_num = rx_slot[i]; in wcd934x_set_channel_map()
1934 INIT_LIST_HEAD(&wcd->rx_chs[i].list); in wcd934x_set_channel_map()
1937 wcd->num_tx_port = tx_num; in wcd934x_set_channel_map()
1939 wcd->tx_chs[i].ch_num = tx_slot[i]; in wcd934x_set_channel_map()
1940 INIT_LIST_HEAD(&wcd->tx_chs[i].list); in wcd934x_set_channel_map()
1954 wcd = snd_soc_component_get_drvdata(dai->component); in wcd934x_get_channel_map()
1956 switch (dai->id) { in wcd934x_get_channel_map()
1962 dev_err(wcd->dev, "Invalid rx_slot %p or rx_num %p\n", in wcd934x_get_channel_map()
1964 return -EINVAL; in wcd934x_get_channel_map()
1967 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) in wcd934x_get_channel_map()
1968 rx_slot[i++] = ch->ch_num; in wcd934x_get_channel_map()
1976 dev_err(wcd->dev, "Invalid tx_slot %p or tx_num %p\n", in wcd934x_get_channel_map()
1978 return -EINVAL; in wcd934x_get_channel_map()
1981 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) in wcd934x_get_channel_map()
1982 tx_slot[i++] = ch->ch_num; in wcd934x_get_channel_map()
1987 dev_err(wcd->dev, "Invalid DAI ID %x\n", dai->id); in wcd934x_get_channel_map()
2118 regmap_read(wcd->regmap, WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL, &val); in swclk_gate_is_enabled()
2140 struct clk *parent = wcd->extclk; in wcd934x_register_mclk_output()
2141 struct device *dev = wcd->dev; in wcd934x_register_mclk_output()
2142 struct device_node *np = dev->parent->of_node; in wcd934x_register_mclk_output()
2149 if (of_property_read_u32(np, "clock-frequency", &wcd->rate)) in wcd934x_register_mclk_output()
2154 of_property_read_string(np, "clock-output-names", &clk_name); in wcd934x_register_mclk_output()
2161 wcd->hw.init = &init; in wcd934x_register_mclk_output()
2163 hw = &wcd->hw; in wcd934x_register_mclk_output()
2164 ret = devm_clk_hw_register(wcd->dev->parent, hw); in wcd934x_register_mclk_output()
2180 if (of_property_read_u32(dev->parent->of_node, micbias, &mv)) { in wcd934x_get_micbias_val()
2197 return (mv - 1000) / 50; in wcd934x_get_micbias_val()
2203 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_init_dmic()
2206 vout_ctl_1 = wcd934x_get_micbias_val(comp->dev, in wcd934x_init_dmic()
2207 "qcom,micbias1-microvolt", NULL); in wcd934x_init_dmic()
2208 vout_ctl_2 = wcd934x_get_micbias_val(comp->dev, in wcd934x_init_dmic()
2209 "qcom,micbias2-microvolt", in wcd934x_init_dmic()
2210 &wcd->micb2_mv); in wcd934x_init_dmic()
2211 vout_ctl_3 = wcd934x_get_micbias_val(comp->dev, in wcd934x_init_dmic()
2212 "qcom,micbias3-microvolt", NULL); in wcd934x_init_dmic()
2213 vout_ctl_4 = wcd934x_get_micbias_val(comp->dev, in wcd934x_init_dmic()
2214 "qcom,micbias4-microvolt", NULL); in wcd934x_init_dmic()
2225 if (wcd->rate == WCD934X_MCLK_CLK_9P6MHZ) in wcd934x_init_dmic()
2230 wcd->dmic_sample_rate = def_dmic_rate; in wcd934x_init_dmic()
2241 struct regmap *rm = wcd->regmap; in wcd934x_hw_init()
2243 /* set SPKR rate to FS_2P4_3P072 */ in wcd934x_hw_init()
2253 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_comp_init()
2274 regmap_read(wcd->if_regmap, i, &val); in wcd934x_slim_irq_handler()
2284 port_id = j - 16; in wcd934x_slim_irq_handler()
2287 regmap_read(wcd->if_regmap, in wcd934x_slim_irq_handler()
2296 regmap_read(wcd->if_regmap, reg, &int_val); in wcd934x_slim_irq_handler()
2300 dev_err_ratelimited(wcd->dev, in wcd934x_slim_irq_handler()
2305 dev_err_ratelimited(wcd->dev, in wcd934x_slim_irq_handler()
2318 wcd->if_regmap, reg, &int_val); in wcd934x_slim_irq_handler()
2321 regmap_write(wcd->if_regmap, in wcd934x_slim_irq_handler()
2327 dev_err_ratelimited(wcd->dev, in wcd934x_slim_irq_handler()
2331 regmap_write(wcd->if_regmap, in wcd934x_slim_irq_handler()
2361 dev_err(component->dev, "%s: invalid number of buttons: %d\n", in wcd934x_mbhc_program_btn_thr()
2403 int micb_index = micb_num - 1; in wcd934x_micbias_control()
2420 dev_err(component->dev, "%s: Invalid micbias number: %d\n", in wcd934x_micbias_control()
2422 return -EINVAL; in wcd934x_micbias_control()
2424 mutex_lock(&wcd934x->micb_lock); in wcd934x_micbias_control()
2428 wcd934x->pullup_ref[micb_index]++; in wcd934x_micbias_control()
2429 if ((wcd934x->pullup_ref[micb_index] == 1) && in wcd934x_micbias_control()
2430 (wcd934x->micb_ref[micb_index] == 0)) in wcd934x_micbias_control()
2436 if (wcd934x->pullup_ref[micb_index] > 0) in wcd934x_micbias_control()
2437 wcd934x->pullup_ref[micb_index]--; in wcd934x_micbias_control()
2439 if ((wcd934x->pullup_ref[micb_index] == 0) && in wcd934x_micbias_control()
2440 (wcd934x->micb_ref[micb_index] == 0)) in wcd934x_micbias_control()
2445 wcd934x->micb_ref[micb_index]++; in wcd934x_micbias_control()
2446 if (wcd934x->micb_ref[micb_index] == 1) { in wcd934x_micbias_control()
2451 wcd_mbhc_event_notify(wcd934x->mbhc, in wcd934x_micbias_control()
2456 wcd_mbhc_event_notify(wcd934x->mbhc, in wcd934x_micbias_control()
2460 if (wcd934x->micb_ref[micb_index] > 0) in wcd934x_micbias_control()
2461 wcd934x->micb_ref[micb_index]--; in wcd934x_micbias_control()
2463 if ((wcd934x->micb_ref[micb_index] == 0) && in wcd934x_micbias_control()
2464 (wcd934x->pullup_ref[micb_index] > 0)) in wcd934x_micbias_control()
2468 else if ((wcd934x->micb_ref[micb_index] == 0) && in wcd934x_micbias_control()
2469 (wcd934x->pullup_ref[micb_index] == 0)) { in wcd934x_micbias_control()
2471 wcd_mbhc_event_notify(wcd934x->mbhc, in wcd934x_micbias_control()
2477 wcd_mbhc_event_notify(wcd934x->mbhc, in wcd934x_micbias_control()
2481 wcd_mbhc_event_notify(wcd934x->mbhc, in wcd934x_micbias_control()
2486 mutex_unlock(&wcd934x->micb_lock); in wcd934x_micbias_control()
2494 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_mbhc_request_micbias()
2528 return -EINVAL; in wcd934x_get_micb_vout_ctl_val()
2530 return (micb_mv - 1000) / 50; in wcd934x_get_micb_vout_ctl_val()
2553 return -EINVAL; in wcd934x_mbhc_micb_adjust_voltage()
2555 mutex_lock(&wcd934x->micb_lock); in wcd934x_mbhc_micb_adjust_voltage()
2560 * to avoid slow micbias ramp-up or down enable pull-up in wcd934x_mbhc_micb_adjust_voltage()
2561 * momentarily, change the micbias value and then re-enable in wcd934x_mbhc_micb_adjust_voltage()
2571 ret = -EINVAL; in wcd934x_mbhc_micb_adjust_voltage()
2600 mutex_unlock(&wcd934x->micb_lock); in wcd934x_mbhc_micb_adjust_voltage()
2611 return -EINVAL; in wcd934x_mbhc_micb_ctrl_threshold_mic()
2617 if (wcd934x->micb2_mv >= WCD_MBHC_THR_HS_MICB_MV) in wcd934x_mbhc_micb_ctrl_threshold_mic()
2620 micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd934x->micb2_mv; in wcd934x_mbhc_micb_ctrl_threshold_mic()
2640 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x20, 0x20); in wcd934x_mbhc_get_result_params()
2642 regmap_read(wcd934x->regmap, WCD934X_ANA_MBHC_RESULT_2, &val); in wcd934x_mbhc_get_result_params()
2647 regmap_read(wcd934x->regmap, WCD934X_ANA_MBHC_RESULT_1, &val1); in wcd934x_mbhc_get_result_params()
2649 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x20, 0x00); in wcd934x_mbhc_get_result_params()
2657 dev_err(wcd934x->dev, "%s: Impedance detect ramp error, c1=%d, x1=0x%x\n", in wcd934x_mbhc_get_result_params()
2662 denom = (x1 * d1) - (1 << (14 - noff)); in wcd934x_mbhc_get_result_params()
2668 dev_dbg(wcd934x->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%di (milliohm)\n", in wcd934x_mbhc_get_result_params()
2674 regmap_read(wcd934x->regmap, WCD934X_ANA_MBHC_RESULT_1, &val); in wcd934x_mbhc_get_result_params()
2675 regmap_read(wcd934x->regmap, WCD934X_ANA_MBHC_RESULT_2, &val1); in wcd934x_mbhc_get_result_params()
2689 struct wcd934x_codec *wcd934x = dev_get_drvdata(component->dev); in wcd934x_mbhc_zdet_ramp()
2693 WCD934X_ZDET_MAXV_CTL_MASK, zdet_param->ldo_ctl); in wcd934x_mbhc_zdet_ramp()
2695 WCD934X_VTH_MASK, zdet_param->btn5); in wcd934x_mbhc_zdet_ramp()
2697 WCD934X_VTH_MASK, zdet_param->btn6); in wcd934x_mbhc_zdet_ramp()
2699 WCD934X_VTH_MASK, zdet_param->btn7); in wcd934x_mbhc_zdet_ramp()
2701 WCD934X_ZDET_RANGE_CTL_MASK, zdet_param->noff); in wcd934x_mbhc_zdet_ramp()
2703 0x0F, zdet_param->nshift); in wcd934x_mbhc_zdet_ramp()
2708 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x80, 0x80); in wcd934x_mbhc_zdet_ramp()
2709 wcd934x_mbhc_get_result_params(wcd934x, d1_a, zdet_param->noff, &zdet); in wcd934x_mbhc_zdet_ramp()
2710 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x80, 0x00); in wcd934x_mbhc_zdet_ramp()
2718 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x40, 0x40); in wcd934x_mbhc_zdet_ramp()
2719 wcd934x_mbhc_get_result_params(wcd934x, d1_a, zdet_param->noff, &zdet); in wcd934x_mbhc_zdet_ramp()
2720 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x40, 0x00); in wcd934x_mbhc_zdet_ramp()
2738 q1_cal = (10000 - ((q1 & 0x7F) * 25)); in wcd934x_wcd_mbhc_qfuse_cal()
2748 struct wcd934x_codec *wcd934x = dev_get_drvdata(component->dev); in wcd934x_wcd_mbhc_calc_impedance()
2776 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ELECT, 0x80, 0x00); in wcd934x_wcd_mbhc_calc_impedance()
2779 /* For NO-jack, disable L_DET_EN before Z-det measurements */ in wcd934x_wcd_mbhc_calc_impedance()
2780 if (wcd934x->mbhc_cfg.hphl_swh) in wcd934x_wcd_mbhc_calc_impedance()
2781 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_MECH, 0x80, 0x00); in wcd934x_wcd_mbhc_calc_impedance()
2784 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_MECH, 0x01, 0x00); in wcd934x_wcd_mbhc_calc_impedance()
2818 dev_info(component->dev, "%s: impedance on HPH_L = %d(ohms)\n", in wcd934x_wcd_mbhc_calc_impedance()
2825 (zdet_param_ptr->noff == 0x6)) || in wcd934x_wcd_mbhc_calc_impedance()
2850 dev_err(component->dev, "%s: impedance on HPH_R = %d(ohms)\n", in wcd934x_wcd_mbhc_calc_impedance()
2856 dev_dbg(component->dev, in wcd934x_wcd_mbhc_calc_impedance()
2865 dev_dbg(component->dev, in wcd934x_wcd_mbhc_calc_impedance()
2868 wcd_mbhc_set_hph_type(wcd934x->mbhc, WCD_MBHC_HPH_MONO); in wcd934x_wcd_mbhc_calc_impedance()
2887 z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls); in wcd934x_wcd_mbhc_calc_impedance()
2888 z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl)); in wcd934x_wcd_mbhc_calc_impedance()
2890 dev_err(component->dev, "%s: stereo plug type detected\n", in wcd934x_wcd_mbhc_calc_impedance()
2892 wcd_mbhc_set_hph_type(wcd934x->mbhc, WCD_MBHC_HPH_STEREO); in wcd934x_wcd_mbhc_calc_impedance()
2894 dev_err(component->dev, "%s: MONO plug type detected\n", in wcd934x_wcd_mbhc_calc_impedance()
2896 wcd_mbhc_set_hph_type(wcd934x->mbhc, WCD_MBHC_HPH_MONO); in wcd934x_wcd_mbhc_calc_impedance()
2904 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_MECH, 0x01, 0x01); in wcd934x_wcd_mbhc_calc_impedance()
2906 /* For NO-jack, re-enable L_DET_EN after Z-det measurements */ in wcd934x_wcd_mbhc_calc_impedance()
2907 if (wcd934x->mbhc_cfg.hphl_swh) in wcd934x_wcd_mbhc_calc_impedance()
2908 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_MECH, 0x80, 0x80); in wcd934x_wcd_mbhc_calc_impedance()
2913 regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ELECT, 0x80, 0x80); in wcd934x_wcd_mbhc_calc_impedance()
2961 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd->mbhc); in wcd934x_get_hph_type()
2975 mc = (struct soc_mixer_control *)(kcontrol->private_value); in wcd934x_hph_impedance_get()
2976 hphr = mc->shift; in wcd934x_hph_impedance_get()
2977 wcd_mbhc_get_impedance(wcd->mbhc, &zl, &zr); in wcd934x_hph_impedance_get()
2978 dev_dbg(component->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr); in wcd934x_hph_impedance_get()
2979 ucontrol->value.integer.value[0] = hphr ? zr : zl; in wcd934x_hph_impedance_get()
2997 struct wcd934x_ddata *data = dev_get_drvdata(component->dev->parent); in wcd934x_mbhc_init()
2999 struct wcd_mbhc_intr *intr_ids = &wcd->intr_ids; in wcd934x_mbhc_init()
3001 intr_ids->mbhc_sw_intr = regmap_irq_get_virq(data->irq_data, in wcd934x_mbhc_init()
3003 intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(data->irq_data, in wcd934x_mbhc_init()
3005 intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(data->irq_data, in wcd934x_mbhc_init()
3007 intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(data->irq_data, in wcd934x_mbhc_init()
3009 intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(data->irq_data, in wcd934x_mbhc_init()
3011 intr_ids->hph_left_ocp = regmap_irq_get_virq(data->irq_data, in wcd934x_mbhc_init()
3013 intr_ids->hph_right_ocp = regmap_irq_get_virq(data->irq_data, in wcd934x_mbhc_init()
3016 wcd->mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true); in wcd934x_mbhc_init()
3017 if (IS_ERR(wcd->mbhc)) { in wcd934x_mbhc_init()
3018 wcd->mbhc = NULL; in wcd934x_mbhc_init()
3019 return -EINVAL; in wcd934x_mbhc_init()
3034 if (!wcd->mbhc) in wcd934x_mbhc_deinit()
3037 wcd_mbhc_deinit(wcd->mbhc); in wcd934x_mbhc_deinit()
3042 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_comp_probe()
3045 snd_soc_component_init_regmap(component, wcd->regmap); in wcd934x_comp_probe()
3046 wcd->component = component; in wcd934x_comp_probe()
3048 /* Class-H Init*/ in wcd934x_comp_probe()
3049 wcd->clsh_ctrl = wcd_clsh_ctrl_alloc(component, wcd->version); in wcd934x_comp_probe()
3050 if (IS_ERR(wcd->clsh_ctrl)) in wcd934x_comp_probe()
3051 return PTR_ERR(wcd->clsh_ctrl); in wcd934x_comp_probe()
3053 /* Default HPH Mode to Class-H Low HiFi */ in wcd934x_comp_probe()
3054 wcd->hph_mode = CLS_H_LOHIFI; in wcd934x_comp_probe()
3059 INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list); in wcd934x_comp_probe()
3064 dev_err(component->dev, "Failed to Initialize MBHC\n"); in wcd934x_comp_probe()
3071 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_comp_remove()
3074 wcd_clsh_ctrl_free(wcd->clsh_ctrl); in wcd934x_comp_remove()
3081 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_comp_set_sysclk()
3084 wcd->rate = freq; in wcd934x_comp_set_sysclk()
3086 if (wcd->rate == WCD934X_MCLK_CLK_12P288MHZ) in wcd934x_comp_set_sysclk()
3093 return clk_set_rate(wcd->extclk, freq); in wcd934x_comp_set_sysclk()
3138 /* Mask top 2 bits, 7-8 are reserved */ in set_iir_band_coeff()
3149 (struct wcd_iir_filter_ctl *)kcontrol->private_value; in wcd934x_put_iir_band_audio_mixer()
3150 struct soc_bytes_ext *params = &ctl->bytes_ext; in wcd934x_put_iir_band_audio_mixer()
3151 int iir_idx = ctl->iir_idx; in wcd934x_put_iir_band_audio_mixer()
3152 int band_idx = ctl->band_idx; in wcd934x_put_iir_band_audio_mixer()
3156 memcpy(&coeff[0], ucontrol->value.bytes.data, params->max); in wcd934x_put_iir_band_audio_mixer()
3178 (struct wcd_iir_filter_ctl *)kcontrol->private_value; in wcd934x_get_iir_band_audio_mixer()
3179 struct soc_bytes_ext *params = &ctl->bytes_ext; in wcd934x_get_iir_band_audio_mixer()
3180 int iir_idx = ctl->iir_idx; in wcd934x_get_iir_band_audio_mixer()
3181 int band_idx = ctl->band_idx; in wcd934x_get_iir_band_audio_mixer()
3190 memcpy(ucontrol->value.bytes.data, &coeff[0], params->max); in wcd934x_get_iir_band_audio_mixer()
3199 (struct wcd_iir_filter_ctl *)kcontrol->private_value; in wcd934x_iir_filter_info()
3200 struct soc_bytes_ext *params = &ctl->bytes_ext; in wcd934x_iir_filter_info()
3202 ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES; in wcd934x_iir_filter_info()
3203 ucontrol->count = params->max; in wcd934x_iir_filter_info()
3212 int comp = ((struct soc_mixer_control *)kc->private_value)->shift; in wcd934x_compander_get()
3213 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_compander_get()
3215 ucontrol->value.integer.value[0] = wcd->comp_enabled[comp]; in wcd934x_compander_get()
3224 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_compander_set()
3225 int comp = ((struct soc_mixer_control *)kc->private_value)->shift; in wcd934x_compander_set()
3226 int value = ucontrol->value.integer.value[0]; in wcd934x_compander_set()
3229 if (wcd->comp_enabled[comp] == value) in wcd934x_compander_set()
3232 wcd->comp_enabled[comp] = value; in wcd934x_compander_set()
3265 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_rx_hph_mode_get()
3267 ucontrol->value.enumerated.item[0] = wcd->hph_mode; in wcd934x_rx_hph_mode_get()
3276 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_rx_hph_mode_put()
3279 mode_val = ucontrol->value.enumerated.item[0]; in wcd934x_rx_hph_mode_put()
3281 if (mode_val == wcd->hph_mode) in wcd934x_rx_hph_mode_put()
3285 dev_err(wcd->dev, "Invalid HPH Mode, default to ClSH HiFi\n"); in wcd934x_rx_hph_mode_put()
3288 wcd->hph_mode = mode_val; in wcd934x_rx_hph_mode_put()
3298 struct wcd934x_codec *wcd = dev_get_drvdata(dapm->dev); in slim_rx_mux_get()
3300 ucontrol->value.enumerated.item[0] = wcd->rx_port_value[w->shift]; in slim_rx_mux_get()
3323 aif_id = -1; in slim_rx_mux_to_dai_id()
3334 struct wcd934x_codec *wcd = dev_get_drvdata(w->dapm->dev); in slim_rx_mux_put()
3335 struct soc_enum *e = (struct soc_enum *)kc->private_value; in slim_rx_mux_put()
3338 u32 port_id = w->shift; in slim_rx_mux_put()
3341 int prev_mux_idx = wcd->rx_port_value[port_id]; in slim_rx_mux_put()
3344 mux_idx = ucontrol->value.enumerated.item[0]; in slim_rx_mux_put()
3355 list_for_each_entry_safe(ch, c, &wcd->dai[aif_id].slim_ch_list, list) { in slim_rx_mux_put()
3356 if (ch->port == port_id + WCD934X_RX_START) { in slim_rx_mux_put()
3358 list_del_init(&ch->list); in slim_rx_mux_put()
3371 if (list_empty(&wcd->rx_chs[port_id].list)) { in slim_rx_mux_put()
3372 list_add_tail(&wcd->rx_chs[port_id].list, in slim_rx_mux_put()
3373 &wcd->dai[aif_id].slim_ch_list); in slim_rx_mux_put()
3375 dev_err(wcd->dev ,"SLIM_RX%d PORT is busy\n", port_id); in slim_rx_mux_put()
3381 dev_err(wcd->dev, "Unknown AIF %d\n", mux_idx); in slim_rx_mux_put()
3385 wcd->rx_port_value[port_id] = mux_idx; in slim_rx_mux_put()
3386 snd_soc_dapm_mux_update_power(w->dapm, kc, wcd->rx_port_value[port_id], in slim_rx_mux_put()
3391 return -EINVAL; in slim_rx_mux_put()
3397 struct soc_enum *e = (struct soc_enum *)kc->private_value; in wcd934x_int_dem_inp_mux_put()
3402 val = ucontrol->value.enumerated.item[0]; in wcd934x_int_dem_inp_mux_put()
3403 if (e->reg == WCD934X_CDC_RX0_RX_PATH_SEC0) in wcd934x_int_dem_inp_mux_put()
3405 else if (e->reg == WCD934X_CDC_RX1_RX_PATH_SEC0) in wcd934x_int_dem_inp_mux_put()
3407 else if (e->reg == WCD934X_CDC_RX2_RX_PATH_SEC0) in wcd934x_int_dem_inp_mux_put()
3410 return -EINVAL; in wcd934x_int_dem_inp_mux_put()
3429 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in wcd934x_dec_enum_put()
3436 val = ucontrol->value.enumerated.item[0]; in wcd934x_dec_enum_put()
3437 if (val > e->items - 1) in wcd934x_dec_enum_put()
3438 return -EINVAL; in wcd934x_dec_enum_put()
3440 switch (e->reg) { in wcd934x_dec_enum_put()
3442 if (e->shift_l == 0) in wcd934x_dec_enum_put()
3444 else if (e->shift_l == 2) in wcd934x_dec_enum_put()
3446 else if (e->shift_l == 4) in wcd934x_dec_enum_put()
3450 if (e->shift_l == 0) in wcd934x_dec_enum_put()
3452 else if (e->shift_l == 2) in wcd934x_dec_enum_put()
3456 if (e->shift_l == 0) in wcd934x_dec_enum_put()
3458 else if (e->shift_l == 2) in wcd934x_dec_enum_put()
3462 if (e->shift_l == 0) in wcd934x_dec_enum_put()
3464 else if (e->shift_l == 2) in wcd934x_dec_enum_put()
3468 dev_err(comp->dev, "%s: e->reg: 0x%x not expected\n", in wcd934x_dec_enum_put()
3469 __func__, e->reg); in wcd934x_dec_enum_put()
3470 return -EINVAL; in wcd934x_dec_enum_put()
3473 /* ADC: 0, DMIC: 1 */ in wcd934x_dec_enum_put()
3695 SOC_DAPM_ENUM("DMIC MUX0 Mux", tx_dmic_mux0_enum);
3698 SOC_DAPM_ENUM("DMIC MUX1 Mux", tx_dmic_mux1_enum);
3701 SOC_DAPM_ENUM("DMIC MUX2 Mux", tx_dmic_mux2_enum);
3704 SOC_DAPM_ENUM("DMIC MUX3 Mux", tx_dmic_mux3_enum);
3707 SOC_DAPM_ENUM("DMIC MUX4 Mux", tx_dmic_mux4_enum);
3710 SOC_DAPM_ENUM("DMIC MUX5 Mux", tx_dmic_mux5_enum);
3713 SOC_DAPM_ENUM("DMIC MUX6 Mux", tx_dmic_mux6_enum);
3716 SOC_DAPM_ENUM("DMIC MUX7 Mux", tx_dmic_mux7_enum);
3719 SOC_DAPM_ENUM("DMIC MUX8 Mux", tx_dmic_mux8_enum);
3814 struct wcd934x_codec *wcd = dev_get_drvdata(dapm->dev); in slim_tx_mixer_get()
3816 (struct soc_mixer_control *)kc->private_value; in slim_tx_mixer_get()
3817 int port_id = mixer->shift; in slim_tx_mixer_get()
3819 ucontrol->value.integer.value[0] = wcd->tx_port_value[port_id]; in slim_tx_mixer_get()
3828 struct wcd934x_codec *wcd = dev_get_drvdata(widget->dapm->dev); in slim_tx_mixer_put()
3831 (struct soc_mixer_control *)kc->private_value; in slim_tx_mixer_put()
3832 int enable = ucontrol->value.integer.value[0]; in slim_tx_mixer_put()
3834 int dai_id = widget->shift; in slim_tx_mixer_put()
3835 int port_id = mixer->shift; in slim_tx_mixer_put()
3838 if (enable == wcd->tx_port_value[port_id]) in slim_tx_mixer_put()
3842 if (list_empty(&wcd->tx_chs[port_id].list)) { in slim_tx_mixer_put()
3843 list_add_tail(&wcd->tx_chs[port_id].list, in slim_tx_mixer_put()
3844 &wcd->dai[dai_id].slim_ch_list); in slim_tx_mixer_put()
3846 dev_err(wcd->dev ,"SLIM_TX%d PORT is busy\n", port_id); in slim_tx_mixer_put()
3852 list_for_each_entry_safe(ch, c, &wcd->dai[dai_id].slim_ch_list, list) { in slim_tx_mixer_put()
3853 if (ch->port == port_id) { in slim_tx_mixer_put()
3855 list_del_init(&wcd->tx_chs[port_id].list); in slim_tx_mixer_put()
3863 wcd->tx_port_value[port_id] = enable; in slim_tx_mixer_put()
3864 snd_soc_dapm_mixer_update_power(widget->dapm, kc, enable, update); in slim_tx_mixer_put()
3972 -84, 40, digital_gain), /* -84dB min - 40dB max */
3974 -84, 40, digital_gain),
3976 -84, 40, digital_gain),
3978 -84, 40, digital_gain),
3980 -84, 40, digital_gain),
3982 -84, 40, digital_gain),
3984 -84, 40, digital_gain),
3987 -84, 40, digital_gain),
3990 -84, 40, digital_gain),
3993 -84, 40, digital_gain),
3996 -84, 40, digital_gain),
3999 -84, 40, digital_gain),
4002 -84, 40, digital_gain),
4005 -84, 40, digital_gain),
4008 -84, 40, digital_gain),
4010 -84, 40, digital_gain),
4012 -84, 40, digital_gain),
4014 -84, 40, digital_gain),
4016 -84, 40, digital_gain),
4018 -84, 40, digital_gain),
4020 -84, 40, digital_gain),
4022 -84, 40, digital_gain),
4024 -84, 40, digital_gain),
4027 WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, -84, 40,
4030 WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, -84, 40,
4033 WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, -84, 40,
4036 WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, -84, 40,
4039 WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL, -84, 40,
4042 WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL, -84, 40,
4045 WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL, -84, 40,
4048 WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL, -84, 40,
4131 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_codec_enable_int_port()
4134 list_for_each_entry(ch, &dai->slim_ch_list, list) { in wcd934x_codec_enable_int_port()
4135 if (ch->port >= WCD934X_RX_START) { in wcd934x_codec_enable_int_port()
4136 port_num = ch->port - WCD934X_RX_START; in wcd934x_codec_enable_int_port()
4139 port_num = ch->port; in wcd934x_codec_enable_int_port()
4143 regmap_read(wcd->if_regmap, reg, &val); in wcd934x_codec_enable_int_port()
4145 regmap_write(wcd->if_regmap, reg, in wcd934x_codec_enable_int_port()
4153 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_slim()
4155 struct wcd_slim_codec_dai_data *dai = &wcd->dai[w->shift]; in wcd934x_codec_enable_slim()
4243 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_config_compander()
4251 compander = interp_n - 1; in wcd934x_config_compander()
4252 if (!wcd->comp_enabled[compander]) in wcd934x_config_compander()
4300 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_interp_clk()
4301 int interp_idx = w->shift; in wcd934x_codec_enable_interp_clk()
4328 /* Reset rate to 48K*/ in wcd934x_codec_enable_interp_clk()
4341 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_mix_path()
4347 (w->shift * WCD934X_RX_PATH_CTL_OFFSET); in wcd934x_codec_enable_mix_path()
4349 (w->shift * WCD934X_RX_PATH_CTL_OFFSET); in wcd934x_codec_enable_mix_path()
4372 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_set_iir_gain()
4373 int reg = w->reg; in wcd934x_codec_set_iir_gain()
4407 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_main_path()
4410 gain_reg = WCD934X_CDC_RX0_RX_VOL_CTL + (w->shift * in wcd934x_codec_enable_main_path()
4426 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_ear_dac_event()
4427 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_ear_dac_event()
4435 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC, in wcd934x_codec_ear_dac_event()
4440 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA, in wcd934x_codec_ear_dac_event()
4452 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_hphl_dac_event()
4453 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_hphl_dac_event()
4454 int hph_mode = wcd->hph_mode; in wcd934x_codec_hphl_dac_event()
4465 return -EINVAL; in wcd934x_codec_hphl_dac_event()
4477 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC, in wcd934x_codec_hphl_dac_event()
4484 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA, in wcd934x_codec_hphl_dac_event()
4504 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_hphr_dac_event()
4505 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_hphr_dac_event()
4506 int hph_mode = wcd->hph_mode; in wcd934x_codec_hphr_dac_event()
4515 return -EINVAL; in wcd934x_codec_hphr_dac_event()
4527 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC, in wcd934x_codec_hphr_dac_event()
4535 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA, in wcd934x_codec_hphr_dac_event()
4553 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_lineout_dac_event()
4554 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_lineout_dac_event()
4558 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC, in wcd934x_codec_lineout_dac_event()
4562 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA, in wcd934x_codec_lineout_dac_event()
4574 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_hphl_pa()
4608 wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_POST_HPHL_PA_OFF); in wcd934x_codec_enable_hphl_pa()
4627 wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_POST_HPHL_PA_OFF); in wcd934x_codec_enable_hphl_pa()
4638 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_hphr_pa()
4674 wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_PRE_HPHR_PA_OFF); in wcd934x_codec_enable_hphr_pa()
4692 wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_POST_HPHR_PA_OFF); in wcd934x_codec_enable_hphr_pa()
4700 unsigned int dmic, in wcd934x_get_dmic_sample_rate() argument
4715 adc_mux_index - 4; in wcd934x_get_dmic_sample_rate()
4721 & 0xF8) >> 3) - 1; in wcd934x_get_dmic_sample_rate()
4723 if (adc_mux_sel == dmic) { in wcd934x_get_dmic_sample_rate()
4735 dmic_fs = min(wcd->dmic_sample_rate, WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ); in wcd934x_get_dmic_sample_rate()
4739 dmic_fs = wcd->dmic_sample_rate; in wcd934x_get_dmic_sample_rate()
4758 dev_err(comp->dev, in wcd934x_get_dmic_clk_val()
4785 dev_err(comp->dev, in wcd934x_get_dmic_clk_val()
4798 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_dmic()
4799 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_enable_dmic()
4804 unsigned int dmic; in wcd934x_codec_enable_dmic() local
4809 wname = strpbrk(w->name, "012345"); in wcd934x_codec_enable_dmic()
4811 dev_err(comp->dev, "%s: widget not found\n", __func__); in wcd934x_codec_enable_dmic()
4812 return -EINVAL; in wcd934x_codec_enable_dmic()
4815 ret = kstrtouint(wname, 10, &dmic); in wcd934x_codec_enable_dmic()
4817 dev_err(comp->dev, "%s: Invalid DMIC line on the codec\n", in wcd934x_codec_enable_dmic()
4819 return -EINVAL; in wcd934x_codec_enable_dmic()
4822 switch (dmic) { in wcd934x_codec_enable_dmic()
4825 dmic_clk_cnt = &wcd->dmic_0_1_clk_cnt; in wcd934x_codec_enable_dmic()
4830 dmic_clk_cnt = &wcd->dmic_2_3_clk_cnt; in wcd934x_codec_enable_dmic()
4835 dmic_clk_cnt = &wcd->dmic_4_5_clk_cnt; in wcd934x_codec_enable_dmic()
4839 dev_err(comp->dev, "%s: Invalid DMIC Selection\n", in wcd934x_codec_enable_dmic()
4841 return -EINVAL; in wcd934x_codec_enable_dmic()
4846 dmic_sample_rate = wcd934x_get_dmic_sample_rate(comp, dmic, in wcd934x_codec_enable_dmic()
4848 dmic_rate_val = wcd934x_get_dmic_clk_val(comp, wcd->rate, in wcd934x_codec_enable_dmic()
4862 (*dmic_clk_cnt)--; in wcd934x_codec_enable_dmic()
4898 (adc_mux_n - 4); in wcd934x_codec_find_amic_input()
4902 adc_mux_n - 4; in wcd934x_codec_find_amic_input()
4908 adc_mux_n - 4; in wcd934x_codec_find_amic_input()
4911 ((adc_mux_n == 8) ? (adc_mux_n - 8) : in wcd934x_codec_find_amic_input()
4912 (adc_mux_n - 9)); in wcd934x_codec_find_amic_input()
4916 adc_mux_n - 4; in wcd934x_codec_find_amic_input()
4922 adc_mux_n - 4; in wcd934x_codec_find_amic_input()
4928 adc_mux_n - 4; in wcd934x_codec_find_amic_input()
4964 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_dec()
4974 char *wname __free(kfree) = kstrndup(w->name, 15, GFP_KERNEL); in wcd934x_codec_enable_dec()
4976 return -ENOMEM; in wcd934x_codec_enable_dec()
4981 dev_err(comp->dev, "%s: Invalid decimator = %s\n", in wcd934x_codec_enable_dec()
4982 __func__, w->name); in wcd934x_codec_enable_dec()
4983 return -EINVAL; in wcd934x_codec_enable_dec()
4989 dev_err(comp->dev, "%s: decimator index not found\n", in wcd934x_codec_enable_dec()
4991 return -EINVAL; in wcd934x_codec_enable_dec()
4996 dev_err(comp->dev, "%s: Invalid decimator = %s\n", in wcd934x_codec_enable_dec()
4998 return -EINVAL; in wcd934x_codec_enable_dec()
5126 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_adc()
5130 wcd934x_codec_set_tx_hold(comp, w->reg, true); in wcd934x_codec_enable_adc()
5143 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_micbias()
5144 int micb_num = w->shift; in wcd934x_codec_enable_micbias()
5555 SND_SOC_DAPM_MUX("DMIC MUX0", SND_SOC_NOPM, 0, 0, &tx_dmic_mux0),
5556 SND_SOC_DAPM_MUX("DMIC MUX1", SND_SOC_NOPM, 0, 0, &tx_dmic_mux1),
5557 SND_SOC_DAPM_MUX("DMIC MUX2", SND_SOC_NOPM, 0, 0, &tx_dmic_mux2),
5558 SND_SOC_DAPM_MUX("DMIC MUX3", SND_SOC_NOPM, 0, 0, &tx_dmic_mux3),
5559 SND_SOC_DAPM_MUX("DMIC MUX4", SND_SOC_NOPM, 0, 0, &tx_dmic_mux4),
5560 SND_SOC_DAPM_MUX("DMIC MUX5", SND_SOC_NOPM, 0, 0, &tx_dmic_mux5),
5561 SND_SOC_DAPM_MUX("DMIC MUX6", SND_SOC_NOPM, 0, 0, &tx_dmic_mux6),
5562 SND_SOC_DAPM_MUX("DMIC MUX7", SND_SOC_NOPM, 0, 0, &tx_dmic_mux7),
5563 SND_SOC_DAPM_MUX("DMIC MUX8", SND_SOC_NOPM, 0, 0, &tx_dmic_mux8),
5673 /* RX0-RX7 */
5807 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_set_jack()
5810 if (!wcd->mbhc) in wcd934x_codec_set_jack()
5811 return -ENOTSUPP; in wcd934x_codec_set_jack()
5813 if (jack && !wcd->mbhc_started) { in wcd934x_codec_set_jack()
5814 ret = wcd_mbhc_start(wcd->mbhc, &wcd->mbhc_cfg, jack); in wcd934x_codec_set_jack()
5815 wcd->mbhc_started = true; in wcd934x_codec_set_jack()
5816 } else if (wcd->mbhc_started) { in wcd934x_codec_set_jack()
5817 wcd_mbhc_stop(wcd->mbhc); in wcd934x_codec_set_jack()
5818 wcd->mbhc_started = false; in wcd934x_codec_set_jack()
5840 struct device *dev = &wcd->sdev->dev; in wcd934x_codec_parse_data()
5841 struct wcd_mbhc_config *cfg = &wcd->mbhc_cfg; in wcd934x_codec_parse_data()
5844 ifc_dev_np = of_parse_phandle(dev->of_node, "slim-ifc-dev", 0); in wcd934x_codec_parse_data()
5846 return dev_err_probe(dev, -EINVAL, "No Interface device found\n"); in wcd934x_codec_parse_data()
5848 wcd->sidev = of_slim_get_device(wcd->sdev->ctrl, ifc_dev_np); in wcd934x_codec_parse_data()
5850 if (!wcd->sidev) in wcd934x_codec_parse_data()
5851 return dev_err_probe(dev, -EINVAL, "Unable to get SLIM Interface device\n"); in wcd934x_codec_parse_data()
5853 slim_get_logical_addr(wcd->sidev); in wcd934x_codec_parse_data()
5854 wcd->if_regmap = regmap_init_slimbus(wcd->sidev, in wcd934x_codec_parse_data()
5856 if (IS_ERR(wcd->if_regmap)) in wcd934x_codec_parse_data()
5857 return dev_err_probe(dev, PTR_ERR(wcd->if_regmap), in wcd934x_codec_parse_data()
5860 of_property_read_u32(dev->parent->of_node, "qcom,dmic-sample-rate", in wcd934x_codec_parse_data()
5861 &wcd->dmic_sample_rate); in wcd934x_codec_parse_data()
5863 cfg->mbhc_micbias = MIC_BIAS_2; in wcd934x_codec_parse_data()
5864 cfg->anc_micbias = MIC_BIAS_2; in wcd934x_codec_parse_data()
5865 cfg->v_hs_max = WCD_MBHC_HS_V_MAX; in wcd934x_codec_parse_data()
5866 cfg->num_btn = WCD934X_MBHC_MAX_BUTTONS; in wcd934x_codec_parse_data()
5867 cfg->micb_mv = wcd->micb2_mv; in wcd934x_codec_parse_data()
5868 cfg->linein_th = 5000; in wcd934x_codec_parse_data()
5869 cfg->hs_thr = 1700; in wcd934x_codec_parse_data()
5870 cfg->hph_thr = 50; in wcd934x_codec_parse_data()
5880 struct device *dev = &pdev->dev; in wcd934x_codec_probe()
5881 struct wcd934x_ddata *data = dev_get_drvdata(dev->parent); in wcd934x_codec_probe()
5887 return -ENOMEM; in wcd934x_codec_probe()
5889 wcd->dev = dev; in wcd934x_codec_probe()
5890 wcd->regmap = data->regmap; in wcd934x_codec_probe()
5891 wcd->extclk = data->extclk; in wcd934x_codec_probe()
5892 wcd->sdev = to_slim_device(data->dev); in wcd934x_codec_probe()
5893 mutex_init(&wcd->sysclk_mutex); in wcd934x_codec_probe()
5894 mutex_init(&wcd->micb_lock); in wcd934x_codec_probe()
5900 /* set default rate 9P6MHz */ in wcd934x_codec_probe()
5901 regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_MCLK_CFG, in wcd934x_codec_probe()
5904 memcpy(wcd->rx_chs, wcd934x_rx_chs, sizeof(wcd934x_rx_chs)); in wcd934x_codec_probe()
5905 memcpy(wcd->tx_chs, wcd934x_tx_chs, sizeof(wcd934x_tx_chs)); in wcd934x_codec_probe()
5907 irq = regmap_irq_get_virq(data->irq_data, WCD934X_IRQ_SLIMBUS); in wcd934x_codec_probe()
5909 return dev_err_probe(wcd->dev, irq, "Failed to get SLIM IRQ\n"); in wcd934x_codec_probe()
5928 .name = "wcd934x-codec",
5938 .name = "wcd934x-codec",