Lines Matching +full:dsp +full:- +full:irq

1 // SPDX-License-Identifier: GPL-2.0-only
27 #include <sound/cs-amp-lib.h>
31 #include <sound/soc-dapm.h>
43 flush_work(&cs35l56->dsp_work);
66 static DECLARE_TLV_DB_SCALE(vol_tlv, -10000, 25, 0);
181 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
186 dev_dbg(cs35l56->base.dev, "play: %d\n", event);
191 return regmap_write(cs35l56->base.regmap, CS35L56_DSP_VIRTUAL1_MBOX_1,
195 ret = regmap_read_poll_timeout(cs35l56->base.regmap,
196 cs35l56->base.fw_reg->transducer_actual_ps,
201 dev_err(cs35l56->base.dev, "PS0 wait failed: %d\n", ret);
204 return cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_PAUSE);
319 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
322 dev_dbg(cs35l56->base.dev, "%s: %d\n", __func__, event);
329 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(codec_dai->component);
332 dev_dbg(cs35l56->base.dev, "%s: %#x\n", __func__, fmt);
338 dev_err(cs35l56->base.dev, "Unsupported clock source mode\n");
339 return -EINVAL;
345 cs35l56->tdm_mode = true;
349 cs35l56->tdm_mode = false;
352 dev_err(cs35l56->base.dev, "Unsupported DAI format\n");
353 return -EINVAL;
369 dev_err(cs35l56->base.dev, "Invalid clock invert\n");
370 return -EINVAL;
373 regmap_update_bits(cs35l56->base.regmap,
379 /* Hi-Z DOUT in unused slots and when all TX are disabled */
380 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL3,
406 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
409 dev_dbg(cs35l56->base.dev, "tdm config cleared\n");
410 cs35l56->asp_slot_width = 0;
411 cs35l56->asp_slot_count = 0;
416 dev_err(cs35l56->base.dev, "tdm invalid slot width %d\n", slot_width);
417 return -EINVAL;
422 dev_err(cs35l56->base.dev, "tdm invalid slot count %d\n", slots);
423 return -EINVAL;
426 cs35l56->asp_slot_width = (u8)slot_width;
427 cs35l56->asp_slot_count = (u8)slots;
437 regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL1,
439 regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL5,
442 dev_dbg(cs35l56->base.dev, "tdm slot width: %u count: %u tx_mask: %#x rx_mask: %#x\n",
443 cs35l56->asp_slot_width, cs35l56->asp_slot_count, tx_mask, rx_mask);
452 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
457 if (cs35l56->asp_slot_width)
458 asp_width = cs35l56->asp_slot_width;
462 dev_dbg(cs35l56->base.dev, "%s: wl=%d, width=%d, rate=%d",
465 if (!cs35l56->sysclk_set) {
466 unsigned int slots = cs35l56->asp_slot_count;
474 if (!cs35l56->tdm_mode)
481 dev_err(cs35l56->base.dev, "%s: Invalid BCLK %u\n", __func__, bclk_freq);
482 return -EINVAL;
485 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL1,
490 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
491 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL2,
494 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_DATA_CONTROL5,
497 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL2,
500 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_DATA_CONTROL1,
510 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
514 cs35l56->sysclk_set = false;
522 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL1,
525 cs35l56->sysclk_set = true;
546 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
549 cs35l56->rx_mask = tx_mask;
550 cs35l56->tx_mask = rx_mask;
559 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
565 dev_dbg(cs35l56->base.dev, "%s: rate %d\n", __func__, params_rate(params));
567 if (!cs35l56->base.init_done)
568 return -ENODEV;
571 return -EINVAL;
579 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
582 pconfig.ch_mask = cs35l56->rx_mask;
586 pconfig.ch_mask = cs35l56->tx_mask;
591 pconfig.ch_mask = GENMASK(sconfig.ch_count - 1, 0);
596 ret = sdw_stream_add_slave(cs35l56->sdw_peripheral, &sconfig, &pconfig,
599 dev_err(dai->dev, "Failed to add sdw stream: %d\n", ret);
609 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
612 if (!cs35l56->sdw_peripheral)
613 return -EINVAL;
615 sdw_stream_remove_slave(cs35l56->sdw_peripheral, sdw_stream);
638 .name = "cs35l56-asp1",
659 .name = "cs35l56-sdw1",
672 .name = "cs35l56-sdw1c",
690 if (cs35l56->base.secured || !cs35l56->base.cal_data_valid)
691 return -ENODATA;
693 ret = wm_adsp_run(&cs35l56->dsp);
697 ret = cs_amp_write_cal_coeffs(&cs35l56->dsp.cs_dsp,
698 cs35l56->base.calibration_controls,
699 &cs35l56->base.cal_data);
701 wm_adsp_stop(&cs35l56->dsp);
704 dev_info(cs35l56->base.dev, "Calibration applied\n");
718 cs35l56->dsp.bin_mandatory = (load_firmware && cs35l56->fallback_fw_suffix);
720 ret = wm_adsp_power_up(&cs35l56->dsp, load_firmware);
721 if ((ret == -ENOENT) && cs35l56->dsp.bin_mandatory) {
722 cs35l56->dsp.fwf_suffix = cs35l56->fallback_fw_suffix;
723 cs35l56->fallback_fw_suffix = NULL;
724 cs35l56->dsp.bin_mandatory = false;
725 ret = wm_adsp_power_up(&cs35l56->dsp, load_firmware);
729 dev_dbg(cs35l56->base.dev, "wm_adsp_power_up ret %d\n", ret);
747 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT);
755 * Disable SoundWire interrupts to prevent race with IRQ work.
756 * Setting sdw_irq_no_unmask prevents the handler re-enabling
759 if (cs35l56->sdw_peripheral) {
760 cs35l56->sdw_irq_no_unmask = true;
761 flush_work(&cs35l56->sdw_irq_work);
762 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1, 0);
763 sdw_read_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1);
764 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1, 0xFF);
765 flush_work(&cs35l56->sdw_irq_work);
768 ret = cs35l56_firmware_shutdown(&cs35l56->base);
775 * power-up wm_adsp without downloading firmware.
781 mutex_lock(&cs35l56->base.irq_lock);
783 reinit_completion(&cs35l56->init_completion);
785 cs35l56->soft_resetting = true;
786 cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral);
788 if (cs35l56->sdw_peripheral) {
790 * The system-reset causes the CS35L56 to detach from the bus.
791 * Wait for the manager to re-enumerate the CS35L56 and
794 if (!wait_for_completion_timeout(&cs35l56->init_completion,
796 dev_err(cs35l56->base.dev, "%s: init_completion timed out (SDW)\n",
804 regmap_clear_bits(cs35l56->base.regmap,
805 cs35l56->base.fw_reg->prot_sts,
807 cs35l56->base.fw_patched = true;
810 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT);
813 mutex_unlock(&cs35l56->base.irq_lock);
815 /* Re-enable SoundWire interrupts */
816 if (cs35l56->sdw_peripheral) {
817 cs35l56->sdw_irq_no_unmask = false;
818 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1,
832 if (!cs35l56->base.init_done)
835 pm_runtime_get_sync(cs35l56->base.dev);
837 ret = cs35l56_read_prot_status(&cs35l56->base, &firmware_missing, &firmware_version);
842 kfree(cs35l56->dsp.fwf_name);
844 cs35l56->dsp.fwf_name = kasprintf(GFP_KERNEL, "%02x-dsp1", cs35l56->base.rev);
847 cs35l56->dsp.fwf_name = kasprintf(GFP_KERNEL,
848 "%02x%s-%06x-dsp1",
849 cs35l56->base.rev,
850 cs35l56->base.secured ? "-s" : "",
854 if (!cs35l56->dsp.fwf_name)
857 dev_dbg(cs35l56->base.dev, "DSP fwf name: '%s' system name: '%s'\n",
858 cs35l56->dsp.fwf_name, cs35l56->dsp.system_name);
872 cs35l56_log_tuning(&cs35l56->base, &cs35l56->dsp.cs_dsp);
874 pm_runtime_put_autosuspend(cs35l56->base.dev);
879 if (cs35l56->dsp.fwf_suffix)
882 if (!cs35l56->sdw_peripheral)
885 cs35l56->dsp.fwf_suffix = devm_kasprintf(cs35l56->base.dev, GFP_KERNEL,
887 cs35l56->sdw_link_num,
888 cs35l56->sdw_unique_id);
889 if (!cs35l56->dsp.fwf_suffix)
890 return -ENOMEM;
897 if ((cs35l56->base.type == 0x56) && (cs35l56->base.rev == 0xb0)) {
898 cs35l56->fallback_fw_suffix = cs35l56->dsp.fwf_suffix;
899 cs35l56->dsp.fwf_suffix = cs35l56->component->name_prefix;
908 struct dentry *debugfs_root = component->debugfs_root;
914 if (!cs35l56->dsp.system_name &&
915 (snd_soc_card_get_pci_ssid(component->card, &vendor, &device) == 0)) {
917 if (cs35l56->speaker_id >= 0) {
918 cs35l56->dsp.system_name = devm_kasprintf(cs35l56->base.dev,
920 "%04x%04x-spkid%d",
922 cs35l56->speaker_id);
924 cs35l56->dsp.system_name = devm_kasprintf(cs35l56->base.dev,
929 if (!cs35l56->dsp.system_name)
930 return -ENOMEM;
933 if (!wait_for_completion_timeout(&cs35l56->init_completion,
935 dev_err(cs35l56->base.dev, "%s: init_completion timed out\n", __func__);
936 return -ENODEV;
939 cs35l56->dsp.part = kasprintf(GFP_KERNEL, "cs35l%02x", cs35l56->base.type);
940 if (!cs35l56->dsp.part)
941 return -ENOMEM;
943 cs35l56->component = component;
948 wm_adsp2_component_probe(&cs35l56->dsp, component);
950 debugfs_create_bool("init_done", 0444, debugfs_root, &cs35l56->base.init_done);
951 debugfs_create_bool("can_hibernate", 0444, debugfs_root, &cs35l56->base.can_hibernate);
952 debugfs_create_bool("fw_patched", 0444, debugfs_root, &cs35l56->base.fw_patched);
955 switch (cs35l56->base.type) {
967 ret = -ENODEV;
972 return dev_err_probe(cs35l56->base.dev, ret, "unable to add controls\n");
974 queue_work(cs35l56->dsp_wq, &cs35l56->dsp_work);
983 cancel_work_sync(&cs35l56->dsp_work);
985 if (cs35l56->dsp.cs_dsp.booted)
986 wm_adsp_power_down(&cs35l56->dsp);
988 wm_adsp2_component_remove(&cs35l56->dsp, component);
990 kfree(cs35l56->dsp.part);
991 cs35l56->dsp.part = NULL;
993 kfree(cs35l56->dsp.fwf_name);
994 cs35l56->dsp.fwf_name = NULL;
996 cs35l56->component = NULL;
1039 return cs35l56_runtime_suspend_common(&cs35l56->base);
1046 return cs35l56_runtime_resume_common(&cs35l56->base, false);
1055 if (cs35l56->component)
1056 flush_work(&cs35l56->dsp_work);
1061 * clear it. Prevent this race by temporarily disabling the parent irq
1064 if (cs35l56->base.irq)
1065 disable_irq(cs35l56->base.irq);
1082 if (cs35l56->base.reset_gpio) {
1083 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1087 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1099 /* Handlers are now disabled so the parent IRQ can safely be re-enabled. */
1100 if (cs35l56->base.irq)
1101 enable_irq(cs35l56->base.irq);
1118 * disabling the parent irq until we complete resume().
1120 if (cs35l56->base.irq)
1121 disable_irq(cs35l56->base.irq);
1134 /* Ensure a spec-compliant RESET pulse. */
1135 if (cs35l56->base.reset_gpio) {
1136 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1141 ret = regulator_bulk_enable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1148 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
1162 * We might have done a hard reset or the CS35L56 was power-cycled
1167 /* Undo pm_runtime_force_suspend() before re-enabling the irq */
1169 if (cs35l56->base.irq)
1170 enable_irq(cs35l56->base.irq);
1176 if (!cs35l56->component)
1179 ret = cs35l56_is_fw_reload_needed(&cs35l56->base);
1180 dev_dbg(cs35l56->base.dev, "fw_reload_needed: %d\n", ret);
1184 cs35l56->base.fw_patched = false;
1185 wm_adsp_power_down(&cs35l56->dsp);
1186 queue_work(cs35l56->dsp_wq, &cs35l56->dsp_work);
1190 * a BIAS_OFF->BIAS_STANDBY transition to complete dsp patching.
1197 static int cs35l56_control_add_nop(struct wm_adsp *dsp, struct cs_dsp_coeff_ctl *cs_ctl)
1204 struct wm_adsp *dsp;
1207 cs35l56->dsp_wq = create_singlethread_workqueue("cs35l56-dsp");
1208 if (!cs35l56->dsp_wq)
1209 return -ENOMEM;
1211 INIT_WORK(&cs35l56->dsp_work, cs35l56_dsp_work);
1213 dsp = &cs35l56->dsp;
1214 cs35l56_init_cs_dsp(&cs35l56->base, &dsp->cs_dsp);
1217 * dsp->part is filled in later as it is based on the DEVID. In a
1221 dsp->fw = 12;
1222 dsp->wmfw_optional = true;
1225 * None of the firmware controls need to be exported so add a no-op
1228 dsp->control_add = &cs35l56_control_add_nop;
1230 dev_dbg(cs35l56->base.dev, "DSP system name: '%s'\n", dsp->system_name);
1232 ret = wm_halo_init(dsp);
1234 dev_err(cs35l56->base.dev, "wm_halo_init failed\n");
1243 struct device *dev = cs35l56->base.dev;
1247 ret = device_property_read_string(dev, "cirrus,firmware-uid", &prop);
1253 if (cs35l56->speaker_id >= 0)
1254 cs35l56->dsp.system_name = devm_kasprintf(dev, GFP_KERNEL, "%s-spkid%d",
1255 prop, cs35l56->speaker_id);
1257 cs35l56->dsp.system_name = devm_kstrdup(dev, prop, GFP_KERNEL);
1259 if (cs35l56->dsp.system_name == NULL)
1260 return -ENOMEM;
1262 dev_dbg(dev, "Firmware UID: %s\n", cs35l56->dsp.system_name);
1268 * Some SoundWire laptops have a spk-id-gpios property but it points to
1275 { "spk-id-gpios", &cs35l56_af01_first_gpio, 1 },
1292 af01_fwnode = device_get_named_child_node(cs35l56->base.dev, "AF01");
1294 dev_dbg(cs35l56->base.dev, "No AF01 node\n");
1295 return -ENOENT;
1298 ret = acpi_dev_get_property(ACPI_COMPANION(cs35l56->base.dev),
1299 "spk-id-gpios", ACPI_TYPE_PACKAGE, &obj);
1301 dev_dbg(cs35l56->base.dev, "Could not get spk-id-gpios package: %d\n", ret);
1303 return -ENOENT;
1306 /* The broken properties we can handle are a 4-element package (one GPIO) */
1307 if (obj->package.count != 4) {
1308 dev_warn(cs35l56->base.dev, "Unexpected spk-id element count %d\n",
1309 obj->package.count);
1311 return -ENOENT;
1315 if (!fwnode_property_present(af01_fwnode, "spk-id-gpios")) {
1326 return dev_err_probe(cs35l56->base.dev, ret,
1330 ret = devm_add_action_or_reset(cs35l56->base.dev,
1338 dev_dbg(cs35l56->base.dev, "Added spk-id-gpios mapping to AF01\n");
1341 desc = fwnode_gpiod_get_index(af01_fwnode, "spk-id", 0, GPIOD_IN, NULL);
1345 return dev_err_probe(cs35l56->base.dev, ret, "Get GPIO from AF01 failed\n");
1353 dev_err_probe(cs35l56->base.dev, ret, "Error reading spk-id GPIO\n");
1359 dev_info(cs35l56->base.dev, "Got spk-id from AF01\n");
1368 init_completion(&cs35l56->init_completion);
1369 mutex_init(&cs35l56->base.irq_lock);
1370 cs35l56->base.cal_index = -1;
1371 cs35l56->speaker_id = -ENOENT;
1373 dev_set_drvdata(cs35l56->base.dev, cs35l56);
1375 cs35l56_fill_supply_names(cs35l56->supplies);
1376 ret = devm_regulator_bulk_get(cs35l56->base.dev, ARRAY_SIZE(cs35l56->supplies),
1377 cs35l56->supplies);
1379 return dev_err_probe(cs35l56->base.dev, ret, "Failed to request supplies\n");
1382 cs35l56->base.reset_gpio = devm_gpiod_get_optional(cs35l56->base.dev, "reset",
1384 if (IS_ERR(cs35l56->base.reset_gpio)) {
1385 ret = PTR_ERR(cs35l56->base.reset_gpio);
1390 if (ret != -EBUSY)
1391 return dev_err_probe(cs35l56->base.dev, ret, "Failed to get reset GPIO\n");
1393 dev_info(cs35l56->base.dev, "Reset GPIO busy, assume shared reset\n");
1394 cs35l56->base.reset_gpio = NULL;
1397 ret = regulator_bulk_enable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1399 return dev_err_probe(cs35l56->base.dev, ret, "Failed to enable supplies\n");
1401 if (cs35l56->base.reset_gpio) {
1403 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1405 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
1408 ret = cs35l56_get_speaker_id(&cs35l56->base);
1409 if (ACPI_COMPANION(cs35l56->base.dev) && cs35l56->sdw_peripheral && (ret == -ENOENT))
1412 if ((ret < 0) && (ret != -ENOENT))
1415 cs35l56->speaker_id = ret;
1423 dev_err_probe(cs35l56->base.dev, ret, "DSP init failed\n");
1427 ret = devm_snd_soc_register_component(cs35l56->base.dev,
1431 dev_err_probe(cs35l56->base.dev, ret, "Register codec failed\n");
1438 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1439 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1453 if (cs35l56->soft_resetting)
1456 if (cs35l56->base.init_done)
1459 pm_runtime_set_autosuspend_delay(cs35l56->base.dev, 100);
1460 pm_runtime_use_autosuspend(cs35l56->base.dev);
1461 pm_runtime_set_active(cs35l56->base.dev);
1462 pm_runtime_enable(cs35l56->base.dev);
1464 ret = cs35l56_hw_init(&cs35l56->base);
1468 ret = cs35l56_set_patch(&cs35l56->base);
1472 ret = cs35l56_get_calibration(&cs35l56->base);
1476 if (!cs35l56->base.reset_gpio) {
1477 dev_dbg(cs35l56->base.dev, "No reset gpio: using soft reset\n");
1478 cs35l56->soft_resetting = true;
1479 cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral);
1480 if (cs35l56->sdw_peripheral) {
1481 /* Keep alive while we wait for re-enumeration */
1482 pm_runtime_get_noresume(cs35l56->base.dev);
1488 if (cs35l56->soft_resetting) {
1489 cs35l56->soft_resetting = false;
1491 /* Done re-enumerating after one-time init so release the keep-alive */
1492 if (cs35l56->sdw_peripheral && !cs35l56->base.init_done)
1493 pm_runtime_put_noidle(cs35l56->base.dev);
1495 regcache_mark_dirty(cs35l56->base.regmap);
1496 ret = cs35l56_wait_for_firmware_boot(&cs35l56->base);
1500 dev_dbg(cs35l56->base.dev, "Firmware rebooted after soft reset\n");
1502 regcache_cache_only(cs35l56->base.regmap, false);
1505 /* Disable auto-hibernate so that runtime_pm has control */
1506 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE);
1511 regcache_sync(cs35l56->base.regmap);
1513 /* Set ASP1 DOUT to high-impedance when it is not transmitting audio data. */
1514 ret = regmap_set_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL3,
1517 return dev_err_probe(cs35l56->base.dev, ret, "Failed to write ASP1_CONTROL3\n");
1519 cs35l56->base.init_done = true;
1520 complete(&cs35l56->init_completion);
1528 cs35l56->base.init_done = false;
1534 if (cs35l56->base.irq)
1535 devm_free_irq(cs35l56->base.dev, cs35l56->base.irq, &cs35l56->base);
1537 destroy_workqueue(cs35l56->dsp_wq);
1539 pm_runtime_dont_use_autosuspend(cs35l56->base.dev);
1540 pm_runtime_suspend(cs35l56->base.dev);
1541 pm_runtime_disable(cs35l56->base.dev);
1543 regcache_cache_only(cs35l56->base.regmap, true);
1545 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1546 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);