Lines Matching +full:amic +full:- +full:delay +full:- +full:ms
1 // SPDX-License-Identifier: GPL-2.0
5 #include <linux/clk-provider.h>
21 #include <sound/soc-dapm.h>
23 #include "wcd-clsh-v2.h"
198 {"ADC MUX" #id, "AMIC", "AMIC MUX" #id }, \
205 {"AMIC MUX" #id, "ADC1", "ADC1"}, \
206 {"AMIC MUX" #id, "ADC2", "ADC2"}, \
207 {"AMIC MUX" #id, "ADC3", "ADC3"}, \
208 {"AMIC MUX" #id, "ADC4", "ADC4"}
416 COMPANDER_5, /* LO3_SE - not used in Tavil */
417 COMPANDER_6, /* LO4_SE - not used in Tavil */
497 .name = "WCD9335-IFC-DEV",
554 static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
570 "Class H Invalid", "Class-H Hi-Fi", "Class-H Low Power", "Class-AB",
571 "Class-H Hi-Fi Low Power"
675 "DMIC", "AMIC", "ANC_FB_TUNE1", "ANC_FB_TUNE2"
1188 if (sido_src == wcd->sido_input_src) in wcd934x_set_sido_input_src()
1192 regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO, in wcd934x_set_sido_input_src()
1197 wcd->sido_input_src = sido_src; in wcd934x_set_sido_input_src()
1204 mutex_lock(&wcd->sysclk_mutex); in wcd934x_enable_ana_bias_and_sysclk()
1206 if (++wcd->sysclk_users != 1) { in wcd934x_enable_ana_bias_and_sysclk()
1207 mutex_unlock(&wcd->sysclk_mutex); in wcd934x_enable_ana_bias_and_sysclk()
1210 mutex_unlock(&wcd->sysclk_mutex); in wcd934x_enable_ana_bias_and_sysclk()
1212 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_enable_ana_bias_and_sysclk()
1215 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_enable_ana_bias_and_sysclk()
1219 * 1ms delay is required after pre-charge is enabled in wcd934x_enable_ana_bias_and_sysclk()
1223 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_enable_ana_bias_and_sysclk()
1225 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_enable_ana_bias_and_sysclk()
1233 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, in wcd934x_enable_ana_bias_and_sysclk()
1236 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, in wcd934x_enable_ana_bias_and_sysclk()
1239 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, in wcd934x_enable_ana_bias_and_sysclk()
1242 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, in wcd934x_enable_ana_bias_and_sysclk()
1244 regmap_update_bits(wcd->regmap, in wcd934x_enable_ana_bias_and_sysclk()
1248 regmap_update_bits(wcd->regmap, in wcd934x_enable_ana_bias_and_sysclk()
1252 regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_GATE, in wcd934x_enable_ana_bias_and_sysclk()
1267 mutex_lock(&wcd->sysclk_mutex); in wcd934x_disable_ana_bias_and_syclk()
1268 if (--wcd->sysclk_users != 0) { in wcd934x_disable_ana_bias_and_syclk()
1269 mutex_unlock(&wcd->sysclk_mutex); in wcd934x_disable_ana_bias_and_syclk()
1272 mutex_unlock(&wcd->sysclk_mutex); in wcd934x_disable_ana_bias_and_syclk()
1274 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG, in wcd934x_disable_ana_bias_and_syclk()
1277 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_disable_ana_bias_and_syclk()
1279 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS, in wcd934x_disable_ana_bias_and_syclk()
1290 ret = clk_prepare_enable(wcd->extclk); in __wcd934x_cdc_mclk_enable()
1293 dev_err(wcd->dev, "%s: ext clk enable failed\n", in __wcd934x_cdc_mclk_enable()
1301 regmap_read(wcd->regmap, WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL, in __wcd934x_cdc_mclk_enable()
1309 clk_disable_unprepare(wcd->extclk); in __wcd934x_cdc_mclk_enable()
1318 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_mclk()
1319 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_enable_mclk()
1338 regmap = wcd->regmap; in wcd934x_get_version()
1368 wcd->version = ver; in wcd934x_get_version()
1369 dev_info(wcd->dev, "WCD934X Minor:0x%x Version:0x%x\n", id_minor, ver); in wcd934x_get_version()
1380 regmap_update_bits(wcd->regmap, in wcd934x_enable_efuse_sensing()
1384 regmap_update_bits(wcd->regmap, in wcd934x_enable_efuse_sensing()
1389 * 5ms sleep required after enabling efuse control in wcd934x_enable_efuse_sensing()
1395 rc = regmap_read(wcd->regmap, in wcd934x_enable_efuse_sensing()
1408 regmap_update_bits(wcd->regmap, in wcd934x_swrm_clock()
1413 regmap_update_bits(wcd->regmap, in wcd934x_swrm_clock()
1425 struct snd_soc_component *comp = dai->component; in wcd934x_set_prim_interpolator_rate()
1426 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_set_prim_interpolator_rate()
1431 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) { in wcd934x_set_prim_interpolator_rate()
1432 inp = ch->shift + INTn_1_INP_SEL_RX0; in wcd934x_set_prim_interpolator_rate()
1464 dev_err(wcd->dev, in wcd934x_set_prim_interpolator_rate()
1482 struct snd_soc_component *component = dai->component; in wcd934x_set_mix_interpolator_rate()
1483 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_set_mix_interpolator_rate()
1487 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) { in wcd934x_set_mix_interpolator_rate()
1496 if (val == (ch->shift + INTn_2_INP_SEL_RX0)) { in wcd934x_set_mix_interpolator_rate()
1504 dev_err(component->dev, in wcd934x_set_mix_interpolator_rate()
1506 dai->id); in wcd934x_set_mix_interpolator_rate()
1507 return -EINVAL; in wcd934x_set_mix_interpolator_rate()
1534 dev_err(dai->dev, "Unsupported sample rate: %d\n", sample_rate); in wcd934x_set_interpolator_rate()
1535 return -EINVAL; in wcd934x_set_interpolator_rate()
1553 struct snd_soc_component *comp = dai->component; in wcd934x_set_decimator_rate()
1558 int decimator = -1; in wcd934x_set_decimator_rate()
1560 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) { in wcd934x_set_decimator_rate()
1561 tx_port = ch->port; in wcd934x_set_decimator_rate()
1562 /* Find the SB TX MUX input - which decimator is connected */ in wcd934x_set_decimator_rate()
1571 shift = ((tx_port - 4) << 1); in wcd934x_set_decimator_rate()
1576 shift = ((tx_port - 8) << 1); in wcd934x_set_decimator_rate()
1590 dev_err(wcd->dev, "Invalid SLIM TX%u port DAI ID:%d\n", in wcd934x_set_decimator_rate()
1591 tx_port, dai->id); in wcd934x_set_decimator_rate()
1592 return -EINVAL; in wcd934x_set_decimator_rate()
1610 decimator = tx_mux_sel - 1; in wcd934x_set_decimator_rate()
1617 dev_err(wcd->dev, "ERROR: Invalid tx_port: %d\n", in wcd934x_set_decimator_rate()
1619 return -EINVAL; in wcd934x_set_decimator_rate()
1635 struct list_head *slim_ch_list = &dai_data->slim_ch_list; in wcd934x_slim_set_hw_params()
1636 struct slim_stream_config *cfg = &dai_data->sconfig; in wcd934x_slim_set_hw_params()
1641 cfg->ch_count = 0; in wcd934x_slim_set_hw_params()
1642 cfg->direction = direction; in wcd934x_slim_set_hw_params()
1643 cfg->port_mask = 0; in wcd934x_slim_set_hw_params()
1647 cfg->ch_count++; in wcd934x_slim_set_hw_params()
1648 payload |= 1 << ch->shift; in wcd934x_slim_set_hw_params()
1649 cfg->port_mask |= BIT(ch->port); in wcd934x_slim_set_hw_params()
1652 cfg->chs = kcalloc(cfg->ch_count, sizeof(unsigned int), GFP_KERNEL); in wcd934x_slim_set_hw_params()
1653 if (!cfg->chs) in wcd934x_slim_set_hw_params()
1654 return -ENOMEM; in wcd934x_slim_set_hw_params()
1658 cfg->chs[i++] = ch->ch_num; in wcd934x_slim_set_hw_params()
1661 ret = regmap_write(wcd->if_regmap, in wcd934x_slim_set_hw_params()
1662 WCD934X_SLIM_PGD_RX_PORT_MULTI_CHNL_0(ch->port), in wcd934x_slim_set_hw_params()
1669 ret = regmap_write(wcd->if_regmap, in wcd934x_slim_set_hw_params()
1670 WCD934X_SLIM_PGD_RX_PORT_CFG(ch->port), in wcd934x_slim_set_hw_params()
1675 ret = regmap_write(wcd->if_regmap, in wcd934x_slim_set_hw_params()
1676 WCD934X_SLIM_PGD_TX_PORT_MULTI_CHNL_0(ch->port), in wcd934x_slim_set_hw_params()
1682 ret = regmap_write(wcd->if_regmap, in wcd934x_slim_set_hw_params()
1683 WCD934X_SLIM_PGD_TX_PORT_MULTI_CHNL_1(ch->port), in wcd934x_slim_set_hw_params()
1689 ret = regmap_write(wcd->if_regmap, in wcd934x_slim_set_hw_params()
1690 WCD934X_SLIM_PGD_TX_PORT_CFG(ch->port), in wcd934x_slim_set_hw_params()
1698 dai_data->sruntime = slim_stream_allocate(wcd->sdev, "WCD934x-SLIM"); in wcd934x_slim_set_hw_params()
1703 dev_err(wcd->dev, "Error Setting slim hw params\n"); in wcd934x_slim_set_hw_params()
1704 kfree(cfg->chs); in wcd934x_slim_set_hw_params()
1705 cfg->chs = NULL; in wcd934x_slim_set_hw_params()
1717 wcd = snd_soc_component_get_drvdata(dai->component); in wcd934x_hw_params()
1719 switch (substream->stream) { in wcd934x_hw_params()
1723 dev_err(wcd->dev, "cannot set sample rate: %u\n", in wcd934x_hw_params()
1729 wcd->dai[dai->id].sconfig.bps = params_width(params); in wcd934x_hw_params()
1732 dev_err(wcd->dev, "Invalid format 0x%x\n", in wcd934x_hw_params()
1734 return -EINVAL; in wcd934x_hw_params()
1762 dev_err(wcd->dev, "Invalid TX sample rate: %d\n", in wcd934x_hw_params()
1764 return -EINVAL; in wcd934x_hw_params()
1771 dev_err(wcd->dev, "Cannot set TX Decimator rate\n"); in wcd934x_hw_params()
1776 wcd->dai[dai->id].sconfig.bps = params_width(params); in wcd934x_hw_params()
1779 dev_err(wcd->dev, "Invalid format 0x%x\n", in wcd934x_hw_params()
1781 return -EINVAL; in wcd934x_hw_params()
1785 dev_err(wcd->dev, "Invalid stream type %d\n", in wcd934x_hw_params()
1786 substream->stream); in wcd934x_hw_params()
1787 return -EINVAL; in wcd934x_hw_params()
1790 wcd->dai[dai->id].sconfig.rate = params_rate(params); in wcd934x_hw_params()
1792 return wcd934x_slim_set_hw_params(wcd, &wcd->dai[dai->id], substream->stream); in wcd934x_hw_params()
1801 wcd = snd_soc_component_get_drvdata(dai->component); in wcd934x_hw_free()
1803 dai_data = &wcd->dai[dai->id]; in wcd934x_hw_free()
1805 kfree(dai_data->sconfig.chs); in wcd934x_hw_free()
1817 wcd = snd_soc_component_get_drvdata(dai->component); in wcd934x_trigger()
1819 dai_data = &wcd->dai[dai->id]; in wcd934x_trigger()
1825 cfg = &dai_data->sconfig; in wcd934x_trigger()
1826 slim_stream_prepare(dai_data->sruntime, cfg); in wcd934x_trigger()
1827 slim_stream_enable(dai_data->sruntime); in wcd934x_trigger()
1832 slim_stream_disable(dai_data->sruntime); in wcd934x_trigger()
1833 slim_stream_unprepare(dai_data->sruntime); in wcd934x_trigger()
1849 wcd = snd_soc_component_get_drvdata(dai->component); in wcd934x_set_channel_map()
1852 dev_err(wcd->dev, "Invalid tx %d or rx %d channel count\n", in wcd934x_set_channel_map()
1854 return -EINVAL; in wcd934x_set_channel_map()
1858 dev_err(wcd->dev, "Invalid tx_slot=%p, rx_slot=%p\n", in wcd934x_set_channel_map()
1860 return -EINVAL; in wcd934x_set_channel_map()
1863 wcd->num_rx_port = rx_num; in wcd934x_set_channel_map()
1865 wcd->rx_chs[i].ch_num = rx_slot[i]; in wcd934x_set_channel_map()
1866 INIT_LIST_HEAD(&wcd->rx_chs[i].list); in wcd934x_set_channel_map()
1869 wcd->num_tx_port = tx_num; in wcd934x_set_channel_map()
1871 wcd->tx_chs[i].ch_num = tx_slot[i]; in wcd934x_set_channel_map()
1872 INIT_LIST_HEAD(&wcd->tx_chs[i].list); in wcd934x_set_channel_map()
1886 wcd = snd_soc_component_get_drvdata(dai->component); in wcd934x_get_channel_map()
1888 switch (dai->id) { in wcd934x_get_channel_map()
1894 dev_err(wcd->dev, "Invalid rx_slot %p or rx_num %p\n", in wcd934x_get_channel_map()
1896 return -EINVAL; in wcd934x_get_channel_map()
1899 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) in wcd934x_get_channel_map()
1900 rx_slot[i++] = ch->ch_num; in wcd934x_get_channel_map()
1908 dev_err(wcd->dev, "Invalid tx_slot %p or tx_num %p\n", in wcd934x_get_channel_map()
1910 return -EINVAL; in wcd934x_get_channel_map()
1913 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) in wcd934x_get_channel_map()
1914 tx_slot[i++] = ch->ch_num; in wcd934x_get_channel_map()
1919 dev_err(wcd->dev, "Invalid DAI ID %x\n", dai->id); in wcd934x_get_channel_map()
2050 regmap_read(wcd->regmap, WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL, &val); in swclk_gate_is_enabled()
2072 struct clk *parent = wcd->extclk; in wcd934x_register_mclk_output()
2073 struct device *dev = wcd->dev; in wcd934x_register_mclk_output()
2074 struct device_node *np = dev->parent->of_node; in wcd934x_register_mclk_output()
2081 if (of_property_read_u32(np, "clock-frequency", &wcd->rate)) in wcd934x_register_mclk_output()
2086 of_property_read_string(np, "clock-output-names", &clk_name); in wcd934x_register_mclk_output()
2093 wcd->hw.init = &init; in wcd934x_register_mclk_output()
2095 hw = &wcd->hw; in wcd934x_register_mclk_output()
2096 ret = clk_hw_register(wcd->dev->parent, hw); in wcd934x_register_mclk_output()
2100 of_clk_add_provider(np, of_clk_src_simple_get, hw->clk); in wcd934x_register_mclk_output()
2109 if (of_property_read_u32(dev->parent->of_node, micbias, &mv)) { in wcd934x_get_micbias_val()
2123 return (mv - 1000) / 50; in wcd934x_get_micbias_val()
2129 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_init_dmic()
2132 vout_ctl_1 = wcd934x_get_micbias_val(comp->dev, in wcd934x_init_dmic()
2133 "qcom,micbias1-microvolt"); in wcd934x_init_dmic()
2134 vout_ctl_2 = wcd934x_get_micbias_val(comp->dev, in wcd934x_init_dmic()
2135 "qcom,micbias2-microvolt"); in wcd934x_init_dmic()
2136 vout_ctl_3 = wcd934x_get_micbias_val(comp->dev, in wcd934x_init_dmic()
2137 "qcom,micbias3-microvolt"); in wcd934x_init_dmic()
2138 vout_ctl_4 = wcd934x_get_micbias_val(comp->dev, in wcd934x_init_dmic()
2139 "qcom,micbias4-microvolt"); in wcd934x_init_dmic()
2150 if (wcd->rate == WCD934X_MCLK_CLK_9P6MHZ) in wcd934x_init_dmic()
2155 wcd->dmic_sample_rate = def_dmic_rate; in wcd934x_init_dmic()
2166 struct regmap *rm = wcd->regmap; in wcd934x_hw_init()
2178 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_comp_init()
2199 regmap_read(wcd->if_regmap, i, &val); in wcd934x_slim_irq_handler()
2209 port_id = j - 16; in wcd934x_slim_irq_handler()
2212 regmap_read(wcd->if_regmap, in wcd934x_slim_irq_handler()
2221 regmap_read(wcd->if_regmap, reg, &int_val); in wcd934x_slim_irq_handler()
2225 dev_err_ratelimited(wcd->dev, in wcd934x_slim_irq_handler()
2230 dev_err_ratelimited(wcd->dev, in wcd934x_slim_irq_handler()
2243 wcd->if_regmap, reg, &int_val); in wcd934x_slim_irq_handler()
2246 regmap_write(wcd->if_regmap, in wcd934x_slim_irq_handler()
2252 dev_err_ratelimited(wcd->dev, in wcd934x_slim_irq_handler()
2256 regmap_write(wcd->if_regmap, in wcd934x_slim_irq_handler()
2267 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_comp_probe()
2270 snd_soc_component_init_regmap(component, wcd->regmap); in wcd934x_comp_probe()
2271 wcd->component = component; in wcd934x_comp_probe()
2273 /* Class-H Init*/ in wcd934x_comp_probe()
2274 wcd->clsh_ctrl = wcd_clsh_ctrl_alloc(component, wcd->version); in wcd934x_comp_probe()
2275 if (IS_ERR(wcd->clsh_ctrl)) in wcd934x_comp_probe()
2276 return PTR_ERR(wcd->clsh_ctrl); in wcd934x_comp_probe()
2278 /* Default HPH Mode to Class-H Low HiFi */ in wcd934x_comp_probe()
2279 wcd->hph_mode = CLS_H_LOHIFI; in wcd934x_comp_probe()
2284 INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list); in wcd934x_comp_probe()
2292 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_comp_remove()
2294 wcd_clsh_ctrl_free(wcd->clsh_ctrl); in wcd934x_comp_remove()
2301 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_comp_set_sysclk()
2304 wcd->rate = freq; in wcd934x_comp_set_sysclk()
2306 if (wcd->rate == WCD934X_MCLK_CLK_12P288MHZ) in wcd934x_comp_set_sysclk()
2313 return clk_set_rate(wcd->extclk, freq); in wcd934x_comp_set_sysclk()
2358 /* Mask top 2 bits, 7-8 are reserved */ in set_iir_band_coeff()
2369 (struct wcd_iir_filter_ctl *)kcontrol->private_value; in wcd934x_put_iir_band_audio_mixer()
2370 struct soc_bytes_ext *params = &ctl->bytes_ext; in wcd934x_put_iir_band_audio_mixer()
2371 int iir_idx = ctl->iir_idx; in wcd934x_put_iir_band_audio_mixer()
2372 int band_idx = ctl->band_idx; in wcd934x_put_iir_band_audio_mixer()
2376 memcpy(&coeff[0], ucontrol->value.bytes.data, params->max); in wcd934x_put_iir_band_audio_mixer()
2398 (struct wcd_iir_filter_ctl *)kcontrol->private_value; in wcd934x_get_iir_band_audio_mixer()
2399 struct soc_bytes_ext *params = &ctl->bytes_ext; in wcd934x_get_iir_band_audio_mixer()
2400 int iir_idx = ctl->iir_idx; in wcd934x_get_iir_band_audio_mixer()
2401 int band_idx = ctl->band_idx; in wcd934x_get_iir_band_audio_mixer()
2410 memcpy(ucontrol->value.bytes.data, &coeff[0], params->max); in wcd934x_get_iir_band_audio_mixer()
2419 (struct wcd_iir_filter_ctl *)kcontrol->private_value; in wcd934x_iir_filter_info()
2420 struct soc_bytes_ext *params = &ctl->bytes_ext; in wcd934x_iir_filter_info()
2422 ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES; in wcd934x_iir_filter_info()
2423 ucontrol->count = params->max; in wcd934x_iir_filter_info()
2432 int comp = ((struct soc_mixer_control *)kc->private_value)->shift; in wcd934x_compander_get()
2433 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_compander_get()
2435 ucontrol->value.integer.value[0] = wcd->comp_enabled[comp]; in wcd934x_compander_get()
2444 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_compander_set()
2445 int comp = ((struct soc_mixer_control *)kc->private_value)->shift; in wcd934x_compander_set()
2446 int value = ucontrol->value.integer.value[0]; in wcd934x_compander_set()
2449 if (wcd->comp_enabled[comp] == value) in wcd934x_compander_set()
2452 wcd->comp_enabled[comp] = value; in wcd934x_compander_set()
2485 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_rx_hph_mode_get()
2487 ucontrol->value.enumerated.item[0] = wcd->hph_mode; in wcd934x_rx_hph_mode_get()
2496 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_rx_hph_mode_put()
2499 mode_val = ucontrol->value.enumerated.item[0]; in wcd934x_rx_hph_mode_put()
2501 if (mode_val == wcd->hph_mode) in wcd934x_rx_hph_mode_put()
2505 dev_err(wcd->dev, "Invalid HPH Mode, default to ClSH HiFi\n"); in wcd934x_rx_hph_mode_put()
2508 wcd->hph_mode = mode_val; in wcd934x_rx_hph_mode_put()
2518 struct wcd934x_codec *wcd = dev_get_drvdata(dapm->dev); in slim_rx_mux_get()
2520 ucontrol->value.enumerated.item[0] = wcd->rx_port_value[w->shift]; in slim_rx_mux_get()
2543 aif_id = -1; in slim_rx_mux_to_dai_id()
2554 struct wcd934x_codec *wcd = dev_get_drvdata(w->dapm->dev); in slim_rx_mux_put()
2555 struct soc_enum *e = (struct soc_enum *)kc->private_value; in slim_rx_mux_put()
2558 u32 port_id = w->shift; in slim_rx_mux_put()
2561 int prev_mux_idx = wcd->rx_port_value[port_id]; in slim_rx_mux_put()
2564 mux_idx = ucontrol->value.enumerated.item[0]; in slim_rx_mux_put()
2575 list_for_each_entry_safe(ch, c, &wcd->dai[aif_id].slim_ch_list, list) { in slim_rx_mux_put()
2576 if (ch->port == port_id + WCD934X_RX_START) { in slim_rx_mux_put()
2578 list_del_init(&ch->list); in slim_rx_mux_put()
2591 if (list_empty(&wcd->rx_chs[port_id].list)) { in slim_rx_mux_put()
2592 list_add_tail(&wcd->rx_chs[port_id].list, in slim_rx_mux_put()
2593 &wcd->dai[aif_id].slim_ch_list); in slim_rx_mux_put()
2595 dev_err(wcd->dev ,"SLIM_RX%d PORT is busy\n", port_id); in slim_rx_mux_put()
2601 dev_err(wcd->dev, "Unknown AIF %d\n", mux_idx); in slim_rx_mux_put()
2605 wcd->rx_port_value[port_id] = mux_idx; in slim_rx_mux_put()
2606 snd_soc_dapm_mux_update_power(w->dapm, kc, wcd->rx_port_value[port_id], in slim_rx_mux_put()
2611 return -EINVAL; in slim_rx_mux_put()
2617 struct soc_enum *e = (struct soc_enum *)kc->private_value; in wcd934x_int_dem_inp_mux_put()
2622 val = ucontrol->value.enumerated.item[0]; in wcd934x_int_dem_inp_mux_put()
2623 if (e->reg == WCD934X_CDC_RX0_RX_PATH_SEC0) in wcd934x_int_dem_inp_mux_put()
2625 else if (e->reg == WCD934X_CDC_RX1_RX_PATH_SEC0) in wcd934x_int_dem_inp_mux_put()
2627 else if (e->reg == WCD934X_CDC_RX2_RX_PATH_SEC0) in wcd934x_int_dem_inp_mux_put()
2630 return -EINVAL; in wcd934x_int_dem_inp_mux_put()
2632 /* Set Look Ahead Delay */ in wcd934x_int_dem_inp_mux_put()
2651 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in wcd934x_dec_enum_put()
2658 val = ucontrol->value.enumerated.item[0]; in wcd934x_dec_enum_put()
2659 if (val > e->items - 1) in wcd934x_dec_enum_put()
2660 return -EINVAL; in wcd934x_dec_enum_put()
2662 switch (e->reg) { in wcd934x_dec_enum_put()
2664 if (e->shift_l == 0) in wcd934x_dec_enum_put()
2666 else if (e->shift_l == 2) in wcd934x_dec_enum_put()
2668 else if (e->shift_l == 4) in wcd934x_dec_enum_put()
2672 if (e->shift_l == 0) in wcd934x_dec_enum_put()
2674 else if (e->shift_l == 2) in wcd934x_dec_enum_put()
2678 if (e->shift_l == 0) in wcd934x_dec_enum_put()
2680 else if (e->shift_l == 2) in wcd934x_dec_enum_put()
2684 if (e->shift_l == 0) in wcd934x_dec_enum_put()
2686 else if (e->shift_l == 2) in wcd934x_dec_enum_put()
2690 dev_err(comp->dev, "%s: e->reg: 0x%x not expected\n", in wcd934x_dec_enum_put()
2691 __func__, e->reg); in wcd934x_dec_enum_put()
2692 return -EINVAL; in wcd934x_dec_enum_put()
2944 SOC_DAPM_ENUM("AMIC MUX0 Mux", tx_amic_mux0_enum);
2947 SOC_DAPM_ENUM("AMIC MUX1 Mux", tx_amic_mux1_enum);
2950 SOC_DAPM_ENUM("AMIC MUX2 Mux", tx_amic_mux2_enum);
2953 SOC_DAPM_ENUM("AMIC MUX3 Mux", tx_amic_mux3_enum);
2956 SOC_DAPM_ENUM("AMIC MUX4 Mux", tx_amic_mux4_enum);
2959 SOC_DAPM_ENUM("AMIC MUX5 Mux", tx_amic_mux5_enum);
2962 SOC_DAPM_ENUM("AMIC MUX6 Mux", tx_amic_mux6_enum);
2965 SOC_DAPM_ENUM("AMIC MUX7 Mux", tx_amic_mux7_enum);
2968 SOC_DAPM_ENUM("AMIC MUX8 Mux", tx_amic_mux8_enum);
3036 struct wcd934x_codec *wcd = dev_get_drvdata(dapm->dev); in slim_tx_mixer_get()
3038 (struct soc_mixer_control *)kc->private_value; in slim_tx_mixer_get()
3039 int port_id = mixer->shift; in slim_tx_mixer_get()
3041 ucontrol->value.integer.value[0] = wcd->tx_port_value[port_id]; in slim_tx_mixer_get()
3050 struct wcd934x_codec *wcd = dev_get_drvdata(widget->dapm->dev); in slim_tx_mixer_put()
3053 (struct soc_mixer_control *)kc->private_value; in slim_tx_mixer_put()
3054 int enable = ucontrol->value.integer.value[0]; in slim_tx_mixer_put()
3056 int dai_id = widget->shift; in slim_tx_mixer_put()
3057 int port_id = mixer->shift; in slim_tx_mixer_put()
3060 if (enable == wcd->tx_port_value[port_id]) in slim_tx_mixer_put()
3064 if (list_empty(&wcd->tx_chs[port_id].list)) { in slim_tx_mixer_put()
3065 list_add_tail(&wcd->tx_chs[port_id].list, in slim_tx_mixer_put()
3066 &wcd->dai[dai_id].slim_ch_list); in slim_tx_mixer_put()
3068 dev_err(wcd->dev ,"SLIM_TX%d PORT is busy\n", port_id); in slim_tx_mixer_put()
3074 list_for_each_entry_safe(ch, c, &wcd->dai[dai_id].slim_ch_list, list) { in slim_tx_mixer_put()
3075 if (ch->port == port_id) { in slim_tx_mixer_put()
3077 list_del_init(&wcd->tx_chs[port_id].list); in slim_tx_mixer_put()
3085 wcd->tx_port_value[port_id] = enable; in slim_tx_mixer_put()
3086 snd_soc_dapm_mixer_update_power(widget->dapm, kc, enable, update); in slim_tx_mixer_put()
3194 -84, 40, digital_gain), /* -84dB min - 40dB max */
3196 -84, 40, digital_gain),
3198 -84, 40, digital_gain),
3200 -84, 40, digital_gain),
3202 -84, 40, digital_gain),
3204 -84, 40, digital_gain),
3206 -84, 40, digital_gain),
3209 -84, 40, digital_gain),
3212 -84, 40, digital_gain),
3215 -84, 40, digital_gain),
3218 -84, 40, digital_gain),
3221 -84, 40, digital_gain),
3224 -84, 40, digital_gain),
3227 -84, 40, digital_gain),
3230 -84, 40, digital_gain),
3232 -84, 40, digital_gain),
3234 -84, 40, digital_gain),
3236 -84, 40, digital_gain),
3238 -84, 40, digital_gain),
3240 -84, 40, digital_gain),
3242 -84, 40, digital_gain),
3244 -84, 40, digital_gain),
3246 -84, 40, digital_gain),
3249 WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, -84, 40,
3252 WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, -84, 40,
3255 WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, -84, 40,
3258 WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, -84, 40,
3261 WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL, -84, 40,
3264 WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL, -84, 40,
3267 WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL, -84, 40,
3270 WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL, -84, 40,
3353 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev); in wcd934x_codec_enable_int_port()
3356 list_for_each_entry(ch, &dai->slim_ch_list, list) { in wcd934x_codec_enable_int_port()
3357 if (ch->port >= WCD934X_RX_START) { in wcd934x_codec_enable_int_port()
3358 port_num = ch->port - WCD934X_RX_START; in wcd934x_codec_enable_int_port()
3361 port_num = ch->port; in wcd934x_codec_enable_int_port()
3365 regmap_read(wcd->if_regmap, reg, &val); in wcd934x_codec_enable_int_port()
3367 regmap_write(wcd->if_regmap, reg, in wcd934x_codec_enable_int_port()
3375 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_slim()
3377 struct wcd_slim_codec_dai_data *dai = &wcd->dai[w->shift]; in wcd934x_codec_enable_slim()
3465 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_config_compander()
3473 compander = interp_n - 1; in wcd934x_config_compander()
3474 if (!wcd->comp_enabled[compander]) in wcd934x_config_compander()
3522 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_interp_clk()
3523 int interp_idx = w->shift; in wcd934x_codec_enable_interp_clk()
3563 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_mix_path()
3569 (w->shift * WCD934X_RX_PATH_CTL_OFFSET); in wcd934x_codec_enable_mix_path()
3571 (w->shift * WCD934X_RX_PATH_CTL_OFFSET); in wcd934x_codec_enable_mix_path()
3594 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_set_iir_gain()
3595 int reg = w->reg; in wcd934x_codec_set_iir_gain()
3629 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_main_path()
3632 gain_reg = WCD934X_CDC_RX0_RX_VOL_CTL + (w->shift * in wcd934x_codec_enable_main_path()
3648 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_ear_dac_event()
3649 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_ear_dac_event()
3657 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC, in wcd934x_codec_ear_dac_event()
3662 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA, in wcd934x_codec_ear_dac_event()
3674 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_hphl_dac_event()
3675 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_hphl_dac_event()
3676 int hph_mode = wcd->hph_mode; in wcd934x_codec_hphl_dac_event()
3687 return -EINVAL; in wcd934x_codec_hphl_dac_event()
3699 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC, in wcd934x_codec_hphl_dac_event()
3706 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA, in wcd934x_codec_hphl_dac_event()
3726 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_hphr_dac_event()
3727 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_hphr_dac_event()
3728 int hph_mode = wcd->hph_mode; in wcd934x_codec_hphr_dac_event()
3737 return -EINVAL; in wcd934x_codec_hphr_dac_event()
3749 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC, in wcd934x_codec_hphr_dac_event()
3757 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA, in wcd934x_codec_hphr_dac_event()
3775 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_lineout_dac_event()
3776 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_lineout_dac_event()
3780 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC, in wcd934x_codec_lineout_dac_event()
3784 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA, in wcd934x_codec_lineout_dac_event()
3796 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_hphl_pa()
3801 * 7ms sleep is required after PA is enabled as per in wcd934x_codec_enable_hphl_pa()
3803 * 20ms delay is needed. in wcd934x_codec_enable_hphl_pa()
3843 * 5ms sleep is required after PA disable. If compander is in wcd934x_codec_enable_hphl_pa()
3844 * disabled, then 20ms delay is needed after PA disable. in wcd934x_codec_enable_hphl_pa()
3857 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_hphr_pa()
3862 * 7ms sleep is required after PA is enabled as per in wcd934x_codec_enable_hphr_pa()
3864 * 20ms delay is needed. in wcd934x_codec_enable_hphr_pa()
3905 * 5ms sleep is required after PA disable. If compander is in wcd934x_codec_enable_hphr_pa()
3906 * disabled, then 20ms delay is needed after PA disable. in wcd934x_codec_enable_hphr_pa()
3931 adc_mux_index - 4; in wcd934x_get_dmic_sample_rate()
3937 & 0xF8) >> 3) - 1; in wcd934x_get_dmic_sample_rate()
3951 if (wcd->dmic_sample_rate <= in wcd934x_get_dmic_sample_rate()
3953 dmic_fs = wcd->dmic_sample_rate; in wcd934x_get_dmic_sample_rate()
3959 dmic_fs = wcd->dmic_sample_rate; in wcd934x_get_dmic_sample_rate()
3978 dev_err(comp->dev, in wcd934x_get_dmic_clk_val()
4005 dev_err(comp->dev, in wcd934x_get_dmic_clk_val()
4018 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_dmic()
4019 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev); in wcd934x_codec_enable_dmic()
4029 wname = strpbrk(w->name, "012345"); in wcd934x_codec_enable_dmic()
4031 dev_err(comp->dev, "%s: widget not found\n", __func__); in wcd934x_codec_enable_dmic()
4032 return -EINVAL; in wcd934x_codec_enable_dmic()
4037 dev_err(comp->dev, "%s: Invalid DMIC line on the codec\n", in wcd934x_codec_enable_dmic()
4039 return -EINVAL; in wcd934x_codec_enable_dmic()
4045 dmic_clk_cnt = &wcd->dmic_0_1_clk_cnt; in wcd934x_codec_enable_dmic()
4050 dmic_clk_cnt = &wcd->dmic_2_3_clk_cnt; in wcd934x_codec_enable_dmic()
4055 dmic_clk_cnt = &wcd->dmic_4_5_clk_cnt; in wcd934x_codec_enable_dmic()
4059 dev_err(comp->dev, "%s: Invalid DMIC Selection\n", in wcd934x_codec_enable_dmic()
4061 return -EINVAL; in wcd934x_codec_enable_dmic()
4068 dmic_rate_val = wcd934x_get_dmic_clk_val(comp, wcd->rate, in wcd934x_codec_enable_dmic()
4082 (*dmic_clk_cnt)--; in wcd934x_codec_enable_dmic()
4118 (adc_mux_n - 4); in wcd934x_codec_find_amic_input()
4122 adc_mux_n - 4; in wcd934x_codec_find_amic_input()
4128 adc_mux_n - 4; in wcd934x_codec_find_amic_input()
4131 ((adc_mux_n == 8) ? (adc_mux_n - 8) : in wcd934x_codec_find_amic_input()
4132 (adc_mux_n - 9)); in wcd934x_codec_find_amic_input()
4136 adc_mux_n - 4; in wcd934x_codec_find_amic_input()
4142 adc_mux_n - 4; in wcd934x_codec_find_amic_input()
4148 adc_mux_n - 4; in wcd934x_codec_find_amic_input()
4160 int amic) in wcd934x_codec_get_amic_pwlvl_reg() argument
4164 switch (amic) { in wcd934x_codec_get_amic_pwlvl_reg()
4184 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_dec()
4195 widget_name = kstrndup(w->name, 15, GFP_KERNEL); in wcd934x_codec_enable_dec()
4197 return -ENOMEM; in wcd934x_codec_enable_dec()
4202 dev_err(comp->dev, "%s: Invalid decimator = %s\n", in wcd934x_codec_enable_dec()
4203 __func__, w->name); in wcd934x_codec_enable_dec()
4204 ret = -EINVAL; in wcd934x_codec_enable_dec()
4211 dev_err(comp->dev, "%s: decimator index not found\n", in wcd934x_codec_enable_dec()
4213 ret = -EINVAL; in wcd934x_codec_enable_dec()
4219 dev_err(comp->dev, "%s: Invalid decimator = %s\n", in wcd934x_codec_enable_dec()
4221 ret = -EINVAL; in wcd934x_codec_enable_dec()
4273 * Minimum 1 clk cycle delay is required as per in wcd934x_codec_enable_dec()
4298 * Minimum 1 clk cycle delay is required as per in wcd934x_codec_enable_dec()
4351 struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm); in wcd934x_codec_enable_adc()
4355 wcd934x_codec_set_tx_hold(comp, w->reg, true); in wcd934x_codec_enable_adc()
4766 SND_SOC_DAPM_MUX("AMIC MUX0", SND_SOC_NOPM, 0, 0, &tx_amic_mux0),
4767 SND_SOC_DAPM_MUX("AMIC MUX1", SND_SOC_NOPM, 0, 0, &tx_amic_mux1),
4768 SND_SOC_DAPM_MUX("AMIC MUX2", SND_SOC_NOPM, 0, 0, &tx_amic_mux2),
4769 SND_SOC_DAPM_MUX("AMIC MUX3", SND_SOC_NOPM, 0, 0, &tx_amic_mux3),
4770 SND_SOC_DAPM_MUX("AMIC MUX4", SND_SOC_NOPM, 0, 0, &tx_amic_mux4),
4771 SND_SOC_DAPM_MUX("AMIC MUX5", SND_SOC_NOPM, 0, 0, &tx_amic_mux5),
4772 SND_SOC_DAPM_MUX("AMIC MUX6", SND_SOC_NOPM, 0, 0, &tx_amic_mux6),
4773 SND_SOC_DAPM_MUX("AMIC MUX7", SND_SOC_NOPM, 0, 0, &tx_amic_mux7),
4774 SND_SOC_DAPM_MUX("AMIC MUX8", SND_SOC_NOPM, 0, 0, &tx_amic_mux8),
4871 /* RX0-RX7 */
5016 struct device *dev = &wcd->sdev->dev; in wcd934x_codec_parse_data()
5019 ifc_dev_np = of_parse_phandle(dev->of_node, "slim-ifc-dev", 0); in wcd934x_codec_parse_data()
5022 return -EINVAL; in wcd934x_codec_parse_data()
5025 wcd->sidev = of_slim_get_device(wcd->sdev->ctrl, ifc_dev_np); in wcd934x_codec_parse_data()
5027 if (!wcd->sidev) { in wcd934x_codec_parse_data()
5029 return -EINVAL; in wcd934x_codec_parse_data()
5032 slim_get_logical_addr(wcd->sidev); in wcd934x_codec_parse_data()
5033 wcd->if_regmap = regmap_init_slimbus(wcd->sidev, in wcd934x_codec_parse_data()
5035 if (IS_ERR(wcd->if_regmap)) { in wcd934x_codec_parse_data()
5037 return PTR_ERR(wcd->if_regmap); in wcd934x_codec_parse_data()
5040 of_property_read_u32(dev->parent->of_node, "qcom,dmic-sample-rate", in wcd934x_codec_parse_data()
5041 &wcd->dmic_sample_rate); in wcd934x_codec_parse_data()
5048 struct wcd934x_ddata *data = dev_get_drvdata(pdev->dev.parent); in wcd934x_codec_probe()
5050 struct device *dev = &pdev->dev; in wcd934x_codec_probe()
5053 wcd = devm_kzalloc(&pdev->dev, sizeof(*wcd), GFP_KERNEL); in wcd934x_codec_probe()
5055 return -ENOMEM; in wcd934x_codec_probe()
5057 wcd->dev = dev; in wcd934x_codec_probe()
5058 wcd->regmap = data->regmap; in wcd934x_codec_probe()
5059 wcd->extclk = data->extclk; in wcd934x_codec_probe()
5060 wcd->sdev = to_slim_device(data->dev); in wcd934x_codec_probe()
5061 mutex_init(&wcd->sysclk_mutex); in wcd934x_codec_probe()
5065 dev_err(wcd->dev, "Failed to get SLIM IRQ\n"); in wcd934x_codec_probe()
5070 regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_MCLK_CFG, in wcd934x_codec_probe()
5073 memcpy(wcd->rx_chs, wcd934x_rx_chs, sizeof(wcd934x_rx_chs)); in wcd934x_codec_probe()
5074 memcpy(wcd->tx_chs, wcd934x_tx_chs, sizeof(wcd934x_tx_chs)); in wcd934x_codec_probe()
5076 irq = regmap_irq_get_virq(data->irq_data, WCD934X_IRQ_SLIMBUS); in wcd934x_codec_probe()
5078 dev_err(wcd->dev, "Failed to get SLIM IRQ\n"); in wcd934x_codec_probe()
5101 .name = "wcd934x-codec",
5111 .name = "wcd934x-codec",
5115 MODULE_ALIAS("platform:wcd934x-codec");