Lines Matching +full:pdm +full:- +full:fmt

1 // SPDX-License-Identifier: GPL-2.0-only
3 * cs35l35.c -- CS35L35 ALSA SoC audio driver
27 #include <sound/soc-dapm.h>
163 gpiod_set_value_cansleep(cs35l35->reset_gpio, 0); in cs35l35_reset()
165 gpiod_set_value_cansleep(cs35l35->reset_gpio, 1); in cs35l35_reset()
173 if (cs35l35->pdata.ext_bst) { in cs35l35_wait_for_pdn()
178 reinit_completion(&cs35l35->pdn_done); in cs35l35_wait_for_pdn()
180 ret = wait_for_completion_timeout(&cs35l35->pdn_done, in cs35l35_wait_for_pdn()
183 dev_err(cs35l35->dev, "PDN_DONE did not complete\n"); in cs35l35_wait_for_pdn()
184 return -ETIMEDOUT; in cs35l35_wait_for_pdn()
193 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in cs35l35_sdin_event()
199 regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1, in cs35l35_sdin_event()
202 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1, in cs35l35_sdin_event()
205 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1, in cs35l35_sdin_event()
209 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1, in cs35l35_sdin_event()
212 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1, in cs35l35_sdin_event()
216 regmap_update_bits(cs35l35->regmap, CS35L35_AMP_DIG_VOL_CTL, in cs35l35_sdin_event()
221 regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1, in cs35l35_sdin_event()
225 regmap_update_bits(cs35l35->regmap, CS35L35_AMP_DIG_VOL_CTL, in cs35l35_sdin_event()
230 dev_err(component->dev, "Invalid event = 0x%x\n", event); in cs35l35_sdin_event()
231 ret = -EINVAL; in cs35l35_sdin_event()
239 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in cs35l35_main_amp_event()
246 if (cs35l35->pdata.bst_pdn_fet_on) in cs35l35_main_amp_event()
247 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2, in cs35l35_main_amp_event()
251 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2, in cs35l35_main_amp_event()
257 /* If in PDM mode we must use VP for Voltage control */ in cs35l35_main_amp_event()
258 if (cs35l35->pdm_mode) in cs35l35_main_amp_event()
259 regmap_update_bits(cs35l35->regmap, in cs35l35_main_amp_event()
264 regmap_update_bits(cs35l35->regmap, CS35L35_PROTECT_CTL, in cs35l35_main_amp_event()
268 regmap_bulk_read(cs35l35->regmap, CS35L35_INT_STATUS_1, in cs35l35_main_amp_event()
273 regmap_update_bits(cs35l35->regmap, CS35L35_PROTECT_CTL, in cs35l35_main_amp_event()
276 if (cs35l35->pdata.bst_pdn_fet_on) in cs35l35_main_amp_event()
277 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2, in cs35l35_main_amp_event()
281 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2, in cs35l35_main_amp_event()
288 * If PDM mode we should switch back to pdata value in cs35l35_main_amp_event()
291 if (cs35l35->pdm_mode) in cs35l35_main_amp_event()
292 regmap_update_bits(cs35l35->regmap, in cs35l35_main_amp_event()
295 cs35l35->pdata.bst_vctl in cs35l35_main_amp_event()
300 dev_err(component->dev, "Invalid event = 0x%x\n", event); in cs35l35_main_amp_event()
306 static DECLARE_TLV_DB_SCALE(dig_vol_tlv, -10200, 50, 0);
313 SOC_SINGLE_TLV("PDM Volume", CS35L35_AMP_GAIN_PDM_CTL, 0, 19, 0,
366 static int cs35l35_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) in cs35l35_set_dai_fmt() argument
368 struct snd_soc_component *component = codec_dai->component; in cs35l35_set_dai_fmt()
371 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { in cs35l35_set_dai_fmt()
373 regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1, in cs35l35_set_dai_fmt()
375 cs35l35->clock_consumer = false; in cs35l35_set_dai_fmt()
378 regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1, in cs35l35_set_dai_fmt()
380 cs35l35->clock_consumer = true; in cs35l35_set_dai_fmt()
383 return -EINVAL; in cs35l35_set_dai_fmt()
386 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { in cs35l35_set_dai_fmt()
388 cs35l35->i2s_mode = true; in cs35l35_set_dai_fmt()
389 cs35l35->pdm_mode = false; in cs35l35_set_dai_fmt()
392 cs35l35->pdm_mode = true; in cs35l35_set_dai_fmt()
393 cs35l35->i2s_mode = false; in cs35l35_set_dai_fmt()
396 return -EINVAL; in cs35l35_set_dai_fmt()
462 return -EINVAL; in cs35l35_get_clk_config()
469 struct snd_soc_component *component = dai->component; in cs35l35_hw_params()
471 struct classh_cfg *classh = &cs35l35->pdata.classh_algo; in cs35l35_hw_params()
478 int clk_ctl = cs35l35_get_clk_config(cs35l35->sysclk, srate); in cs35l35_hw_params()
481 dev_err(component->dev, "Invalid CLK:Rate %d:%d\n", in cs35l35_hw_params()
482 cs35l35->sysclk, srate); in cs35l35_hw_params()
483 return -EINVAL; in cs35l35_hw_params()
486 ret = regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL2, in cs35l35_hw_params()
489 dev_err(component->dev, "Failed to set port config %d\n", ret); in cs35l35_hw_params()
495 * When configured for the weak-drive detection path (CH_WKFET_DIS = 0) in cs35l35_hw_params()
496 * the Class H algorithm does not enable weak-drive operation for in cs35l35_hw_params()
501 if (classh->classh_wk_fet_disable == 0x00 && in cs35l35_hw_params()
503 ret = regmap_update_bits(cs35l35->regmap, in cs35l35_hw_params()
508 dev_err(component->dev, "Failed to set fet config %d\n", in cs35l35_hw_params()
518 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in cs35l35_hw_params()
530 dev_err(component->dev, "Unsupported Width %d\n", in cs35l35_hw_params()
532 return -EINVAL; in cs35l35_hw_params()
534 regmap_update_bits(cs35l35->regmap, in cs35l35_hw_params()
539 if (cs35l35->pdata.stereo) { in cs35l35_hw_params()
540 regmap_update_bits(cs35l35->regmap, in cs35l35_hw_params()
548 if (cs35l35->i2s_mode) { in cs35l35_hw_params()
552 if ((cs35l35->sclk / srate) % 4) { in cs35l35_hw_params()
553 dev_err(component->dev, "Unsupported sclk/fs ratio %d:%d\n", in cs35l35_hw_params()
554 cs35l35->sclk, srate); in cs35l35_hw_params()
555 return -EINVAL; in cs35l35_hw_params()
557 sp_sclks = ((cs35l35->sclk / srate) / 4) - 1; in cs35l35_hw_params()
560 if (cs35l35->clock_consumer) { in cs35l35_hw_params()
567 dev_err(component->dev, "ratio not supported\n"); in cs35l35_hw_params()
568 return -EINVAL; in cs35l35_hw_params()
577 dev_err(component->dev, "ratio not supported\n"); in cs35l35_hw_params()
578 return -EINVAL; in cs35l35_hw_params()
581 ret = regmap_update_bits(cs35l35->regmap, in cs35l35_hw_params()
586 dev_err(component->dev, "Failed to set fsclk %d\n", ret); in cs35l35_hw_params()
606 struct snd_soc_component *component = dai->component; in cs35l35_pcm_startup()
609 if (!substream->runtime) in cs35l35_pcm_startup()
612 snd_pcm_hw_constraint_list(substream->runtime, 0, in cs35l35_pcm_startup()
615 regmap_update_bits(cs35l35->regmap, CS35L35_AMP_INP_DRV_CTL, in cs35l35_pcm_startup()
634 struct snd_soc_component *component = dai->component; in cs35l35_pdm_startup()
637 if (!substream->runtime) in cs35l35_pdm_startup()
640 snd_pcm_hw_constraint_list(substream->runtime, 0, in cs35l35_pdm_startup()
644 regmap_update_bits(cs35l35->regmap, CS35L35_AMP_INP_DRV_CTL, in cs35l35_pdm_startup()
654 struct snd_soc_component *component = dai->component; in cs35l35_dai_set_sysclk()
658 cs35l35->sclk = freq; in cs35l35_dai_set_sysclk()
678 .name = "cs35l35-pcm",
698 .name = "cs35l35-pdm",
701 .stream_name = "PDM Playback",
730 dev_err(component->dev, "Invalid CLK Source\n"); in cs35l35_component_set_sysclk()
731 return -EINVAL; in cs35l35_component_set_sysclk()
745 cs35l35->sysclk = freq; in cs35l35_component_set_sysclk()
748 dev_err(component->dev, "Invalid CLK Frequency Input : %d\n", freq); in cs35l35_component_set_sysclk()
749 return -EINVAL; in cs35l35_component_set_sysclk()
752 ret = regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1, in cs35l35_component_set_sysclk()
756 dev_err(component->dev, "Failed to set sysclk %d\n", ret); in cs35l35_component_set_sysclk()
766 struct regmap *regmap = cs35l35->regmap; in cs35l35_boost_inductor()
826 dev_err(cs35l35->dev, "Invalid Inductor Value %d uH\n", in cs35l35_boost_inductor()
828 return -EINVAL; in cs35l35_boost_inductor()
836 struct classh_cfg *classh = &cs35l35->pdata.classh_algo; in cs35l35_component_probe()
837 struct monitor_cfg *monitor_config = &cs35l35->pdata.mon_cfg; in cs35l35_component_probe()
841 if (cs35l35->pdata.bst_vctl) in cs35l35_component_probe()
842 regmap_update_bits(cs35l35->regmap, CS35L35_BST_CVTR_V_CTL, in cs35l35_component_probe()
844 cs35l35->pdata.bst_vctl); in cs35l35_component_probe()
846 if (cs35l35->pdata.bst_ipk) in cs35l35_component_probe()
847 regmap_update_bits(cs35l35->regmap, CS35L35_BST_PEAK_I, in cs35l35_component_probe()
849 cs35l35->pdata.bst_ipk << in cs35l35_component_probe()
852 ret = cs35l35_boost_inductor(cs35l35, cs35l35->pdata.boost_ind); in cs35l35_component_probe()
856 if (cs35l35->pdata.gain_zc) in cs35l35_component_probe()
857 regmap_update_bits(cs35l35->regmap, CS35L35_PROTECT_CTL, in cs35l35_component_probe()
859 cs35l35->pdata.gain_zc << in cs35l35_component_probe()
862 if (cs35l35->pdata.aud_channel) in cs35l35_component_probe()
863 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
866 cs35l35->pdata.aud_channel << in cs35l35_component_probe()
869 if (cs35l35->pdata.stereo) { in cs35l35_component_probe()
870 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
873 cs35l35->pdata.adv_channel << in cs35l35_component_probe()
875 if (cs35l35->pdata.shared_bst) in cs35l35_component_probe()
876 regmap_update_bits(cs35l35->regmap, CS35L35_CLASS_H_CTL, in cs35l35_component_probe()
885 if (cs35l35->pdata.sp_drv_str) in cs35l35_component_probe()
886 regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1, in cs35l35_component_probe()
888 cs35l35->pdata.sp_drv_str << in cs35l35_component_probe()
890 if (cs35l35->pdata.sp_drv_unused) in cs35l35_component_probe()
891 regmap_update_bits(cs35l35->regmap, CS35L35_SP_FMT_CTL3, in cs35l35_component_probe()
893 cs35l35->pdata.sp_drv_unused << in cs35l35_component_probe()
896 if (classh->classh_algo_enable) { in cs35l35_component_probe()
897 if (classh->classh_bst_override) in cs35l35_component_probe()
898 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
901 classh->classh_bst_override << in cs35l35_component_probe()
903 if (classh->classh_bst_max_limit) in cs35l35_component_probe()
904 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
907 classh->classh_bst_max_limit << in cs35l35_component_probe()
909 if (classh->classh_mem_depth) in cs35l35_component_probe()
910 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
913 classh->classh_mem_depth << in cs35l35_component_probe()
915 if (classh->classh_headroom) in cs35l35_component_probe()
916 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
919 classh->classh_headroom << in cs35l35_component_probe()
921 if (classh->classh_release_rate) in cs35l35_component_probe()
922 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
925 classh->classh_release_rate << in cs35l35_component_probe()
927 if (classh->classh_wk_fet_disable) in cs35l35_component_probe()
928 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
931 classh->classh_wk_fet_disable << in cs35l35_component_probe()
933 if (classh->classh_wk_fet_delay) in cs35l35_component_probe()
934 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
937 classh->classh_wk_fet_delay << in cs35l35_component_probe()
939 if (classh->classh_wk_fet_thld) in cs35l35_component_probe()
940 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
943 classh->classh_wk_fet_thld << in cs35l35_component_probe()
945 if (classh->classh_vpch_auto) in cs35l35_component_probe()
946 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
949 classh->classh_vpch_auto << in cs35l35_component_probe()
951 if (classh->classh_vpch_rate) in cs35l35_component_probe()
952 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
955 classh->classh_vpch_rate << in cs35l35_component_probe()
957 if (classh->classh_vpch_man) in cs35l35_component_probe()
958 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
961 classh->classh_vpch_man << in cs35l35_component_probe()
965 if (monitor_config->is_present) { in cs35l35_component_probe()
966 if (monitor_config->vmon_specs) { in cs35l35_component_probe()
967 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
970 monitor_config->vmon_dpth << in cs35l35_component_probe()
972 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
975 monitor_config->vmon_loc << in cs35l35_component_probe()
977 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
980 monitor_config->vmon_frm << in cs35l35_component_probe()
983 if (monitor_config->imon_specs) { in cs35l35_component_probe()
984 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
987 monitor_config->imon_dpth << in cs35l35_component_probe()
989 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
992 monitor_config->imon_loc << in cs35l35_component_probe()
994 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
997 monitor_config->imon_frm << in cs35l35_component_probe()
999 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1002 monitor_config->imon_scale << in cs35l35_component_probe()
1005 if (monitor_config->vpmon_specs) { in cs35l35_component_probe()
1006 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1009 monitor_config->vpmon_dpth << in cs35l35_component_probe()
1011 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1014 monitor_config->vpmon_loc << in cs35l35_component_probe()
1016 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1019 monitor_config->vpmon_frm << in cs35l35_component_probe()
1022 if (monitor_config->vbstmon_specs) { in cs35l35_component_probe()
1023 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1026 monitor_config->vpmon_dpth << in cs35l35_component_probe()
1028 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1031 monitor_config->vbstmon_loc << in cs35l35_component_probe()
1033 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1036 monitor_config->vbstmon_frm << in cs35l35_component_probe()
1039 if (monitor_config->vpbrstat_specs) { in cs35l35_component_probe()
1040 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1043 monitor_config->vpbrstat_dpth << in cs35l35_component_probe()
1045 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1048 monitor_config->vpbrstat_loc << in cs35l35_component_probe()
1050 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1053 monitor_config->vpbrstat_frm << in cs35l35_component_probe()
1056 if (monitor_config->zerofill_specs) { in cs35l35_component_probe()
1057 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1060 monitor_config->zerofill_dpth << in cs35l35_component_probe()
1062 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1065 monitor_config->zerofill_loc << in cs35l35_component_probe()
1067 regmap_update_bits(cs35l35->regmap, in cs35l35_component_probe()
1070 monitor_config->zerofill_frm << in cs35l35_component_probe()
1114 regmap_read(cs35l35->regmap, CS35L35_INT_STATUS_4, &sticky4); in cs35l35_irq()
1115 regmap_read(cs35l35->regmap, CS35L35_INT_STATUS_3, &sticky3); in cs35l35_irq()
1116 regmap_read(cs35l35->regmap, CS35L35_INT_STATUS_2, &sticky2); in cs35l35_irq()
1117 regmap_read(cs35l35->regmap, CS35L35_INT_STATUS_1, &sticky1); in cs35l35_irq()
1119 regmap_read(cs35l35->regmap, CS35L35_INT_MASK_4, &mask4); in cs35l35_irq()
1120 regmap_read(cs35l35->regmap, CS35L35_INT_MASK_3, &mask3); in cs35l35_irq()
1121 regmap_read(cs35l35->regmap, CS35L35_INT_MASK_2, &mask2); in cs35l35_irq()
1122 regmap_read(cs35l35->regmap, CS35L35_INT_MASK_1, &mask1); in cs35l35_irq()
1130 complete(&cs35l35->pdn_done); in cs35l35_irq()
1133 regmap_read(cs35l35->regmap, CS35L35_INT_STATUS_1, &current1); in cs35l35_irq()
1137 dev_crit(cs35l35->dev, "Calibration Error\n"); in cs35l35_irq()
1142 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1145 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1149 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1156 dev_crit(cs35l35->dev, "AMP Short Error\n"); in cs35l35_irq()
1159 dev_dbg(cs35l35->dev, "Amp short error release\n"); in cs35l35_irq()
1160 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1163 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1167 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1174 dev_warn(cs35l35->dev, "Over temperature warning\n"); in cs35l35_irq()
1178 dev_dbg(cs35l35->dev, "Over temperature warn release\n"); in cs35l35_irq()
1179 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1182 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1186 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1193 dev_crit(cs35l35->dev, "Over temperature error\n"); in cs35l35_irq()
1196 dev_dbg(cs35l35->dev, "Over temperature error release\n"); in cs35l35_irq()
1197 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1200 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1204 regmap_update_bits(cs35l35->regmap, in cs35l35_irq()
1211 dev_crit(cs35l35->dev, "VBST error: powering off!\n"); in cs35l35_irq()
1212 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2, in cs35l35_irq()
1214 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1, in cs35l35_irq()
1219 dev_crit(cs35l35->dev, "LBST error: powering off!\n"); in cs35l35_irq()
1220 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2, in cs35l35_irq()
1222 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1, in cs35l35_irq()
1227 dev_dbg(cs35l35->dev, "Error: Reactive Brownout\n"); in cs35l35_irq()
1230 dev_dbg(cs35l35->dev, "Error: VMON overflow\n"); in cs35l35_irq()
1233 dev_dbg(cs35l35->dev, "Error: IMON overflow\n"); in cs35l35_irq()
1242 struct device_node *np = i2c_client->dev.of_node; in cs35l35_handle_of_data()
1244 struct classh_cfg *classh_config = &pdata->classh_algo; in cs35l35_handle_of_data()
1245 struct monitor_cfg *monitor_config = &pdata->mon_cfg; in cs35l35_handle_of_data()
1249 const int mon_array_size = imon_array_size - 1; in cs35l35_handle_of_data()
1255 pdata->bst_pdn_fet_on = of_property_read_bool(np, in cs35l35_handle_of_data()
1256 "cirrus,boost-pdn-fet-on"); in cs35l35_handle_of_data()
1258 ret = of_property_read_u32(np, "cirrus,boost-ctl-millivolt", &val32); in cs35l35_handle_of_data()
1261 dev_err(&i2c_client->dev, in cs35l35_handle_of_data()
1263 return -EINVAL; in cs35l35_handle_of_data()
1265 pdata->bst_vctl = ((val32 - 2600) / 100) + 1; in cs35l35_handle_of_data()
1268 ret = of_property_read_u32(np, "cirrus,boost-peak-milliamp", &val32); in cs35l35_handle_of_data()
1271 dev_err(&i2c_client->dev, in cs35l35_handle_of_data()
1273 return -EINVAL; in cs35l35_handle_of_data()
1276 pdata->bst_ipk = ((val32 - 1680) / 110) | CS35L35_VALID_PDATA; in cs35l35_handle_of_data()
1279 ret = of_property_read_u32(np, "cirrus,boost-ind-nanohenry", &val32); in cs35l35_handle_of_data()
1281 pdata->boost_ind = val32; in cs35l35_handle_of_data()
1283 dev_err(&i2c_client->dev, "Inductor not specified.\n"); in cs35l35_handle_of_data()
1284 return -EINVAL; in cs35l35_handle_of_data()
1287 if (of_property_read_u32(np, "cirrus,sp-drv-strength", &val32) >= 0) in cs35l35_handle_of_data()
1288 pdata->sp_drv_str = val32; in cs35l35_handle_of_data()
1289 if (of_property_read_u32(np, "cirrus,sp-drv-unused", &val32) >= 0) in cs35l35_handle_of_data()
1290 pdata->sp_drv_unused = val32 | CS35L35_VALID_PDATA; in cs35l35_handle_of_data()
1292 pdata->stereo = of_property_read_bool(np, "cirrus,stereo-config"); in cs35l35_handle_of_data()
1294 if (pdata->stereo) { in cs35l35_handle_of_data()
1295 ret = of_property_read_u32(np, "cirrus,audio-channel", &val32); in cs35l35_handle_of_data()
1297 pdata->aud_channel = val32; in cs35l35_handle_of_data()
1299 ret = of_property_read_u32(np, "cirrus,advisory-channel", in cs35l35_handle_of_data()
1302 pdata->adv_channel = val32; in cs35l35_handle_of_data()
1304 pdata->shared_bst = of_property_read_bool(np, in cs35l35_handle_of_data()
1305 "cirrus,shared-boost"); in cs35l35_handle_of_data()
1308 pdata->ext_bst = of_property_read_bool(np, "cirrus,external-boost"); in cs35l35_handle_of_data()
1310 pdata->gain_zc = of_property_read_bool(np, "cirrus,amp-gain-zc"); in cs35l35_handle_of_data()
1312 classh = of_get_child_by_name(np, "cirrus,classh-internal-algo"); in cs35l35_handle_of_data()
1313 classh_config->classh_algo_enable = (classh != NULL); in cs35l35_handle_of_data()
1315 if (classh_config->classh_algo_enable) { in cs35l35_handle_of_data()
1316 classh_config->classh_bst_override = in cs35l35_handle_of_data()
1317 of_property_read_bool(np, "cirrus,classh-bst-overide"); in cs35l35_handle_of_data()
1320 "cirrus,classh-bst-max-limit", in cs35l35_handle_of_data()
1324 classh_config->classh_bst_max_limit = val32; in cs35l35_handle_of_data()
1328 "cirrus,classh-bst-max-limit", in cs35l35_handle_of_data()
1332 classh_config->classh_bst_max_limit = val32; in cs35l35_handle_of_data()
1335 ret = of_property_read_u32(classh, "cirrus,classh-mem-depth", in cs35l35_handle_of_data()
1339 classh_config->classh_mem_depth = val32; in cs35l35_handle_of_data()
1342 ret = of_property_read_u32(classh, "cirrus,classh-release-rate", in cs35l35_handle_of_data()
1345 classh_config->classh_release_rate = val32; in cs35l35_handle_of_data()
1347 ret = of_property_read_u32(classh, "cirrus,classh-headroom", in cs35l35_handle_of_data()
1351 classh_config->classh_headroom = val32; in cs35l35_handle_of_data()
1355 "cirrus,classh-wk-fet-disable", in cs35l35_handle_of_data()
1358 classh_config->classh_wk_fet_disable = val32; in cs35l35_handle_of_data()
1360 ret = of_property_read_u32(classh, "cirrus,classh-wk-fet-delay", in cs35l35_handle_of_data()
1364 classh_config->classh_wk_fet_delay = val32; in cs35l35_handle_of_data()
1367 ret = of_property_read_u32(classh, "cirrus,classh-wk-fet-thld", in cs35l35_handle_of_data()
1370 classh_config->classh_wk_fet_thld = val32; in cs35l35_handle_of_data()
1372 ret = of_property_read_u32(classh, "cirrus,classh-vpch-auto", in cs35l35_handle_of_data()
1376 classh_config->classh_vpch_auto = val32; in cs35l35_handle_of_data()
1379 ret = of_property_read_u32(classh, "cirrus,classh-vpch-rate", in cs35l35_handle_of_data()
1383 classh_config->classh_vpch_rate = val32; in cs35l35_handle_of_data()
1386 ret = of_property_read_u32(classh, "cirrus,classh-vpch-man", in cs35l35_handle_of_data()
1389 classh_config->classh_vpch_man = val32; in cs35l35_handle_of_data()
1394 signal_format = of_get_child_by_name(np, "cirrus,monitor-signal-format"); in cs35l35_handle_of_data()
1395 monitor_config->is_present = signal_format ? true : false; in cs35l35_handle_of_data()
1396 if (monitor_config->is_present) { in cs35l35_handle_of_data()
1400 monitor_config->imon_specs = true; in cs35l35_handle_of_data()
1401 monitor_config->imon_dpth = monitor_array[0]; in cs35l35_handle_of_data()
1402 monitor_config->imon_loc = monitor_array[1]; in cs35l35_handle_of_data()
1403 monitor_config->imon_frm = monitor_array[2]; in cs35l35_handle_of_data()
1404 monitor_config->imon_scale = monitor_array[3]; in cs35l35_handle_of_data()
1409 monitor_config->vmon_specs = true; in cs35l35_handle_of_data()
1410 monitor_config->vmon_dpth = monitor_array[0]; in cs35l35_handle_of_data()
1411 monitor_config->vmon_loc = monitor_array[1]; in cs35l35_handle_of_data()
1412 monitor_config->vmon_frm = monitor_array[2]; in cs35l35_handle_of_data()
1417 monitor_config->vpmon_specs = true; in cs35l35_handle_of_data()
1418 monitor_config->vpmon_dpth = monitor_array[0]; in cs35l35_handle_of_data()
1419 monitor_config->vpmon_loc = monitor_array[1]; in cs35l35_handle_of_data()
1420 monitor_config->vpmon_frm = monitor_array[2]; in cs35l35_handle_of_data()
1425 monitor_config->vbstmon_specs = true; in cs35l35_handle_of_data()
1426 monitor_config->vbstmon_dpth = monitor_array[0]; in cs35l35_handle_of_data()
1427 monitor_config->vbstmon_loc = monitor_array[1]; in cs35l35_handle_of_data()
1428 monitor_config->vbstmon_frm = monitor_array[2]; in cs35l35_handle_of_data()
1433 monitor_config->vpbrstat_specs = true; in cs35l35_handle_of_data()
1434 monitor_config->vpbrstat_dpth = monitor_array[0]; in cs35l35_handle_of_data()
1435 monitor_config->vpbrstat_loc = monitor_array[1]; in cs35l35_handle_of_data()
1436 monitor_config->vpbrstat_frm = monitor_array[2]; in cs35l35_handle_of_data()
1441 monitor_config->zerofill_specs = true; in cs35l35_handle_of_data()
1442 monitor_config->zerofill_dpth = monitor_array[0]; in cs35l35_handle_of_data()
1443 monitor_config->zerofill_loc = monitor_array[1]; in cs35l35_handle_of_data()
1444 monitor_config->zerofill_frm = monitor_array[2]; in cs35l35_handle_of_data()
1471 struct device *dev = &i2c_client->dev; in cs35l35_i2c_probe()
1479 return -ENOMEM; in cs35l35_i2c_probe()
1481 cs35l35->dev = dev; in cs35l35_i2c_probe()
1484 cs35l35->regmap = devm_regmap_init_i2c(i2c_client, &cs35l35_regmap); in cs35l35_i2c_probe()
1485 if (IS_ERR(cs35l35->regmap)) { in cs35l35_i2c_probe()
1486 ret = PTR_ERR(cs35l35->regmap); in cs35l35_i2c_probe()
1492 cs35l35->supplies[i].supply = cs35l35_supplies[i]; in cs35l35_i2c_probe()
1494 cs35l35->num_supplies = ARRAY_SIZE(cs35l35_supplies); in cs35l35_i2c_probe()
1496 ret = devm_regulator_bulk_get(dev, cs35l35->num_supplies, in cs35l35_i2c_probe()
1497 cs35l35->supplies); in cs35l35_i2c_probe()
1504 cs35l35->pdata = *pdata; in cs35l35_i2c_probe()
1509 return -ENOMEM; in cs35l35_i2c_probe()
1510 if (i2c_client->dev.of_node) { in cs35l35_i2c_probe()
1516 cs35l35->pdata = *pdata; in cs35l35_i2c_probe()
1519 ret = regulator_bulk_enable(cs35l35->num_supplies, in cs35l35_i2c_probe()
1520 cs35l35->supplies); in cs35l35_i2c_probe()
1527 cs35l35->reset_gpio = devm_gpiod_get_optional(dev, "reset", in cs35l35_i2c_probe()
1529 if (IS_ERR(cs35l35->reset_gpio)) { in cs35l35_i2c_probe()
1530 ret = PTR_ERR(cs35l35->reset_gpio); in cs35l35_i2c_probe()
1531 cs35l35->reset_gpio = NULL; in cs35l35_i2c_probe()
1532 if (ret == -EBUSY) { in cs35l35_i2c_probe()
1543 init_completion(&cs35l35->pdn_done); in cs35l35_i2c_probe()
1545 ret = devm_request_threaded_irq(dev, i2c_client->irq, NULL, cs35l35_irq, in cs35l35_i2c_probe()
1553 devid = cirrus_read_device_id(cs35l35->regmap, CS35L35_DEVID_AB); in cs35l35_i2c_probe()
1563 ret = -ENODEV; in cs35l35_i2c_probe()
1567 ret = regmap_read(cs35l35->regmap, CS35L35_REV_ID, &reg); in cs35l35_i2c_probe()
1573 ret = regmap_register_patch(cs35l35->regmap, cs35l35_errata_patch, in cs35l35_i2c_probe()
1584 regmap_write(cs35l35->regmap, CS35L35_INT_MASK_1, in cs35l35_i2c_probe()
1586 regmap_write(cs35l35->regmap, CS35L35_INT_MASK_2, in cs35l35_i2c_probe()
1588 regmap_write(cs35l35->regmap, CS35L35_INT_MASK_3, in cs35l35_i2c_probe()
1590 regmap_write(cs35l35->regmap, CS35L35_INT_MASK_4, in cs35l35_i2c_probe()
1593 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2, in cs35l35_i2c_probe()
1597 if (cs35l35->pdata.bst_pdn_fet_on) in cs35l35_i2c_probe()
1598 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2, in cs35l35_i2c_probe()
1602 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2, in cs35l35_i2c_probe()
1606 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL3, in cs35l35_i2c_probe()
1610 regmap_update_bits(cs35l35->regmap, CS35L35_PROTECT_CTL, in cs35l35_i2c_probe()
1623 regulator_bulk_disable(cs35l35->num_supplies, in cs35l35_i2c_probe()
1624 cs35l35->supplies); in cs35l35_i2c_probe()
1625 gpiod_set_value_cansleep(cs35l35->reset_gpio, 0); in cs35l35_i2c_probe()
1634 regulator_bulk_disable(cs35l35->num_supplies, cs35l35->supplies); in cs35l35_i2c_remove()
1635 gpiod_set_value_cansleep(cs35l35->reset_gpio, 0); in cs35l35_i2c_remove()