Lines Matching defs:cs35l35
3 * cs35l35.c -- CS35L35 ALSA SoC audio driver
31 #include <sound/cs35l35.h>
35 #include "cs35l35.h"
161 static void cs35l35_reset(struct cs35l35_private *cs35l35)
163 gpiod_set_value_cansleep(cs35l35->reset_gpio, 0);
165 gpiod_set_value_cansleep(cs35l35->reset_gpio, 1);
169 static int cs35l35_wait_for_pdn(struct cs35l35_private *cs35l35)
173 if (cs35l35->pdata.ext_bst) {
178 reinit_completion(&cs35l35->pdn_done);
180 ret = wait_for_completion_timeout(&cs35l35->pdn_done,
183 dev_err(cs35l35->dev, "PDN_DONE did not complete\n");
194 struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component);
199 regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1,
202 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1,
205 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1,
209 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1,
212 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1,
216 regmap_update_bits(cs35l35->regmap, CS35L35_AMP_DIG_VOL_CTL,
219 ret = cs35l35_wait_for_pdn(cs35l35);
221 regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1,
225 regmap_update_bits(cs35l35->regmap, CS35L35_AMP_DIG_VOL_CTL,
240 struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component);
246 if (cs35l35->pdata.bst_pdn_fet_on)
247 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2,
251 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2,
258 if (cs35l35->pdm_mode)
259 regmap_update_bits(cs35l35->regmap,
264 regmap_update_bits(cs35l35->regmap, CS35L35_PROTECT_CTL,
268 regmap_bulk_read(cs35l35->regmap, CS35L35_INT_STATUS_1,
273 regmap_update_bits(cs35l35->regmap, CS35L35_PROTECT_CTL,
276 if (cs35l35->pdata.bst_pdn_fet_on)
277 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2,
281 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2,
291 if (cs35l35->pdm_mode)
292 regmap_update_bits(cs35l35->regmap,
295 cs35l35->pdata.bst_vctl
369 struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component);
373 regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1,
375 cs35l35->clock_consumer = false;
378 regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1,
380 cs35l35->clock_consumer = true;
388 cs35l35->i2s_mode = true;
389 cs35l35->pdm_mode = false;
392 cs35l35->pdm_mode = true;
393 cs35l35->i2s_mode = false;
470 struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component);
471 struct classh_cfg *classh = &cs35l35->pdata.classh_algo;
478 int clk_ctl = cs35l35_get_clk_config(cs35l35->sysclk, srate);
482 cs35l35->sysclk, srate);
486 ret = regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL2,
503 ret = regmap_update_bits(cs35l35->regmap,
534 regmap_update_bits(cs35l35->regmap,
539 if (cs35l35->pdata.stereo) {
540 regmap_update_bits(cs35l35->regmap,
548 if (cs35l35->i2s_mode) {
552 if ((cs35l35->sclk / srate) % 4) {
554 cs35l35->sclk, srate);
557 sp_sclks = ((cs35l35->sclk / srate) / 4) - 1;
560 if (cs35l35->clock_consumer) {
581 ret = regmap_update_bits(cs35l35->regmap,
607 struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component);
615 regmap_update_bits(cs35l35->regmap, CS35L35_AMP_INP_DRV_CTL,
635 struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component);
644 regmap_update_bits(cs35l35->regmap, CS35L35_AMP_INP_DRV_CTL,
655 struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component);
658 cs35l35->sclk = freq;
678 .name = "cs35l35-pcm",
698 .name = "cs35l35-pdm",
715 struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component);
745 cs35l35->sysclk = freq;
752 ret = regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1,
763 static int cs35l35_boost_inductor(struct cs35l35_private *cs35l35,
766 struct regmap *regmap = cs35l35->regmap;
826 dev_err(cs35l35->dev, "Invalid Inductor Value %d uH\n",
835 struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component);
836 struct classh_cfg *classh = &cs35l35->pdata.classh_algo;
837 struct monitor_cfg *monitor_config = &cs35l35->pdata.mon_cfg;
841 if (cs35l35->pdata.bst_vctl)
842 regmap_update_bits(cs35l35->regmap, CS35L35_BST_CVTR_V_CTL,
844 cs35l35->pdata.bst_vctl);
846 if (cs35l35->pdata.bst_ipk)
847 regmap_update_bits(cs35l35->regmap, CS35L35_BST_PEAK_I,
849 cs35l35->pdata.bst_ipk <<
852 ret = cs35l35_boost_inductor(cs35l35, cs35l35->pdata.boost_ind);
856 if (cs35l35->pdata.gain_zc)
857 regmap_update_bits(cs35l35->regmap, CS35L35_PROTECT_CTL,
859 cs35l35->pdata.gain_zc <<
862 if (cs35l35->pdata.aud_channel)
863 regmap_update_bits(cs35l35->regmap,
866 cs35l35->pdata.aud_channel <<
869 if (cs35l35->pdata.stereo) {
870 regmap_update_bits(cs35l35->regmap,
873 cs35l35->pdata.adv_channel <<
875 if (cs35l35->pdata.shared_bst)
876 regmap_update_bits(cs35l35->regmap, CS35L35_CLASS_H_CTL,
885 if (cs35l35->pdata.sp_drv_str)
886 regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1,
888 cs35l35->pdata.sp_drv_str <<
890 if (cs35l35->pdata.sp_drv_unused)
891 regmap_update_bits(cs35l35->regmap, CS35L35_SP_FMT_CTL3,
893 cs35l35->pdata.sp_drv_unused <<
898 regmap_update_bits(cs35l35->regmap,
904 regmap_update_bits(cs35l35->regmap,
910 regmap_update_bits(cs35l35->regmap,
916 regmap_update_bits(cs35l35->regmap,
922 regmap_update_bits(cs35l35->regmap,
928 regmap_update_bits(cs35l35->regmap,
934 regmap_update_bits(cs35l35->regmap,
940 regmap_update_bits(cs35l35->regmap,
946 regmap_update_bits(cs35l35->regmap,
952 regmap_update_bits(cs35l35->regmap,
958 regmap_update_bits(cs35l35->regmap,
967 regmap_update_bits(cs35l35->regmap,
972 regmap_update_bits(cs35l35->regmap,
977 regmap_update_bits(cs35l35->regmap,
984 regmap_update_bits(cs35l35->regmap,
989 regmap_update_bits(cs35l35->regmap,
994 regmap_update_bits(cs35l35->regmap,
999 regmap_update_bits(cs35l35->regmap,
1006 regmap_update_bits(cs35l35->regmap,
1011 regmap_update_bits(cs35l35->regmap,
1016 regmap_update_bits(cs35l35->regmap,
1023 regmap_update_bits(cs35l35->regmap,
1028 regmap_update_bits(cs35l35->regmap,
1033 regmap_update_bits(cs35l35->regmap,
1040 regmap_update_bits(cs35l35->regmap,
1045 regmap_update_bits(cs35l35->regmap,
1050 regmap_update_bits(cs35l35->regmap,
1057 regmap_update_bits(cs35l35->regmap,
1062 regmap_update_bits(cs35l35->regmap,
1067 regmap_update_bits(cs35l35->regmap,
1109 struct cs35l35_private *cs35l35 = data;
1114 regmap_read(cs35l35->regmap, CS35L35_INT_STATUS_4, &sticky4);
1115 regmap_read(cs35l35->regmap, CS35L35_INT_STATUS_3, &sticky3);
1116 regmap_read(cs35l35->regmap, CS35L35_INT_STATUS_2, &sticky2);
1117 regmap_read(cs35l35->regmap, CS35L35_INT_STATUS_1, &sticky1);
1119 regmap_read(cs35l35->regmap, CS35L35_INT_MASK_4, &mask4);
1120 regmap_read(cs35l35->regmap, CS35L35_INT_MASK_3, &mask3);
1121 regmap_read(cs35l35->regmap, CS35L35_INT_MASK_2, &mask2);
1122 regmap_read(cs35l35->regmap, CS35L35_INT_MASK_1, &mask1);
1130 complete(&cs35l35->pdn_done);
1133 regmap_read(cs35l35->regmap, CS35L35_INT_STATUS_1, ¤t1);
1137 dev_crit(cs35l35->dev, "Calibration Error\n");
1142 regmap_update_bits(cs35l35->regmap,
1145 regmap_update_bits(cs35l35->regmap,
1149 regmap_update_bits(cs35l35->regmap,
1156 dev_crit(cs35l35->dev, "AMP Short Error\n");
1159 dev_dbg(cs35l35->dev, "Amp short error release\n");
1160 regmap_update_bits(cs35l35->regmap,
1163 regmap_update_bits(cs35l35->regmap,
1167 regmap_update_bits(cs35l35->regmap,
1174 dev_warn(cs35l35->dev, "Over temperature warning\n");
1178 dev_dbg(cs35l35->dev, "Over temperature warn release\n");
1179 regmap_update_bits(cs35l35->regmap,
1182 regmap_update_bits(cs35l35->regmap,
1186 regmap_update_bits(cs35l35->regmap,
1193 dev_crit(cs35l35->dev, "Over temperature error\n");
1196 dev_dbg(cs35l35->dev, "Over temperature error release\n");
1197 regmap_update_bits(cs35l35->regmap,
1200 regmap_update_bits(cs35l35->regmap,
1204 regmap_update_bits(cs35l35->regmap,
1211 dev_crit(cs35l35->dev, "VBST error: powering off!\n");
1212 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2,
1214 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1,
1219 dev_crit(cs35l35->dev, "LBST error: powering off!\n");
1220 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2,
1222 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL1,
1227 dev_dbg(cs35l35->dev, "Error: Reactive Brownout\n");
1230 dev_dbg(cs35l35->dev, "Error: VMON overflow\n");
1233 dev_dbg(cs35l35->dev, "Error: IMON overflow\n");
1470 struct cs35l35_private *cs35l35;
1477 cs35l35 = devm_kzalloc(dev, sizeof(struct cs35l35_private), GFP_KERNEL);
1478 if (!cs35l35)
1481 cs35l35->dev = dev;
1483 i2c_set_clientdata(i2c_client, cs35l35);
1484 cs35l35->regmap = devm_regmap_init_i2c(i2c_client, &cs35l35_regmap);
1485 if (IS_ERR(cs35l35->regmap)) {
1486 ret = PTR_ERR(cs35l35->regmap);
1492 cs35l35->supplies[i].supply = cs35l35_supplies[i];
1494 cs35l35->num_supplies = ARRAY_SIZE(cs35l35_supplies);
1496 ret = devm_regulator_bulk_get(dev, cs35l35->num_supplies,
1497 cs35l35->supplies);
1504 cs35l35->pdata = *pdata;
1516 cs35l35->pdata = *pdata;
1519 ret = regulator_bulk_enable(cs35l35->num_supplies,
1520 cs35l35->supplies);
1527 cs35l35->reset_gpio = devm_gpiod_get_optional(dev, "reset",
1529 if (IS_ERR(cs35l35->reset_gpio)) {
1530 ret = PTR_ERR(cs35l35->reset_gpio);
1531 cs35l35->reset_gpio = NULL;
1541 cs35l35_reset(cs35l35);
1543 init_completion(&cs35l35->pdn_done);
1547 IRQF_SHARED, "cs35l35", cs35l35);
1553 devid = cirrus_read_device_id(cs35l35->regmap, CS35L35_DEVID_AB);
1567 ret = regmap_read(cs35l35->regmap, CS35L35_REV_ID, ®);
1573 ret = regmap_register_patch(cs35l35->regmap, cs35l35_errata_patch,
1584 regmap_write(cs35l35->regmap, CS35L35_INT_MASK_1,
1586 regmap_write(cs35l35->regmap, CS35L35_INT_MASK_2,
1588 regmap_write(cs35l35->regmap, CS35L35_INT_MASK_3,
1590 regmap_write(cs35l35->regmap, CS35L35_INT_MASK_4,
1593 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2,
1597 if (cs35l35->pdata.bst_pdn_fet_on)
1598 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2,
1602 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL2,
1606 regmap_update_bits(cs35l35->regmap, CS35L35_PWRCTL3,
1610 regmap_update_bits(cs35l35->regmap, CS35L35_PROTECT_CTL,
1623 regulator_bulk_disable(cs35l35->num_supplies,
1624 cs35l35->supplies);
1625 gpiod_set_value_cansleep(cs35l35->reset_gpio, 0);
1632 struct cs35l35_private *cs35l35 = i2c_get_clientdata(i2c_client);
1634 regulator_bulk_disable(cs35l35->num_supplies, cs35l35->supplies);
1635 gpiod_set_value_cansleep(cs35l35->reset_gpio, 0);
1639 {.compatible = "cirrus,cs35l35"},
1645 {"cs35l35", 0},
1653 .name = "cs35l35",