Lines Matching refs:wcd
23 #include "wcd-clsh-v2.h"
96 /* As fine version info cannot be retrieved before wcd probe.
97 * Define three coarse versions for possible future use before wcd probe.
1186 static int wcd934x_set_sido_input_src(struct wcd934x_codec *wcd, int sido_src)
1188 if (sido_src == wcd->sido_input_src)
1192 regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
1197 wcd->sido_input_src = sido_src;
1202 static int wcd934x_enable_ana_bias_and_sysclk(struct wcd934x_codec *wcd)
1204 mutex_lock(&wcd->sysclk_mutex);
1206 if (++wcd->sysclk_users != 1) {
1207 mutex_unlock(&wcd->sysclk_mutex);
1210 mutex_unlock(&wcd->sysclk_mutex);
1212 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1215 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1223 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1225 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1233 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
1236 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
1239 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
1242 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
1244 regmap_update_bits(wcd->regmap,
1248 regmap_update_bits(wcd->regmap,
1252 regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_GATE,
1260 wcd934x_set_sido_input_src(wcd, SIDO_SOURCE_RCO_BG);
1265 static int wcd934x_disable_ana_bias_and_syclk(struct wcd934x_codec *wcd)
1267 mutex_lock(&wcd->sysclk_mutex);
1268 if (--wcd->sysclk_users != 0) {
1269 mutex_unlock(&wcd->sysclk_mutex);
1272 mutex_unlock(&wcd->sysclk_mutex);
1274 regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
1277 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1279 regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
1285 static int __wcd934x_cdc_mclk_enable(struct wcd934x_codec *wcd, bool enable)
1290 ret = clk_prepare_enable(wcd->extclk);
1293 dev_err(wcd->dev, "%s: ext clk enable failed\n",
1297 ret = wcd934x_enable_ana_bias_and_sysclk(wcd);
1301 regmap_read(wcd->regmap, WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL,
1308 wcd934x_disable_ana_bias_and_syclk(wcd);
1309 clk_disable_unprepare(wcd->extclk);
1319 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
1323 return __wcd934x_cdc_mclk_enable(wcd, true);
1325 return __wcd934x_cdc_mclk_enable(wcd, false);
1331 static int wcd934x_get_version(struct wcd934x_codec *wcd)
1338 regmap = wcd->regmap;
1368 wcd->version = ver;
1369 dev_info(wcd->dev, "WCD934X Minor:0x%x Version:0x%x\n", id_minor, ver);
1374 static void wcd934x_enable_efuse_sensing(struct wcd934x_codec *wcd)
1378 __wcd934x_cdc_mclk_enable(wcd, true);
1380 regmap_update_bits(wcd->regmap,
1384 regmap_update_bits(wcd->regmap,
1393 wcd934x_set_sido_input_src(wcd, SIDO_SOURCE_RCO_BG);
1395 rc = regmap_read(wcd->regmap,
1401 __wcd934x_cdc_mclk_enable(wcd, false);
1404 static int wcd934x_swrm_clock(struct wcd934x_codec *wcd, bool enable)
1407 __wcd934x_cdc_mclk_enable(wcd, true);
1408 regmap_update_bits(wcd->regmap,
1413 regmap_update_bits(wcd->regmap,
1416 __wcd934x_cdc_mclk_enable(wcd, false);
1426 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
1431 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
1464 dev_err(wcd->dev,
1483 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
1487 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
1554 struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(comp);
1560 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
1590 dev_err(wcd->dev, "Invalid SLIM TX%u port DAI ID:%d\n",
1617 dev_err(wcd->dev, "ERROR: Invalid tx_port: %d\n",
1631 static int wcd934x_slim_set_hw_params(struct wcd934x_codec *wcd,
1661 ret = regmap_write(wcd->if_regmap,
1669 ret = regmap_write(wcd->if_regmap,
1675 ret = regmap_write(wcd->if_regmap,
1682 ret = regmap_write(wcd->if_regmap,
1689 ret = regmap_write(wcd->if_regmap,
1698 dai_data->sruntime = slim_stream_allocate(wcd->sdev, "WCD934x-SLIM");
1703 dev_err(wcd->dev, "Error Setting slim hw params\n");
1714 struct wcd934x_codec *wcd;
1717 wcd = snd_soc_component_get_drvdata(dai->component);
1723 dev_err(wcd->dev, "cannot set sample rate: %u\n",
1729 wcd->dai[dai->id].sconfig.bps = params_width(params);
1732 dev_err(wcd->dev, "Invalid format 0x%x\n",
1762 dev_err(wcd->dev, "Invalid TX sample rate: %d\n",
1771 dev_err(wcd->dev, "Cannot set TX Decimator rate\n");
1776 wcd->dai[dai->id].sconfig.bps = params_width(params);
1779 dev_err(wcd->dev, "Invalid format 0x%x\n",
1785 dev_err(wcd->dev, "Invalid stream type %d\n",
1790 wcd->dai[dai->id].sconfig.rate = params_rate(params);
1792 return wcd934x_slim_set_hw_params(wcd, &wcd->dai[dai->id], substream->stream);
1799 struct wcd934x_codec *wcd;
1801 wcd = snd_soc_component_get_drvdata(dai->component);
1803 dai_data = &wcd->dai[dai->id];
1814 struct wcd934x_codec *wcd;
1817 wcd = snd_soc_component_get_drvdata(dai->component);
1819 dai_data = &wcd->dai[dai->id];
1846 struct wcd934x_codec *wcd;
1849 wcd = snd_soc_component_get_drvdata(dai->component);
1852 dev_err(wcd->dev, "Invalid tx %d or rx %d channel count\n",
1858 dev_err(wcd->dev, "Invalid tx_slot=%p, rx_slot=%p\n",
1863 wcd->num_rx_port = rx_num;
1865 wcd->rx_chs[i].ch_num = rx_slot[i];
1866 INIT_LIST_HEAD(&wcd->rx_chs[i].list);
1869 wcd->num_tx_port = tx_num;
1871 wcd->tx_chs[i].ch_num = tx_slot[i];
1872 INIT_LIST_HEAD(&wcd->tx_chs[i].list);
1883 struct wcd934x_codec *wcd;
1886 wcd = snd_soc_component_get_drvdata(dai->component);
1894 dev_err(wcd->dev, "Invalid rx_slot %p or rx_num %p\n",
1899 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
1908 dev_err(wcd->dev, "Invalid tx_slot %p or tx_num %p\n",
1913 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
1919 dev_err(wcd->dev, "Invalid DAI ID %x\n", dai->id);
2047 struct wcd934x_codec *wcd = to_wcd934x_codec(hw);
2050 regmap_read(wcd->regmap, WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL, &val);
2070 static struct clk *wcd934x_register_mclk_output(struct wcd934x_codec *wcd)
2072 struct clk *parent = wcd->extclk;
2073 struct device *dev = wcd->dev;
2081 if (of_property_read_u32(np, "clock-frequency", &wcd->rate))
2093 wcd->hw.init = &init;
2095 hw = &wcd->hw;
2096 ret = clk_hw_register(wcd->dev->parent, hw);
2129 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
2150 if (wcd->rate == WCD934X_MCLK_CLK_9P6MHZ)
2155 wcd->dmic_sample_rate = def_dmic_rate;
2164 static void wcd934x_hw_init(struct wcd934x_codec *wcd)
2166 struct regmap *rm = wcd->regmap;
2178 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
2180 wcd934x_hw_init(wcd);
2181 wcd934x_enable_efuse_sensing(wcd);
2182 wcd934x_get_version(wcd);
2189 struct wcd934x_codec *wcd = data;
2199 regmap_read(wcd->if_regmap, i, &val);
2212 regmap_read(wcd->if_regmap,
2221 regmap_read(wcd->if_regmap, reg, &int_val);
2225 dev_err_ratelimited(wcd->dev,
2230 dev_err_ratelimited(wcd->dev,
2243 wcd->if_regmap, reg, &int_val);
2246 regmap_write(wcd->if_regmap,
2252 dev_err_ratelimited(wcd->dev,
2256 regmap_write(wcd->if_regmap,
2267 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
2270 snd_soc_component_init_regmap(component, wcd->regmap);
2271 wcd->component = component;
2274 wcd->clsh_ctrl = wcd_clsh_ctrl_alloc(component, wcd->version);
2275 if (IS_ERR(wcd->clsh_ctrl))
2276 return PTR_ERR(wcd->clsh_ctrl);
2279 wcd->hph_mode = CLS_H_LOHIFI;
2284 INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list);
2292 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
2294 wcd_clsh_ctrl_free(wcd->clsh_ctrl);
2301 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
2304 wcd->rate = freq;
2306 if (wcd->rate == WCD934X_MCLK_CLK_12P288MHZ)
2313 return clk_set_rate(wcd->extclk, freq);
2433 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
2435 ucontrol->value.integer.value[0] = wcd->comp_enabled[comp];
2444 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
2449 if (wcd->comp_enabled[comp] == value)
2452 wcd->comp_enabled[comp] = value;
2485 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
2487 ucontrol->value.enumerated.item[0] = wcd->hph_mode;
2496 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
2501 if (mode_val == wcd->hph_mode)
2505 dev_err(wcd->dev, "Invalid HPH Mode, default to ClSH HiFi\n");
2508 wcd->hph_mode = mode_val;
2518 struct wcd934x_codec *wcd = dev_get_drvdata(dapm->dev);
2520 ucontrol->value.enumerated.item[0] = wcd->rx_port_value[w->shift];
2554 struct wcd934x_codec *wcd = dev_get_drvdata(w->dapm->dev);
2561 int prev_mux_idx = wcd->rx_port_value[port_id];
2575 list_for_each_entry_safe(ch, c, &wcd->dai[aif_id].slim_ch_list, list) {
2591 if (list_empty(&wcd->rx_chs[port_id].list)) {
2592 list_add_tail(&wcd->rx_chs[port_id].list,
2593 &wcd->dai[aif_id].slim_ch_list);
2595 dev_err(wcd->dev ,"SLIM_RX%d PORT is busy\n", port_id);
2601 dev_err(wcd->dev, "Unknown AIF %d\n", mux_idx);
2605 wcd->rx_port_value[port_id] = mux_idx;
2606 snd_soc_dapm_mux_update_power(w->dapm, kc, wcd->rx_port_value[port_id],
3036 struct wcd934x_codec *wcd = dev_get_drvdata(dapm->dev);
3041 ucontrol->value.integer.value[0] = wcd->tx_port_value[port_id];
3050 struct wcd934x_codec *wcd = dev_get_drvdata(widget->dapm->dev);
3060 if (enable == wcd->tx_port_value[port_id])
3064 if (list_empty(&wcd->tx_chs[port_id].list)) {
3065 list_add_tail(&wcd->tx_chs[port_id].list,
3066 &wcd->dai[dai_id].slim_ch_list);
3068 dev_err(wcd->dev ,"SLIM_TX%d PORT is busy\n", port_id);
3074 list_for_each_entry_safe(ch, c, &wcd->dai[dai_id].slim_ch_list, list) {
3077 list_del_init(&wcd->tx_chs[port_id].list);
3085 wcd->tx_port_value[port_id] = enable;
3353 struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
3365 regmap_read(wcd->if_regmap, reg, &val);
3367 regmap_write(wcd->if_regmap, reg,
3376 struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(comp);
3377 struct wcd_slim_codec_dai_data *dai = &wcd->dai[w->shift];
3465 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
3474 if (!wcd->comp_enabled[compander])
3649 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
3657 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
3662 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
3675 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
3676 int hph_mode = wcd->hph_mode;
3699 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
3706 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
3727 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
3728 int hph_mode = wcd->hph_mode;
3749 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
3757 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
3776 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
3780 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
3784 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
3917 struct wcd934x_codec *wcd)
3951 if (wcd->dmic_sample_rate <=
3953 dmic_fs = wcd->dmic_sample_rate;
3959 dmic_fs = wcd->dmic_sample_rate;
4019 struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
4045 dmic_clk_cnt = &wcd->dmic_0_1_clk_cnt;
4050 dmic_clk_cnt = &wcd->dmic_2_3_clk_cnt;
4055 dmic_clk_cnt = &wcd->dmic_4_5_clk_cnt;
4067 wcd);
4068 dmic_rate_val = wcd934x_get_dmic_clk_val(comp, wcd->rate,
5014 static int wcd934x_codec_parse_data(struct wcd934x_codec *wcd)
5016 struct device *dev = &wcd->sdev->dev;
5025 wcd->sidev = of_slim_get_device(wcd->sdev->ctrl, ifc_dev_np);
5027 if (!wcd->sidev) {
5032 slim_get_logical_addr(wcd->sidev);
5033 wcd->if_regmap = regmap_init_slimbus(wcd->sidev,
5035 if (IS_ERR(wcd->if_regmap)) {
5037 return PTR_ERR(wcd->if_regmap);
5041 &wcd->dmic_sample_rate);
5049 struct wcd934x_codec *wcd;
5053 wcd = devm_kzalloc(&pdev->dev, sizeof(*wcd), GFP_KERNEL);
5054 if (!wcd)
5057 wcd->dev = dev;
5058 wcd->regmap = data->regmap;
5059 wcd->extclk = data->extclk;
5060 wcd->sdev = to_slim_device(data->dev);
5061 mutex_init(&wcd->sysclk_mutex);
5063 ret = wcd934x_codec_parse_data(wcd);
5065 dev_err(wcd->dev, "Failed to get SLIM IRQ\n");
5070 regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_MCLK_CFG,
5073 memcpy(wcd->rx_chs, wcd934x_rx_chs, sizeof(wcd934x_rx_chs));
5074 memcpy(wcd->tx_chs, wcd934x_tx_chs, sizeof(wcd934x_tx_chs));
5078 dev_err(wcd->dev, "Failed to get SLIM IRQ\n");
5085 "slim", wcd);
5091 wcd934x_register_mclk_output(wcd);
5092 platform_set_drvdata(pdev, wcd);