Lines Matching refs:wcd
25 #include "wcd-clsh-v2.h"
1273 struct wcd9335_codec *wcd = dev_get_drvdata(dapm->dev);
1275 ucontrol->value.enumerated.item[0] = wcd->rx_port_value;
1284 struct wcd9335_codec *wcd = dev_get_drvdata(w->dapm->dev);
1289 wcd->rx_port_value = ucontrol->value.enumerated.item[0];
1291 switch (wcd->rx_port_value) {
1293 list_del_init(&wcd->rx_chs[port_id].list);
1296 list_add_tail(&wcd->rx_chs[port_id].list,
1297 &wcd->dai[AIF1_PB].slim_ch_list);
1300 list_add_tail(&wcd->rx_chs[port_id].list,
1301 &wcd->dai[AIF2_PB].slim_ch_list);
1304 list_add_tail(&wcd->rx_chs[port_id].list,
1305 &wcd->dai[AIF3_PB].slim_ch_list);
1308 list_add_tail(&wcd->rx_chs[port_id].list,
1309 &wcd->dai[AIF4_PB].slim_ch_list);
1312 dev_err(wcd->dev, "Unknown AIF %d\n", wcd->rx_port_value);
1316 snd_soc_dapm_mux_update_power(w->dapm, kc, wcd->rx_port_value,
1329 struct wcd9335_codec *wcd = dev_get_drvdata(dapm->dev);
1331 ucontrol->value.integer.value[0] = wcd->tx_port_value;
1341 struct wcd9335_codec *wcd = dev_get_drvdata(widget->dapm->dev);
1354 if (enable && !(wcd->tx_port_value & BIT(port_id))) {
1355 wcd->tx_port_value |= BIT(port_id);
1356 list_add_tail(&wcd->tx_chs[port_id].list,
1357 &wcd->dai[dai_id].slim_ch_list);
1358 } else if (!enable && (wcd->tx_port_value & BIT(port_id))) {
1359 wcd->tx_port_value &= ~BIT(port_id);
1360 list_del_init(&wcd->tx_chs[port_id].list);
1364 dev_err(wcd->dev, "Unknown AIF %d\n", dai_id);
1614 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
1618 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
1640 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
1645 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
1669 dev_info(wcd->dev,
1708 static int wcd9335_slim_set_hw_params(struct wcd9335_codec *wcd,
1738 ret = regmap_write(wcd->if_regmap,
1746 ret = regmap_write(wcd->if_regmap,
1752 ret = regmap_write(wcd->if_regmap,
1759 ret = regmap_write(wcd->if_regmap,
1766 ret = regmap_write(wcd->if_regmap,
1775 dai_data->sruntime = slim_stream_allocate(wcd->slim, "WCD9335-SLIM");
1780 dev_err(wcd->dev, "Error Setting slim hw params\n");
1791 struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp);
1797 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
1800 dev_err(wcd->dev, "Invalid SLIM TX%u port DAI ID:%d\n",
1854 dev_err(wcd->dev, "RX_MIX_TX%u going to SLIM TX%u\n",
1857 dev_err(wcd->dev, "ERROR: Invalid decimator: %d\n",
1870 struct wcd9335_codec *wcd;
1873 wcd = snd_soc_component_get_drvdata(dai->component);
1879 dev_err(wcd->dev, "cannot set sample rate: %u\n",
1885 wcd->dai[dai->id].sconfig.bps = params_width(params);
1888 dev_err(wcd->dev, "%s: Invalid format 0x%x\n",
1918 dev_err(wcd->dev, "%s: Invalid TX sample rate: %d\n",
1927 dev_err(wcd->dev, "Cannot set TX Decimator rate\n");
1932 wcd->dai[dai->id].sconfig.bps = params_width(params);
1935 dev_err(wcd->dev, "%s: Invalid format 0x%x\n",
1941 dev_err(wcd->dev, "Invalid stream type %d\n",
1946 wcd->dai[dai->id].sconfig.rate = params_rate(params);
1947 wcd9335_slim_set_hw_params(wcd, &wcd->dai[dai->id], substream->stream);
1956 struct wcd9335_codec *wcd;
1959 wcd = snd_soc_component_get_drvdata(dai->component);
1961 dai_data = &wcd->dai[dai->id];
1988 struct wcd9335_codec *wcd;
1991 wcd = snd_soc_component_get_drvdata(dai->component);
1994 dev_err(wcd->dev, "Invalid tx_slot=%p, rx_slot=%p\n",
1999 wcd->num_rx_port = rx_num;
2001 wcd->rx_chs[i].ch_num = rx_slot[i];
2002 INIT_LIST_HEAD(&wcd->rx_chs[i].list);
2005 wcd->num_tx_port = tx_num;
2007 wcd->tx_chs[i].ch_num = tx_slot[i];
2008 INIT_LIST_HEAD(&wcd->tx_chs[i].list);
2019 struct wcd9335_codec *wcd;
2022 wcd = snd_soc_component_get_drvdata(dai->component);
2030 dev_err(wcd->dev, "Invalid rx_slot %p or rx_num %p\n",
2035 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
2044 dev_err(wcd->dev, "Invalid tx_slot %p or tx_num %p\n",
2048 list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
2054 dev_err(wcd->dev, "Invalid DAI ID %x\n", dai->id);
2179 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
2181 ucontrol->value.integer.value[0] = wcd->comp_enabled[comp];
2189 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
2194 wcd->comp_enabled[comp] = value;
2228 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
2230 ucontrol->value.enumerated.item[0] = wcd->hph_mode;
2239 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
2245 dev_err(wcd->dev, "Invalid HPH Mode, default to ClSH HiFi\n");
2248 wcd->hph_mode = mode_val;
2497 struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(component);
2502 dev_err(wcd->dev, "Invalid micbias index, micb_ind:%d\n",
2528 wcd->pullup_ref[micb_index]++;
2529 if ((wcd->pullup_ref[micb_index] == 1) &&
2530 (wcd->micb_ref[micb_index] == 0))
2535 wcd->pullup_ref[micb_index]--;
2536 if ((wcd->pullup_ref[micb_index] == 0) &&
2537 (wcd->micb_ref[micb_index] == 0))
2542 wcd->micb_ref[micb_index]++;
2543 if (wcd->micb_ref[micb_index] == 1)
2548 wcd->micb_ref[micb_index]--;
2549 if ((wcd->micb_ref[micb_index] == 0) &&
2550 (wcd->pullup_ref[micb_index] > 0))
2553 else if ((wcd->micb_ref[micb_index] == 0) &&
2554 (wcd->pullup_ref[micb_index] == 0)) {
2904 struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp);
2929 dmic_clk_cnt = &(wcd->dmic_0_1_clk_cnt);
2934 dmic_clk_cnt = &(wcd->dmic_2_3_clk_cnt);
2939 dmic_clk_cnt = &(wcd->dmic_4_5_clk_cnt);
2952 wcd->mclk_rate,
2953 wcd->dmic_sample_rate);
2968 wcd->mclk_rate,
2969 wcd->mad_dmic_sample_rate);
2990 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
3002 regmap_read(wcd->if_regmap, reg, &val);
3004 regmap_write(wcd->if_regmap, reg,
3014 struct wcd9335_codec *wcd = snd_soc_component_get_drvdata(comp);
3015 struct wcd_slim_codec_dai_data *dai = &wcd->dai[w->shift];
3184 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
3190 wcd->prim_int_users[ind]++;
3191 if (wcd->prim_int_users[ind] == 1) {
3209 wcd->prim_int_users[ind]--;
3210 if (wcd->prim_int_users[ind] == 0) {
3231 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
3240 if (!wcd->comp_enabled[comp])
3354 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
3378 wcd->hph_l_gain = hph_l_en & 0x1F;
3383 wcd->hph_r_gain = hph_r_en & 0x1F;
3529 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
3530 int hph_mode = wcd->hph_mode;
3543 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
3560 if (!(wcd_clsh_ctrl_get_state(wcd->clsh_ctrl) &
3564 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
3578 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
3582 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
3586 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
3598 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
3602 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
3607 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
3615 static void wcd9335_codec_hph_post_pa_config(struct wcd9335_codec *wcd,
3637 snd_soc_component_update_bits(wcd->component,
3642 if (wcd->comp_enabled[COMPANDER_1] ||
3643 wcd->comp_enabled[COMPANDER_2]) {
3645 snd_soc_component_update_bits(wcd->component,
3649 snd_soc_component_update_bits(wcd->component,
3653 snd_soc_component_update_bits(wcd->component,
3658 snd_soc_component_update_bits(wcd->component,
3661 wcd->hph_l_gain);
3662 snd_soc_component_update_bits(wcd->component,
3665 wcd->hph_r_gain);
3669 snd_soc_component_update_bits(wcd->component,
3680 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
3681 int hph_mode = wcd->hph_mode;
3698 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl,
3711 if (!(wcd_clsh_ctrl_get_state(wcd->clsh_ctrl) &
3715 wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
3729 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
3730 int hph_mode = wcd->hph_mode;
3742 wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
3759 wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
3848 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
3852 wcd->rx_bias_count++;
3853 if (wcd->rx_bias_count == 1) {
3862 wcd->rx_bias_count--;
3863 if (!wcd->rx_bias_count)
3878 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
3879 int hph_mode = wcd->hph_mode;
3890 wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
3907 wcd9335_codec_hph_post_pa_config(wcd, hph_mode, event);
3958 struct wcd9335_codec *wcd = data;
3968 regmap_read(wcd->if_regmap, i, &val);
3975 regmap_read(wcd->if_regmap,
3985 wcd->if_regmap, reg, &int_val);
3995 dev_err_ratelimited(wcd->dev,
4000 dev_err_ratelimited(wcd->dev,
4013 wcd->if_regmap, reg, &int_val);
4016 regmap_write(wcd->if_regmap,
4021 regmap_write(wcd->if_regmap,
4038 static int wcd9335_setup_irqs(struct wcd9335_codec *wcd)
4043 irq = regmap_irq_get_virq(wcd->irq_data, wcd9335_irqs[i].irq);
4045 dev_err(wcd->dev, "Failed to get %s\n",
4050 ret = devm_request_threaded_irq(wcd->dev, irq, NULL,
4054 wcd9335_irqs[i].name, wcd);
4056 dev_err(wcd->dev, "Failed to request %s\n",
4064 regmap_write(wcd->if_regmap, WCD9335_SLIM_PGD_PORT_INT_EN0 + i,
4070 static void wcd9335_teardown_irqs(struct wcd9335_codec *wcd)
4076 regmap_write(wcd->if_regmap, WCD9335_SLIM_PGD_PORT_INT_EN0 + i,
4080 static void wcd9335_cdc_sido_ccl_enable(struct wcd9335_codec *wcd,
4083 struct snd_soc_component *comp = wcd->component;
4086 if (++wcd->sido_ccl_cnt == 1)
4090 if (wcd->sido_ccl_cnt == 0) {
4091 dev_err(wcd->dev, "sido_ccl already disabled\n");
4094 if (--wcd->sido_ccl_cnt == 0)
4100 static int wcd9335_enable_master_bias(struct wcd9335_codec *wcd)
4102 wcd->master_bias_users++;
4103 if (wcd->master_bias_users == 1) {
4104 regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
4107 regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
4115 regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
4118 regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
4126 static int wcd9335_enable_mclk(struct wcd9335_codec *wcd)
4129 if (wcd->master_bias_users <= 0)
4132 if (((wcd->clk_mclk_users == 0) && (wcd->clk_type == WCD_CLK_MCLK)) ||
4133 ((wcd->clk_mclk_users > 0) && (wcd->clk_type != WCD_CLK_MCLK))) {
4134 dev_err(wcd->dev, "Error enabling MCLK, clk_type: %d\n",
4135 wcd->clk_type);
4139 if (++wcd->clk_mclk_users == 1) {
4140 regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
4143 regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
4146 regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
4149 regmap_update_bits(wcd->regmap,
4153 regmap_update_bits(wcd->regmap,
4164 wcd->clk_type = WCD_CLK_MCLK;
4169 static int wcd9335_disable_mclk(struct wcd9335_codec *wcd)
4171 if (wcd->clk_mclk_users <= 0)
4174 if (--wcd->clk_mclk_users == 0) {
4175 if (wcd->clk_rco_users > 0) {
4177 regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
4180 wcd->clk_type = WCD_CLK_RCO;
4182 regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
4185 wcd->clk_type = WCD_CLK_OFF;
4188 regmap_update_bits(wcd->regmap, WCD9335_ANA_CLK_TOP,
4196 static int wcd9335_disable_master_bias(struct wcd9335_codec *wcd)
4198 if (wcd->master_bias_users <= 0)
4201 wcd->master_bias_users--;
4202 if (wcd->master_bias_users == 0) {
4203 regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
4206 regmap_update_bits(wcd->regmap, WCD9335_ANA_BIAS,
4213 static int wcd9335_cdc_req_mclk_enable(struct wcd9335_codec *wcd,
4219 wcd9335_cdc_sido_ccl_enable(wcd, true);
4220 ret = clk_prepare_enable(wcd->mclk);
4222 dev_err(wcd->dev, "%s: ext clk enable failed\n",
4227 wcd9335_enable_master_bias(wcd);
4229 wcd9335_enable_mclk(wcd);
4233 wcd9335_disable_mclk(wcd);
4235 wcd9335_disable_master_bias(wcd);
4236 clk_disable_unprepare(wcd->mclk);
4237 wcd9335_cdc_sido_ccl_enable(wcd, false);
4243 static void wcd9335_codec_apply_sido_voltage(struct wcd9335_codec *wcd,
4246 struct snd_soc_component *comp = wcd->component;
4249 if (req_mv == wcd->sido_voltage)
4262 wcd->sido_voltage = req_mv;
4268 static int wcd9335_codec_update_sido_voltage(struct wcd9335_codec *wcd,
4274 ret = wcd9335_cdc_req_mclk_enable(wcd, true);
4276 dev_err(wcd->dev, "Ext clk enable failed\n");
4280 wcd9335_codec_apply_sido_voltage(wcd, req_mv);
4281 wcd9335_cdc_req_mclk_enable(wcd, false);
4290 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
4294 ret = wcd9335_cdc_req_mclk_enable(wcd, true);
4298 wcd9335_codec_apply_sido_voltage(wcd,
4301 wcd9335_codec_update_sido_voltage(wcd,
4302 wcd->sido_voltage);
4303 wcd9335_cdc_req_mclk_enable(wcd, false);
4781 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
4796 wcd->sido_input_src = SIDO_SOURCE_RCO_BG;
4825 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
4829 regmap_update_bits(wcd->regmap, WCD9335_CODEC_RPM_CLK_GATE,
4832 regmap_update_bits(wcd->regmap, WCD9335_CODEC_RPM_CLK_MCLK_CFG,
4847 struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
4851 snd_soc_component_init_regmap(component, wcd->regmap);
4853 wcd->clsh_ctrl = wcd_clsh_ctrl_alloc(component, wcd->version);
4854 if (IS_ERR(wcd->clsh_ctrl))
4855 return PTR_ERR(wcd->clsh_ctrl);
4858 wcd->hph_mode = CLS_H_HIFI;
4859 wcd->component = component;
4864 INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list);
4866 ret = wcd9335_setup_irqs(wcd);
4873 wcd_clsh_ctrl_free(wcd->clsh_ctrl);
4879 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
4881 wcd_clsh_ctrl_free(wcd->clsh_ctrl);
4882 wcd9335_teardown_irqs(wcd);
4889 struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
4891 wcd->mclk_rate = freq;
4893 if (wcd->mclk_rate == WCD9335_MCLK_CLK_12P288MHZ)
4898 else if (wcd->mclk_rate == WCD9335_MCLK_CLK_9P6MHZ)
4904 return clk_set_rate(wcd->mclk, freq);
4919 static int wcd9335_probe(struct wcd9335_codec *wcd)
4921 struct device *dev = wcd->dev;
4923 memcpy(wcd->rx_chs, wcd9335_rx_chs, sizeof(wcd9335_rx_chs));
4924 memcpy(wcd->tx_chs, wcd9335_tx_chs, sizeof(wcd9335_tx_chs));
4926 wcd->sido_input_src = SIDO_SOURCE_INTERNAL;
4927 wcd->sido_voltage = SIDO_VOLTAGE_NOMINAL_MV;
5024 static int wcd9335_parse_dt(struct wcd9335_codec *wcd)
5026 struct device *dev = wcd->dev;
5030 wcd->reset_gpio = of_get_named_gpio(np, "reset-gpios", 0);
5031 if (wcd->reset_gpio < 0) {
5033 return wcd->reset_gpio;
5036 wcd->mclk = devm_clk_get(dev, "mclk");
5037 if (IS_ERR(wcd->mclk)) {
5039 return PTR_ERR(wcd->mclk);
5042 wcd->native_clk = devm_clk_get(dev, "slimbus");
5043 if (IS_ERR(wcd->native_clk)) {
5045 return PTR_ERR(wcd->native_clk);
5048 wcd->supplies[0].supply = "vdd-buck";
5049 wcd->supplies[1].supply = "vdd-buck-sido";
5050 wcd->supplies[2].supply = "vdd-tx";
5051 wcd->supplies[3].supply = "vdd-rx";
5052 wcd->supplies[4].supply = "vdd-io";
5054 ret = regulator_bulk_get(dev, WCD9335_MAX_SUPPLY, wcd->supplies);
5063 static int wcd9335_power_on_reset(struct wcd9335_codec *wcd)
5065 struct device *dev = wcd->dev;
5068 ret = regulator_bulk_enable(WCD9335_MAX_SUPPLY, wcd->supplies);
5083 gpio_direction_output(wcd->reset_gpio, 0);
5085 gpio_set_value(wcd->reset_gpio, 1);
5091 static int wcd9335_bring_up(struct wcd9335_codec *wcd)
5093 struct regmap *rm = wcd->regmap;
5100 dev_err(wcd->dev, "WCD9335 CODEC version detection fail!\n");
5105 dev_info(wcd->dev, "WCD9335 CODEC version is v2.0\n");
5106 wcd->version = WCD9335_VERSION_2_0;
5116 dev_err(wcd->dev, "WCD9335 CODEC version not supported\n");
5123 static int wcd9335_irq_init(struct wcd9335_codec *wcd)
5132 wcd->intr1 = of_irq_get_byname(wcd->dev->of_node, "intr1");
5133 if (wcd->intr1 < 0) {
5134 if (wcd->intr1 != -EPROBE_DEFER)
5135 dev_err(wcd->dev, "Unable to configure IRQ\n");
5137 return wcd->intr1;
5140 ret = devm_regmap_add_irq_chip(wcd->dev, wcd->regmap, wcd->intr1,
5142 &wcd9335_regmap_irq1_chip, &wcd->irq_data);
5144 dev_err(wcd->dev, "Failed to register IRQ chip: %d\n", ret);
5152 struct wcd9335_codec *wcd;
5155 wcd = devm_kzalloc(dev, sizeof(*wcd), GFP_KERNEL);
5156 if (!wcd)
5159 wcd->dev = dev;
5160 ret = wcd9335_parse_dt(wcd);
5166 ret = wcd9335_power_on_reset(wcd);
5170 dev_set_drvdata(dev, wcd);
5180 struct wcd9335_codec *wcd;
5183 wcd = dev_get_drvdata(dev);
5191 wcd->slim = sdev;
5192 wcd->slim_ifc_dev = of_slim_get_device(sdev->ctrl, ifc_dev_np);
5194 if (!wcd->slim_ifc_dev) {
5199 slim_get_logical_addr(wcd->slim_ifc_dev);
5201 wcd->regmap = regmap_init_slimbus(sdev, &wcd9335_regmap_config);
5202 if (IS_ERR(wcd->regmap)) {
5204 return PTR_ERR(wcd->regmap);
5207 wcd->if_regmap = regmap_init_slimbus(wcd->slim_ifc_dev,
5209 if (IS_ERR(wcd->if_regmap)) {
5211 return PTR_ERR(wcd->if_regmap);
5214 ret = wcd9335_bring_up(wcd);
5220 ret = wcd9335_irq_init(wcd);
5224 wcd9335_probe(wcd);