Lines Matching +full:3 +full:- +full:ch1 +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0
3 // cs35l41.c -- CS35l41 ALSA SoC audio driver
5 // Copyright 2017-2021 Cirrus Logic, Inc.
23 #include <sound/soc-dapm.h>
165 return -EINVAL;
170 1, 913, TLV_DB_MINMAX_ITEM(-10200, 1200));
187 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
193 if (cs35l41->dsp.cs_dsp.booted)
198 if (cs35l41->dsp.preloaded)
201 if (cs35l41->dsp.cs_dsp.running) {
216 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
223 if (!cs35l41->dsp.cs_dsp.running)
226 ret = regmap_read(cs35l41->regmap, CS35L41_DSP_MBOX_2, &fw_status);
228 dev_err(cs35l41->dev,
238 dev_err(cs35l41->dev, "Firmware status is invalid: %u\n",
240 return -EINVAL;
243 return cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap,
246 return cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap,
331 3, 0x4CF, 0x391, dig_vol_tlv),
338 SOC_SINGLE("Aux Noise Gate CH1 Switch",
340 SOC_SINGLE("Aux Noise Gate CH1 Entry Delay",
342 SOC_SINGLE("Aux Noise Gate CH1 Threshold",
362 switch (cs35l41->hw_cfg.bst_type) {
366 regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, CS35L41_BST_EN_MASK,
378 regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, irq_err_bit);
379 regmap_write(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, 0);
380 regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, rel_err_bit, rel_err_bit);
381 regmap_update_bits(cs35l41->regmap, CS35L41_PROTECT_REL_ERR_IGN, rel_err_bit, 0);
392 ret = pm_runtime_resume_and_get(cs35l41->dev);
394 dev_err(cs35l41->dev,
403 regmap_read(cs35l41->regmap,
406 regmap_read(cs35l41->regmap,
413 !(status[2] & ~masks[2]) && !(status[3] & ~masks[3]))
416 if (status[3] & CS35L41_OTP_BOOT_DONE) {
417 regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK4,
424 * speaker out of Safe-Mode.
427 dev_crit_ratelimited(cs35l41->dev, "Amp short error\n");
433 dev_crit_ratelimited(cs35l41->dev, "Over temperature warning\n");
439 dev_crit_ratelimited(cs35l41->dev, "Over temperature error\n");
445 dev_crit_ratelimited(cs35l41->dev, "VBST Over Voltage error\n");
453 dev_crit_ratelimited(cs35l41->dev, "DCM VBST Under Voltage Error\n");
461 dev_crit_ratelimited(cs35l41->dev, "LBST error: powering off!\n");
469 regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS3, CS35L41_PLL_LOCK);
471 if (cs35l41->hw_cfg.bst_type == CS35L41_SHD_BOOST_ACTV ||
472 cs35l41->hw_cfg.bst_type == CS35L41_SHD_BOOST_PASS) {
473 ret = cs35l41_mdsync_up(cs35l41->regmap);
475 dev_err(cs35l41->dev, "MDSYNC-up failed: %d\n", ret);
477 dev_dbg(cs35l41->dev, "MDSYNC-up done\n");
479 dev_dbg(cs35l41->dev, "PUP-done status: %d\n",
487 pm_runtime_put_autosuspend(cs35l41->dev);
511 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
517 regmap_multi_reg_write_bypassed(cs35l41->regmap,
521 ret = cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type,
522 1, &cs35l41->dsp.cs_dsp);
525 ret = cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type,
526 0, &cs35l41->dsp.cs_dsp);
528 regmap_multi_reg_write_bypassed(cs35l41->regmap,
533 dev_err(cs35l41->dev, "Invalid event = 0x%x\n", event);
534 ret = -EINVAL;
556 SND_SOC_DAPM_AIF_OUT("ASPTX4", NULL, 0, CS35L41_SP_ENABLES, 3, 0),
679 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(dai->component);
681 return cs35l41_set_channels(cs35l41->dev, cs35l41->regmap, tx_n, tx_slot, rx_n, rx_slot);
686 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(dai->component);
696 dev_warn(cs35l41->dev, "Mixed provider/consumer mode unsupported\n");
697 return -EINVAL;
707 dev_warn(cs35l41->dev, "Invalid or unsupported DAI format\n");
708 return -EINVAL;
724 dev_warn(cs35l41->dev, "Invalid DAI clock INV\n");
725 return -EINVAL;
728 return regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT,
759 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(dai->component);
770 dev_err(cs35l41->dev, "Unsupported rate: %u\n", rate);
771 return -EINVAL;
776 regmap_update_bits(cs35l41->regmap, CS35L41_GLOBAL_CLK_CTRL,
780 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
781 regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT,
784 regmap_update_bits(cs35l41->regmap, CS35L41_SP_RX_WL,
788 regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT,
791 regmap_update_bits(cs35l41->regmap, CS35L41_SP_TX_WL,
808 return -EINVAL;
829 dev_err(cs35l41->dev, "Invalid CLK Config\n");
830 return -EINVAL;
836 dev_err(cs35l41->dev, "Invalid CLK Config: %d, freq: %u\n",
838 return -EINVAL;
841 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
844 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
847 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
850 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
852 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
855 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
865 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(dai->component);
873 dev_err(cs35l41->dev, "Invalid CLK Config freq: %u\n", freq);
874 return -EINVAL;
877 dev_dbg(cs35l41->dev, "Set DAI sysclk %d\n", freq);
884 /* Use hard-coded values */
891 regmap_write(cs35l41->regmap, CS35L41_TST_FS_MON0, val);
898 struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg;
901 if (!hw_cfg->valid)
902 return -EINVAL;
904 if (hw_cfg->bst_type == CS35L41_EXT_BOOST_NO_VSPK_SWITCH)
905 return -EINVAL;
908 ret = cs35l41_init_boost(cs35l41->dev, cs35l41->regmap, hw_cfg);
913 if (hw_cfg->dout_hiz <= CS35L41_ASP_DOUT_HIZ_MASK && hw_cfg->dout_hiz >= 0)
914 regmap_update_bits(cs35l41->regmap, CS35L41_SP_HIZ_CTRL, CS35L41_ASP_DOUT_HIZ_MASK,
915 hw_cfg->dout_hiz);
934 if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST) {
946 return wm_adsp2_component_probe(&cs35l41->dsp, component);
953 wm_adsp2_component_remove(&cs35l41->dsp, component);
974 .name = "cs35l41-pcm",
996 .name = "cs35l41-codec",
1014 struct cs35l41_gpio_cfg *gpio1 = &hw_cfg->gpio1;
1015 struct cs35l41_gpio_cfg *gpio2 = &hw_cfg->gpio2;
1021 * To correctly configure those systems add shared-boost-active and shared-boost-passive
1022 * properties mapped to the correct value in boost-type.
1025 if (device_property_read_bool(dev, "cirrus,shared-boost-active")) {
1026 hw_cfg->bst_type = CS35L41_SHD_BOOST_ACTV;
1027 } else if (device_property_read_bool(dev, "cirrus,shared-boost-passive")) {
1028 hw_cfg->bst_type = CS35L41_SHD_BOOST_PASS;
1030 ret = device_property_read_u32(dev, "cirrus,boost-type", &val);
1032 hw_cfg->bst_type = val;
1035 ret = device_property_read_u32(dev, "cirrus,boost-peak-milliamp", &val);
1037 hw_cfg->bst_ipk = val;
1039 hw_cfg->bst_ipk = -1;
1041 ret = device_property_read_u32(dev, "cirrus,boost-ind-nanohenry", &val);
1043 hw_cfg->bst_ind = val;
1045 hw_cfg->bst_ind = -1;
1047 ret = device_property_read_u32(dev, "cirrus,boost-cap-microfarad", &val);
1049 hw_cfg->bst_cap = val;
1051 hw_cfg->bst_cap = -1;
1053 ret = device_property_read_u32(dev, "cirrus,asp-sdout-hiz", &val);
1055 hw_cfg->dout_hiz = val;
1057 hw_cfg->dout_hiz = -1;
1060 gpio1->pol_inv = device_property_read_bool(dev, "cirrus,gpio1-polarity-invert");
1061 gpio1->out_en = device_property_read_bool(dev, "cirrus,gpio1-output-enable");
1062 ret = device_property_read_u32(dev, "cirrus,gpio1-src-select", &val);
1064 gpio1->func = val;
1065 gpio1->valid = true;
1069 gpio2->pol_inv = device_property_read_bool(dev, "cirrus,gpio2-polarity-invert");
1070 gpio2->out_en = device_property_read_bool(dev, "cirrus,gpio2-output-enable");
1071 ret = device_property_read_u32(dev, "cirrus,gpio2-src-select", &val);
1073 gpio2->func = val;
1074 gpio2->valid = true;
1077 hw_cfg->valid = true;
1088 dsp = &cs35l41->dsp;
1089 dsp->part = "cs35l41";
1090 dsp->fw = 9; /* 9 is WM_ADSP_FW_SPK_PROT in wm_adsp.c */
1091 dsp->toggle_preload = true;
1093 cs35l41_configure_cs_dsp(cs35l41->dev, cs35l41->regmap, &dsp->cs_dsp);
1095 ret = cs35l41_write_fs_errata(cs35l41->dev, cs35l41->regmap);
1101 dev_err(cs35l41->dev, "wm_halo_init failed: %d\n", ret);
1105 switch (cs35l41->hw_cfg.bst_type) {
1115 dev_err(cs35l41->dev, "wm_halo_init failed - Invalid Boost Type: %d\n",
1116 cs35l41->hw_cfg.bst_type);
1120 ret = regmap_write(cs35l41->regmap, CS35L41_DSP1_RX5_SRC, dsp1rx5_src);
1122 dev_err(cs35l41->dev, "Write DSP1RX5_SRC: %d failed: %d\n", dsp1rx5_src, ret);
1125 ret = regmap_write(cs35l41->regmap, CS35L41_DSP1_RX6_SRC, CS35L41_INPUT_SRC_VBSTMON);
1127 dev_err(cs35l41->dev, "Write CS35L41_INPUT_SRC_VBSTMON failed: %d\n", ret);
1130 ret = regmap_write(cs35l41->regmap, CS35L41_DSP1_RX7_SRC,
1133 dev_err(cs35l41->dev, "Write INPUT_SRC_TEMPMON failed: %d\n", ret);
1136 ret = regmap_write(cs35l41->regmap, CS35L41_DSP1_RX8_SRC,
1139 dev_err(cs35l41->dev, "Write INPUT_SRC_RSVD failed: %d\n", ret);
1153 struct acpi_device *adev = ACPI_COMPANION(cs35l41->dev);
1167 if (ret == -ENODATA) {
1176 ret = -ENOMEM;
1182 if (!device_property_read_string(cs35l41->dev, "cirrus,subsystem-id", &tmp)) {
1185 ret = -ENOMEM;
1193 cs35l41->dsp.system_name = sub;
1194 dev_info(cs35l41->dev, "Subsystem ID: %s\n", cs35l41->dsp.system_name);
1196 dev_warn(cs35l41->dev, "Subsystem ID not found\n");
1208 cs35l41->hw_cfg = *hw_cfg;
1210 ret = cs35l41_handle_pdata(cs35l41->dev, &cs35l41->hw_cfg);
1216 cs35l41->supplies[i].supply = cs35l41_supplies[i];
1218 ret = devm_regulator_bulk_get(cs35l41->dev, CS35L41_NUM_SUPPLIES,
1219 cs35l41->supplies);
1221 return dev_err_probe(cs35l41->dev, ret,
1224 ret = regulator_bulk_enable(CS35L41_NUM_SUPPLIES, cs35l41->supplies);
1226 return dev_err_probe(cs35l41->dev, ret,
1230 cs35l41->reset_gpio = devm_gpiod_get_optional(cs35l41->dev, "reset",
1232 if (IS_ERR(cs35l41->reset_gpio)) {
1233 ret = PTR_ERR(cs35l41->reset_gpio);
1234 cs35l41->reset_gpio = NULL;
1235 if (ret == -EBUSY) {
1236 dev_info(cs35l41->dev,
1239 dev_err_probe(cs35l41->dev, ret,
1244 if (cs35l41->reset_gpio) {
1247 gpiod_set_value_cansleep(cs35l41->reset_gpio, 1);
1252 ret = regmap_read_poll_timeout(cs35l41->regmap, CS35L41_IRQ1_STATUS4,
1256 dev_err_probe(cs35l41->dev, ret,
1261 regmap_read(cs35l41->regmap, CS35L41_IRQ1_STATUS3, &int_status);
1263 dev_err(cs35l41->dev, "OTP Boot error\n");
1264 ret = -EINVAL;
1268 ret = regmap_read(cs35l41->regmap, CS35L41_DEVID, ®id);
1270 dev_err_probe(cs35l41->dev, ret, "Get Device ID failed\n");
1274 ret = regmap_read(cs35l41->regmap, CS35L41_REVID, ®_revid);
1276 dev_err_probe(cs35l41->dev, ret, "Get Revision ID failed\n");
1287 dev_err(cs35l41->dev, "CS35L41 Device ID (%X). Expected ID %X\n",
1289 ret = -ENODEV;
1293 cs35l41_test_key_unlock(cs35l41->dev, cs35l41->regmap);
1295 ret = cs35l41_register_errata_patch(cs35l41->dev, cs35l41->regmap, reg_revid);
1299 ret = cs35l41_otp_unpack(cs35l41->dev, cs35l41->regmap);
1301 dev_err_probe(cs35l41->dev, ret, "OTP Unpack failed\n");
1305 cs35l41_test_key_lock(cs35l41->dev, cs35l41->regmap);
1307 irq_pol = cs35l41_gpio_config(cs35l41->regmap, &cs35l41->hw_cfg);
1310 regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1,
1312 if (cs35l41->hw_cfg.bst_type == CS35L41_SHD_BOOST_PASS ||
1313 cs35l41->hw_cfg.bst_type == CS35L41_SHD_BOOST_ACTV)
1314 regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK3, CS35L41_INT3_PLL_LOCK_MASK,
1317 ret = devm_request_threaded_irq(cs35l41->dev, cs35l41->irq, NULL, cs35l41_irq,
1321 dev_err_probe(cs35l41->dev, ret, "Failed to request IRQ\n");
1327 dev_err_probe(cs35l41->dev, ret, "Set pdata failed\n");
1339 pm_runtime_set_autosuspend_delay(cs35l41->dev, 3000);
1340 pm_runtime_use_autosuspend(cs35l41->dev);
1341 pm_runtime_set_active(cs35l41->dev);
1342 pm_runtime_get_noresume(cs35l41->dev);
1343 pm_runtime_enable(cs35l41->dev);
1345 ret = devm_snd_soc_register_component(cs35l41->dev,
1349 dev_err_probe(cs35l41->dev, ret, "Register codec failed\n");
1353 pm_runtime_put_autosuspend(cs35l41->dev);
1355 dev_info(cs35l41->dev, "Cirrus Logic CS35L41 (%x), Revision: %02X\n",
1361 pm_runtime_dont_use_autosuspend(cs35l41->dev);
1362 pm_runtime_disable(cs35l41->dev);
1363 pm_runtime_put_noidle(cs35l41->dev);
1365 wm_adsp2_remove(&cs35l41->dsp);
1367 cs35l41_safe_reset(cs35l41->regmap, cs35l41->hw_cfg.bst_type);
1368 regulator_bulk_disable(CS35L41_NUM_SUPPLIES, cs35l41->supplies);
1369 gpiod_set_value_cansleep(cs35l41->reset_gpio, 0);
1377 pm_runtime_get_sync(cs35l41->dev);
1378 pm_runtime_dont_use_autosuspend(cs35l41->dev);
1379 pm_runtime_disable(cs35l41->dev);
1381 regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1, 0xFFFFFFFF);
1382 if (cs35l41->hw_cfg.bst_type == CS35L41_SHD_BOOST_PASS ||
1383 cs35l41->hw_cfg.bst_type == CS35L41_SHD_BOOST_ACTV)
1384 regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK3, CS35L41_INT3_PLL_LOCK_MASK,
1386 kfree(cs35l41->dsp.system_name);
1387 wm_adsp2_remove(&cs35l41->dsp);
1388 cs35l41_safe_reset(cs35l41->regmap, cs35l41->hw_cfg.bst_type);
1390 pm_runtime_put_noidle(cs35l41->dev);
1392 regulator_bulk_disable(CS35L41_NUM_SUPPLIES, cs35l41->supplies);
1393 gpiod_set_value_cansleep(cs35l41->reset_gpio, 0);
1401 dev_dbg(cs35l41->dev, "Runtime suspend\n");
1403 if (!cs35l41->dsp.preloaded || !cs35l41->dsp.cs_dsp.running)
1406 cs35l41_enter_hibernate(dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type);
1408 regcache_cache_only(cs35l41->regmap, true);
1409 regcache_mark_dirty(cs35l41->regmap);
1419 dev_dbg(cs35l41->dev, "Runtime resume\n");
1421 if (!cs35l41->dsp.preloaded || !cs35l41->dsp.cs_dsp.running)
1424 regcache_cache_only(cs35l41->regmap, false);
1426 ret = cs35l41_exit_hibernate(cs35l41->dev, cs35l41->regmap);
1430 /* Test key needs to be unlocked to allow the OTP settings to re-apply */
1431 cs35l41_test_key_unlock(cs35l41->dev, cs35l41->regmap);
1432 ret = regcache_sync(cs35l41->regmap);
1433 cs35l41_test_key_lock(cs35l41->dev, cs35l41->regmap);
1435 dev_err(cs35l41->dev, "Failed to restore register cache: %d\n", ret);
1438 cs35l41_init_boost(cs35l41->dev, cs35l41->regmap, &cs35l41->hw_cfg);
1447 dev_dbg(cs35l41->dev, "System suspend, disabling IRQ\n");
1448 disable_irq(cs35l41->irq);
1457 dev_dbg(cs35l41->dev, "Late system suspend, reenabling IRQ\n");
1458 enable_irq(cs35l41->irq);
1467 dev_dbg(cs35l41->dev, "Early system resume, disabling IRQ\n");
1468 disable_irq(cs35l41->irq);
1477 dev_dbg(cs35l41->dev, "System resume, reenabling IRQ\n");
1478 enable_irq(cs35l41->irq);