Lines Matching refs:wcd
23 #include "wcd-clsh-v2.h"
24 #include "wcd-mbhc-v2.h"
97 /* As fine version info cannot be retrieved before wcd probe.
98 * Define three coarse versions for possible future use before wcd probe.
1272 static int wcd934x_set_sido_input_src(struct wcd934x_codec *wcd, int sido_src)
1274 if (sido_src == wcd->sido_input_src)
1278 regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
1283 wcd->sido_input_src = sido_src;
1288 static int wcd934x_enable_ana_bias_and_sysclk(struct wcd934x_codec *wcd)
1290 mutex_lock(&wcd->sysclk_mutex);
1292 if (++wcd->sysclk_users != 1) {
1293 mutex_unlock(&wcd->sysclk_mutex);
1296 mutex_unlock(&wcd->sysclk_mutex);
1298 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1301 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1309 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1311 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1319 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
1322 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
1325 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
1328 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
1330 regmap_update_bits(wcd->regmap,
1334 regmap_update_bits(wcd->regmap,
1338 regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_GATE,
1346 wcd934x_set_sido_input_src(wcd, SIDO_SOURCE_RCO_BG);
1351 static int wcd934x_disable_ana_bias_and_syclk(struct wcd934x_codec *wcd)
1353 mutex_lock(&wcd->sysclk_mutex);
1354 if (--wcd->sysclk_users != 0) {
1355 mutex_unlock(&wcd->sysclk_mutex);
1358 mutex_unlock(&wcd->sysclk_mutex);
1360 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
1363 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1365 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1371 static int __wcd934x_cdc_mclk_enable(struct wcd934x_codec *wcd, bool enable)
1376 ret = clk_prepare_enable(wcd->extclk);
1379 dev_err(wcd->dev, "%s: ext clk enable failed\n",
1383 ret = wcd934x_enable_ana_bias_and_sysclk(wcd);
1387 regmap_read(wcd->regmap, WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL,
1394 wcd934x_disable_ana_bias_and_syclk(wcd);
1395 clk_disable_unprepare(wcd->extclk);
1405 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
1409 return __wcd934x_cdc_mclk_enable(wcd, true);
1411 return __wcd934x_cdc_mclk_enable(wcd, false);
1417 static int wcd934x_get_version(struct wcd934x_codec *wcd)
1424 regmap = wcd->regmap;
1454 wcd->version = ver;
1455 dev_info(wcd->dev, "WCD934X Minor:0x%x Version:0x%x\n", id_minor, ver);
1460 static void wcd934x_enable_efuse_sensing(struct wcd934x_codec *wcd)
1464 __wcd934x_cdc_mclk_enable(wcd, true);
1466 regmap_update_bits(wcd->regmap,
1470 regmap_update_bits(wcd->regmap,
1479 wcd934x_set_sido_input_src(wcd, SIDO_SOURCE_RCO_BG);
1481 rc = regmap_read(wcd->regmap,
1487 __wcd934x_cdc_mclk_enable(wcd, false);
1490 static int wcd934x_swrm_clock(struct wcd934x_codec *wcd, bool enable)
1493 __wcd934x_cdc_mclk_enable(wcd, true);
1494 regmap_update_bits(wcd->regmap,
1499 regmap_update_bits(wcd->regmap,
1502 __wcd934x_cdc_mclk_enable(wcd, false);
1512 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
1517 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
1550 dev_err(wcd->dev,
1569 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
1573 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
1638 struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(comp);
1644 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
1674 dev_err(wcd->dev, "Invalid SLIM TX%u port DAI ID:%d\n",
1701 dev_err(wcd->dev, "ERROR: Invalid tx_port: %d\n",
1715 static int wcd934x_slim_set_hw_params(struct wcd934x_codec *wcd,
1745 ret = regmap_write(wcd->if_regmap,
1753 ret = regmap_write(wcd->if_regmap,
1759 ret = regmap_write(wcd->if_regmap,
1766 ret = regmap_write(wcd->if_regmap,
1773 ret = regmap_write(wcd->if_regmap,
1782 dai_data->sruntime = slim_stream_allocate(wcd->sdev, "WCD934x-SLIM");
1787 dev_err(wcd->dev, "Error Setting slim hw params\n");
1798 struct wcd934x_codec *wcd;
1801 wcd = snd_soc_component_get_drvdata(dai->component);
1807 dev_err(wcd->dev, "cannot set sample rate: %u\n",
1813 wcd->dai[dai->id].sconfig.bps = params_width(params);
1816 dev_err(wcd->dev, "Invalid format 0x%x\n",
1846 dev_err(wcd->dev, "Invalid TX sample rate: %d\n",
1855 dev_err(wcd->dev, "Cannot set TX Decimator rate\n");
1860 wcd->dai[dai->id].sconfig.bps = params_width(params);
1863 dev_err(wcd->dev, "Invalid format 0x%x\n",
1869 dev_err(wcd->dev, "Invalid stream type %d\n",
1874 wcd->dai[dai->id].sconfig.rate = params_rate(params);
1876 return wcd934x_slim_set_hw_params(wcd, &wcd->dai[dai->id], substream->stream);
1883 struct wcd934x_codec *wcd;
1885 wcd = snd_soc_component_get_drvdata(dai->component);
1887 dai_data = &wcd->dai[dai->id];
1898 struct wcd934x_codec *wcd;
1901 wcd = snd_soc_component_get_drvdata(dai->component);
1903 dai_data = &wcd->dai[dai->id];
1930 struct wcd934x_codec *wcd;
1933 wcd = snd_soc_component_get_drvdata(dai->component);
1936 dev_err(wcd->dev, "Invalid tx %d or rx %d channel count\n",
1942 dev_err(wcd->dev, "Invalid tx_slot=%p, rx_slot=%p\n",
1947 wcd->num_rx_port = rx_num;
1949 wcd->rx_chs[i].ch_num = rx_slot[i];
1950 INIT_LIST_HEAD(&wcd->rx_chs[i].list);
1953 wcd->num_tx_port = tx_num;
1955 wcd->tx_chs[i].ch_num = tx_slot[i];
1956 INIT_LIST_HEAD(&wcd->tx_chs[i].list);
1967 struct wcd934x_codec *wcd;
1970 wcd = snd_soc_component_get_drvdata(dai->component);
1978 dev_err(wcd->dev, "Invalid rx_slot %p or rx_num %p\n",
1983 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
1992 dev_err(wcd->dev, "Invalid tx_slot %p or tx_num %p\n",
1997 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
2003 dev_err(wcd->dev, "Invalid DAI ID %x\n", dai->id);
2131 struct wcd934x_codec *wcd = to_wcd934x_codec(hw);
2134 regmap_read(wcd->regmap, WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL, &val);
2154 static struct clk *wcd934x_register_mclk_output(struct wcd934x_codec *wcd)
2156 struct clk *parent = wcd->extclk;
2157 struct device *dev = wcd->dev;
2165 if (of_property_read_u32(np, "clock-frequency", &wcd->rate))
2177 wcd->hw.init = &init;
2179 hw = &wcd->hw;
2180 ret = devm_clk_hw_register(wcd->dev->parent, hw);
2218 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
2223 &wcd->micb1_mv);
2226 &wcd->micb2_mv);
2229 &wcd->micb3_mv);
2232 &wcd->micb4_mv);
2243 if (wcd->rate == WCD934X_MCLK_CLK_9P6MHZ)
2248 wcd->dmic_sample_rate = def_dmic_rate;
2257 static void wcd934x_hw_init(struct wcd934x_codec *wcd)
2259 struct regmap *rm = wcd->regmap;
2271 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
2273 wcd934x_hw_init(wcd);
2274 wcd934x_enable_efuse_sensing(wcd);
2275 wcd934x_get_version(wcd);
2282 struct wcd934x_codec *wcd = data;
2292 regmap_read(wcd->if_regmap, i, &val);
2305 regmap_read(wcd->if_regmap,
2314 regmap_read(wcd->if_regmap, reg, &int_val);
2318 dev_err_ratelimited(wcd->dev,
2323 dev_err_ratelimited(wcd->dev,
2336 wcd->if_regmap, reg, &int_val);
2339 regmap_write(wcd->if_regmap,
2345 dev_err_ratelimited(wcd->dev,
2349 regmap_write(wcd->if_regmap,
2512 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
2516 __wcd934x_cdc_mclk_enable(wcd, true);
2521 __wcd934x_cdc_mclk_enable(wcd, false);
2977 struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(component);
2979 ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd->mbhc);
2991 struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(component);
2995 wcd_mbhc_get_impedance(wcd->mbhc, &zl, &zr);
3016 struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(component);
3017 struct wcd_mbhc_intr *intr_ids = &wcd->intr_ids;
3034 wcd->mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true);
3035 if (IS_ERR(wcd->mbhc)) {
3036 wcd->mbhc = NULL;
3050 struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(component);
3052 if (!wcd->mbhc)
3055 wcd_mbhc_deinit(wcd->mbhc);
3060 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
3063 snd_soc_component_init_regmap(component, wcd->regmap);
3064 wcd->component = component;
3067 wcd->clsh_ctrl = wcd_clsh_ctrl_alloc(component, wcd->version);
3068 if (IS_ERR(wcd->clsh_ctrl))
3069 return PTR_ERR(wcd->clsh_ctrl);
3072 wcd->hph_mode = CLS_H_LOHIFI;
3077 INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list);
3089 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
3092 wcd_clsh_ctrl_free(wcd->clsh_ctrl);
3099 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
3102 wcd->rate = freq;
3104 if (wcd->rate == WCD934X_MCLK_CLK_12P288MHZ)
3111 return clk_set_rate(wcd->extclk, freq);
3231 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
3233 ucontrol->value.integer.value[0] = wcd->comp_enabled[comp];
3242 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
3247 if (wcd->comp_enabled[comp] == value)
3250 wcd->comp_enabled[comp] = value;
3283 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
3285 ucontrol->value.enumerated.item[0] = wcd->hph_mode;
3294 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
3299 if (mode_val == wcd->hph_mode)
3303 dev_err(wcd->dev, "Invalid HPH Mode, default to ClSH HiFi\n");
3306 wcd->hph_mode = mode_val;
3316 struct wcd934x_codec *wcd = dev_get_drvdata(dapm->dev);
3318 ucontrol->value.enumerated.item[0] = wcd->rx_port_value[w->shift];
3352 struct wcd934x_codec *wcd = dev_get_drvdata(w->dapm->dev);
3359 int prev_mux_idx = wcd->rx_port_value[port_id];
3373 list_for_each_entry_safe(ch, c, &wcd->dai[aif_id].slim_ch_list, list) {
3389 if (list_empty(&wcd->rx_chs[port_id].list)) {
3390 list_add_tail(&wcd->rx_chs[port_id].list,
3391 &wcd->dai[aif_id].slim_ch_list);
3393 dev_err(wcd->dev ,"SLIM_RX%d PORT is busy\n", port_id);
3399 dev_err(wcd->dev, "Unknown AIF %d\n", mux_idx);
3403 wcd->rx_port_value[port_id] = mux_idx;
3404 snd_soc_dapm_mux_update_power(w->dapm, kc, wcd->rx_port_value[port_id],
3832 struct wcd934x_codec *wcd = dev_get_drvdata(dapm->dev);
3837 ucontrol->value.integer.value[0] = wcd->tx_port_value[port_id];
3846 struct wcd934x_codec *wcd = dev_get_drvdata(widget->dapm->dev);
3856 if (enable == wcd->tx_port_value[port_id])
3860 if (list_empty(&wcd->tx_chs[port_id].list)) {
3861 list_add_tail(&wcd->tx_chs[port_id].list,
3862 &wcd->dai[dai_id].slim_ch_list);
3864 dev_err(wcd->dev ,"SLIM_TX%d PORT is busy\n", port_id);
3870 list_for_each_entry_safe(ch, c, &wcd->dai[dai_id].slim_ch_list, list) {
3873 list_del_init(&wcd->tx_chs[port_id].list);
3881 wcd->tx_port_value[port_id] = enable;
4149 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
4161 regmap_read(wcd->if_regmap, reg, &val);
4163 regmap_write(wcd->if_regmap, reg,
4172 struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(comp);
4173 struct wcd_slim_codec_dai_data *dai = &wcd->dai[w->shift];
4261 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
4270 if (!wcd->comp_enabled[compander])
4445 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
4453 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
4458 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
4471 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
4472 int hph_mode = wcd->hph_mode;
4495 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
4502 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
4523 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
4524 int hph_mode = wcd->hph_mode;
4545 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
4553 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
4572 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
4576 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
4580 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
4593 struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(comp);
4626 wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_POST_HPHL_PA_OFF);
4645 wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_POST_HPHL_PA_OFF);
4657 struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(comp);
4692 wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_PRE_HPHR_PA_OFF);
4710 wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_POST_HPHR_PA_OFF);
4719 struct wcd934x_codec *wcd)
4753 dmic_fs = min(wcd->dmic_sample_rate, WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ);
4757 dmic_fs = wcd->dmic_sample_rate;
4817 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
4843 dmic_clk_cnt = &wcd->dmic_0_1_clk_cnt;
4848 dmic_clk_cnt = &wcd->dmic_2_3_clk_cnt;
4853 dmic_clk_cnt = &wcd->dmic_4_5_clk_cnt;
4865 wcd);
4866 dmic_rate_val = wcd934x_get_dmic_clk_val(comp, wcd->rate,
5830 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
5833 if (!wcd->mbhc)
5836 if (jack && !wcd->mbhc_started) {
5837 ret = wcd_mbhc_start(wcd->mbhc, &wcd->mbhc_cfg, jack);
5838 wcd->mbhc_started = true;
5839 } else if (wcd->mbhc_started) {
5840 wcd_mbhc_stop(wcd->mbhc);
5841 wcd->mbhc_started = false;
5861 static int wcd934x_codec_parse_data(struct wcd934x_codec *wcd)
5863 struct device *dev = &wcd->sdev->dev;
5864 struct wcd_mbhc_config *cfg = &wcd->mbhc_cfg;
5873 wcd->sidev = of_slim_get_device(wcd->sdev->ctrl, ifc_dev_np);
5875 if (!wcd->sidev) {
5880 slim_get_logical_addr(wcd->sidev);
5881 wcd->if_regmap = regmap_init_slimbus(wcd->sidev,
5883 if (IS_ERR(wcd->if_regmap))
5884 return dev_err_probe(dev, PTR_ERR(wcd->if_regmap),
5888 &wcd->dmic_sample_rate);
5894 cfg->micb_mv = wcd->micb2_mv;
5909 struct wcd934x_codec *wcd;
5912 wcd = devm_kzalloc(dev, sizeof(*wcd), GFP_KERNEL);
5913 if (!wcd)
5916 wcd->dev = dev;
5917 wcd->regmap = data->regmap;
5918 wcd->extclk = data->extclk;
5919 wcd->sdev = to_slim_device(data->dev);
5920 mutex_init(&wcd->sysclk_mutex);
5921 mutex_init(&wcd->micb_lock);
5923 ret = wcd934x_codec_parse_data(wcd);
5925 dev_err(wcd->dev, "Failed to get SLIM IRQ\n");
5930 regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_MCLK_CFG,
5933 memcpy(wcd->rx_chs, wcd934x_rx_chs, sizeof(wcd934x_rx_chs));
5934 memcpy(wcd->tx_chs, wcd934x_tx_chs, sizeof(wcd934x_tx_chs));
5938 return dev_err_probe(wcd->dev, irq, "Failed to get SLIM IRQ\n");
5943 "slim", wcd);
5947 wcd934x_register_mclk_output(wcd);
5948 platform_set_drvdata(pdev, wcd);