Lines Matching defs:cs35l41
3 // cs35l41.c -- CS35l41 ALSA SoC audio driver
26 #include "cs35l41.h"
188 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(component);
193 if (cs35l41->dsp.cs_dsp.booted)
198 if (cs35l41->dsp.preloaded)
201 if (cs35l41->dsp.cs_dsp.running) {
217 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(component);
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",
243 return cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap,
246 return cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap,
360 static void cs35l41_boost_enable(struct cs35l41_private *cs35l41, unsigned int enable)
362 switch (cs35l41->hw_cfg.bst_type) {
366 regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, CS35L41_BST_EN_MASK,
375 static void cs35l41_error_release(struct cs35l41_private *cs35l41, unsigned int irq_err_bit,
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);
386 struct cs35l41_private *cs35l41 = data;
392 ret = pm_runtime_resume_and_get(cs35l41->dev);
394 dev_err(cs35l41->dev,
403 regmap_read(cs35l41->regmap,
406 regmap_read(cs35l41->regmap,
417 regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK4,
427 dev_crit_ratelimited(cs35l41->dev, "Amp short error\n");
428 cs35l41_error_release(cs35l41, CS35L41_AMP_SHORT_ERR, CS35L41_AMP_SHORT_ERR_RLS);
433 dev_crit_ratelimited(cs35l41->dev, "Over temperature warning\n");
434 cs35l41_error_release(cs35l41, CS35L41_TEMP_WARN, CS35L41_TEMP_WARN_ERR_RLS);
439 dev_crit_ratelimited(cs35l41->dev, "Over temperature error\n");
440 cs35l41_error_release(cs35l41, CS35L41_TEMP_ERR, CS35L41_TEMP_ERR_RLS);
445 dev_crit_ratelimited(cs35l41->dev, "VBST Over Voltage error\n");
446 cs35l41_boost_enable(cs35l41, 0);
447 cs35l41_error_release(cs35l41, CS35L41_BST_OVP_ERR, CS35L41_BST_OVP_ERR_RLS);
448 cs35l41_boost_enable(cs35l41, 1);
453 dev_crit_ratelimited(cs35l41->dev, "DCM VBST Under Voltage Error\n");
454 cs35l41_boost_enable(cs35l41, 0);
455 cs35l41_error_release(cs35l41, CS35L41_BST_DCM_UVP_ERR, CS35L41_BST_UVP_ERR_RLS);
456 cs35l41_boost_enable(cs35l41, 1);
461 dev_crit_ratelimited(cs35l41->dev, "LBST error: powering off!\n");
462 cs35l41_boost_enable(cs35l41, 0);
463 cs35l41_error_release(cs35l41, CS35L41_BST_SHORT_ERR, CS35L41_BST_SHORT_ERR_RLS);
464 cs35l41_boost_enable(cs35l41, 1);
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_mark_last_busy(cs35l41->dev);
488 pm_runtime_put_autosuspend(cs35l41->dev);
513 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(component);
518 regmap_multi_reg_write_bypassed(cs35l41->regmap,
522 ret = cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type,
523 1, cs35l41->dsp.cs_dsp.running);
526 ret = cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type,
527 0, cs35l41->dsp.cs_dsp.running);
529 regmap_multi_reg_write_bypassed(cs35l41->regmap,
534 dev_err(cs35l41->dev, "Invalid event = 0x%x\n", event);
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");
707 dev_warn(cs35l41->dev, "Invalid or unsupported DAI format\n");
724 dev_warn(cs35l41->dev, "Invalid DAI clock INV\n");
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);
777 regmap_update_bits(cs35l41->regmap, CS35L41_GLOBAL_CLK_CTRL,
782 regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT,
785 regmap_update_bits(cs35l41->regmap, CS35L41_SP_RX_WL,
789 regmap_update_bits(cs35l41->regmap, CS35L41_SP_FORMAT,
792 regmap_update_bits(cs35l41->regmap, CS35L41_SP_TX_WL,
836 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(component);
850 dev_err(cs35l41->dev, "Invalid CLK Config\n");
857 dev_err(cs35l41->dev, "Invalid CLK Config: %d, freq: %u\n",
862 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
865 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
868 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
871 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
873 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
876 regmap_update_bits(cs35l41->regmap, CS35L41_PLL_CLK_CTRL,
886 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(dai->component);
894 dev_err(cs35l41->dev, "Invalid CLK Config freq: %u\n", freq);
898 dev_dbg(cs35l41->dev, "Set DAI sysclk %d\n", freq);
912 regmap_write(cs35l41->regmap, CS35L41_TST_FS_MON0, val);
917 static int cs35l41_set_pdata(struct cs35l41_private *cs35l41)
919 struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg;
929 ret = cs35l41_init_boost(cs35l41->dev, cs35l41->regmap, hw_cfg);
935 regmap_update_bits(cs35l41->regmap, CS35L41_SP_HIZ_CTRL, CS35L41_ASP_DOUT_HIZ_MASK,
951 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(component);
955 if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST) {
967 return wm_adsp2_component_probe(&cs35l41->dsp, component);
972 struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(component);
974 wm_adsp2_component_remove(&cs35l41->dsp, component);
987 .name = "cs35l41-pcm",
1009 .name = "cs35l41-codec",
1095 static int cs35l41_dsp_init(struct cs35l41_private *cs35l41)
1100 dsp = &cs35l41->dsp;
1101 dsp->part = "cs35l41";
1105 cs35l41_configure_cs_dsp(cs35l41->dev, cs35l41->regmap, &dsp->cs_dsp);
1107 ret = cs35l41_write_fs_errata(cs35l41->dev, cs35l41->regmap);
1113 dev_err(cs35l41->dev, "wm_halo_init failed: %d\n", ret);
1117 ret = regmap_write(cs35l41->regmap, CS35L41_DSP1_RX5_SRC,
1120 dev_err(cs35l41->dev, "Write INPUT_SRC_VPMON failed: %d\n", ret);
1123 ret = regmap_write(cs35l41->regmap, CS35L41_DSP1_RX6_SRC,
1126 dev_err(cs35l41->dev, "Write INPUT_SRC_CLASSH failed: %d\n", ret);
1129 ret = regmap_write(cs35l41->regmap, CS35L41_DSP1_RX7_SRC,
1132 dev_err(cs35l41->dev, "Write INPUT_SRC_TEMPMON failed: %d\n", ret);
1135 ret = regmap_write(cs35l41->regmap, CS35L41_DSP1_RX8_SRC,
1138 dev_err(cs35l41->dev, "Write INPUT_SRC_RSVD failed: %d\n", ret);
1150 static int cs35l41_acpi_get_name(struct cs35l41_private *cs35l41)
1152 acpi_handle handle = ACPI_HANDLE(cs35l41->dev);
1168 cs35l41->dsp.system_name = sub;
1169 dev_dbg(cs35l41->dev, "Subsystem ID: %s\n", cs35l41->dsp.system_name);
1174 int cs35l41_probe(struct cs35l41_private *cs35l41, const struct cs35l41_hw_cfg *hw_cfg)
1181 cs35l41->hw_cfg = *hw_cfg;
1183 ret = cs35l41_handle_pdata(cs35l41->dev, &cs35l41->hw_cfg);
1189 cs35l41->supplies[i].supply = cs35l41_supplies[i];
1191 ret = devm_regulator_bulk_get(cs35l41->dev, CS35L41_NUM_SUPPLIES,
1192 cs35l41->supplies);
1194 dev_err(cs35l41->dev, "Failed to request core supplies: %d\n", ret);
1198 ret = regulator_bulk_enable(CS35L41_NUM_SUPPLIES, cs35l41->supplies);
1200 dev_err(cs35l41->dev, "Failed to enable core supplies: %d\n", ret);
1205 cs35l41->reset_gpio = devm_gpiod_get_optional(cs35l41->dev, "reset",
1207 if (IS_ERR(cs35l41->reset_gpio)) {
1208 ret = PTR_ERR(cs35l41->reset_gpio);
1209 cs35l41->reset_gpio = NULL;
1211 dev_info(cs35l41->dev,
1214 dev_err(cs35l41->dev,
1219 if (cs35l41->reset_gpio) {
1222 gpiod_set_value_cansleep(cs35l41->reset_gpio, 1);
1227 ret = regmap_read_poll_timeout(cs35l41->regmap, CS35L41_IRQ1_STATUS4,
1231 dev_err(cs35l41->dev,
1236 regmap_read(cs35l41->regmap, CS35L41_IRQ1_STATUS3, &int_status);
1238 dev_err(cs35l41->dev, "OTP Boot error\n");
1243 ret = regmap_read(cs35l41->regmap, CS35L41_DEVID, ®id);
1245 dev_err(cs35l41->dev, "Get Device ID failed: %d\n", ret);
1249 ret = regmap_read(cs35l41->regmap, CS35L41_REVID, ®_revid);
1251 dev_err(cs35l41->dev, "Get Revision ID failed: %d\n", ret);
1262 dev_err(cs35l41->dev, "CS35L41 Device ID (%X). Expected ID %X\n",
1268 cs35l41_test_key_unlock(cs35l41->dev, cs35l41->regmap);
1270 ret = cs35l41_register_errata_patch(cs35l41->dev, cs35l41->regmap, reg_revid);
1274 ret = cs35l41_otp_unpack(cs35l41->dev, cs35l41->regmap);
1276 dev_err(cs35l41->dev, "OTP Unpack failed: %d\n", ret);
1280 cs35l41_test_key_lock(cs35l41->dev, cs35l41->regmap);
1282 irq_pol = cs35l41_gpio_config(cs35l41->regmap, &cs35l41->hw_cfg);
1285 regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1,
1287 if (cs35l41->hw_cfg.bst_type == CS35L41_SHD_BOOST_PASS ||
1288 cs35l41->hw_cfg.bst_type == CS35L41_SHD_BOOST_ACTV)
1289 regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK3, CS35L41_INT3_PLL_LOCK_MASK,
1292 ret = devm_request_threaded_irq(cs35l41->dev, cs35l41->irq, NULL, cs35l41_irq,
1294 "cs35l41", cs35l41);
1296 dev_err(cs35l41->dev, "Failed to request IRQ: %d\n", ret);
1300 ret = cs35l41_set_pdata(cs35l41);
1302 dev_err(cs35l41->dev, "Set pdata failed: %d\n", ret);
1306 ret = cs35l41_acpi_get_name(cs35l41);
1310 ret = cs35l41_dsp_init(cs35l41);
1314 pm_runtime_set_autosuspend_delay(cs35l41->dev, 3000);
1315 pm_runtime_use_autosuspend(cs35l41->dev);
1316 pm_runtime_mark_last_busy(cs35l41->dev);
1317 pm_runtime_set_active(cs35l41->dev);
1318 pm_runtime_get_noresume(cs35l41->dev);
1319 pm_runtime_enable(cs35l41->dev);
1321 ret = devm_snd_soc_register_component(cs35l41->dev,
1325 dev_err(cs35l41->dev, "Register codec failed: %d\n", ret);
1329 pm_runtime_put_autosuspend(cs35l41->dev);
1331 dev_info(cs35l41->dev, "Cirrus Logic CS35L41 (%x), Revision: %02X\n",
1337 pm_runtime_dont_use_autosuspend(cs35l41->dev);
1338 pm_runtime_disable(cs35l41->dev);
1339 pm_runtime_put_noidle(cs35l41->dev);
1341 wm_adsp2_remove(&cs35l41->dsp);
1343 cs35l41_safe_reset(cs35l41->regmap, cs35l41->hw_cfg.bst_type);
1344 regulator_bulk_disable(CS35L41_NUM_SUPPLIES, cs35l41->supplies);
1345 gpiod_set_value_cansleep(cs35l41->reset_gpio, 0);
1351 void cs35l41_remove(struct cs35l41_private *cs35l41)
1353 pm_runtime_get_sync(cs35l41->dev);
1354 pm_runtime_dont_use_autosuspend(cs35l41->dev);
1355 pm_runtime_disable(cs35l41->dev);
1357 regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1, 0xFFFFFFFF);
1358 if (cs35l41->hw_cfg.bst_type == CS35L41_SHD_BOOST_PASS ||
1359 cs35l41->hw_cfg.bst_type == CS35L41_SHD_BOOST_ACTV)
1360 regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK3, CS35L41_INT3_PLL_LOCK_MASK,
1362 kfree(cs35l41->dsp.system_name);
1363 wm_adsp2_remove(&cs35l41->dsp);
1364 cs35l41_safe_reset(cs35l41->regmap, cs35l41->hw_cfg.bst_type);
1366 pm_runtime_put_noidle(cs35l41->dev);
1368 regulator_bulk_disable(CS35L41_NUM_SUPPLIES, cs35l41->supplies);
1369 gpiod_set_value_cansleep(cs35l41->reset_gpio, 0);
1375 struct cs35l41_private *cs35l41 = dev_get_drvdata(dev);
1377 dev_dbg(cs35l41->dev, "Runtime suspend\n");
1379 if (!cs35l41->dsp.preloaded || !cs35l41->dsp.cs_dsp.running)
1382 cs35l41_enter_hibernate(dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type);
1384 regcache_cache_only(cs35l41->regmap, true);
1385 regcache_mark_dirty(cs35l41->regmap);
1392 struct cs35l41_private *cs35l41 = dev_get_drvdata(dev);
1395 dev_dbg(cs35l41->dev, "Runtime resume\n");
1397 if (!cs35l41->dsp.preloaded || !cs35l41->dsp.cs_dsp.running)
1400 regcache_cache_only(cs35l41->regmap, false);
1402 ret = cs35l41_exit_hibernate(cs35l41->dev, cs35l41->regmap);
1407 cs35l41_test_key_unlock(cs35l41->dev, cs35l41->regmap);
1408 ret = regcache_sync(cs35l41->regmap);
1409 cs35l41_test_key_lock(cs35l41->dev, cs35l41->regmap);
1411 dev_err(cs35l41->dev, "Failed to restore register cache: %d\n", ret);
1414 cs35l41_init_boost(cs35l41->dev, cs35l41->regmap, &cs35l41->hw_cfg);
1421 struct cs35l41_private *cs35l41 = dev_get_drvdata(dev);
1423 dev_dbg(cs35l41->dev, "System suspend, disabling IRQ\n");
1424 disable_irq(cs35l41->irq);
1431 struct cs35l41_private *cs35l41 = dev_get_drvdata(dev);
1433 dev_dbg(cs35l41->dev, "Late system suspend, reenabling IRQ\n");
1434 enable_irq(cs35l41->irq);
1441 struct cs35l41_private *cs35l41 = dev_get_drvdata(dev);
1443 dev_dbg(cs35l41->dev, "Early system resume, disabling IRQ\n");
1444 disable_irq(cs35l41->irq);
1451 struct cs35l41_private *cs35l41 = dev_get_drvdata(dev);
1453 dev_dbg(cs35l41->dev, "System resume, reenabling IRQ\n");
1454 enable_irq(cs35l41->irq);