Lines Matching +full:multiple +full:- +full:amp

1 // SPDX-License-Identifier: GPL-2.0-only
3 // Driver for Cirrus Logic CS35L56 smart amp
28 #include <sound/cs-amp-lib.h>
32 #include <sound/soc-dapm.h>
44 flush_work(&cs35l56->dsp_work);
67 static DECLARE_TLV_DB_SCALE(vol_tlv, -10000, 25, 0);
78 return cs35l56_cal_set_status_get(&cs35l56->base, ucontrol);
200 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
205 dev_dbg(cs35l56->base.dev, "play: %d\n", event);
210 return regmap_write(cs35l56->base.regmap, CS35L56_DSP_VIRTUAL1_MBOX_1,
214 ret = regmap_read_poll_timeout(cs35l56->base.regmap,
215 cs35l56->base.fw_reg->transducer_actual_ps,
220 dev_err(cs35l56->base.dev, "PS0 wait failed: %d\n", ret);
223 return cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_PAUSE);
236 SND_SOC_DAPM_OUT_DRV("AMP", SND_SOC_NOPM, 0, 0, NULL, 0),
294 { name" Source", "INTERPOLATOR", "AMP" }, \
299 { "AMP", NULL, "VDD_B" },
300 { "AMP", NULL, "VDD_AMP" },
311 { "AMP", NULL, "DSP1" },
312 { "SPK", NULL, "AMP" },
341 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
344 dev_dbg(cs35l56->base.dev, "%s: %d\n", __func__, event);
351 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(codec_dai->component);
354 dev_dbg(cs35l56->base.dev, "%s: %#x\n", __func__, fmt);
360 dev_err(cs35l56->base.dev, "Unsupported clock source mode\n");
361 return -EINVAL;
367 cs35l56->tdm_mode = true;
371 cs35l56->tdm_mode = false;
374 dev_err(cs35l56->base.dev, "Unsupported DAI format\n");
375 return -EINVAL;
391 dev_err(cs35l56->base.dev, "Invalid clock invert\n");
392 return -EINVAL;
395 regmap_update_bits(cs35l56->base.regmap,
401 /* Hi-Z DOUT in unused slots and when all TX are disabled */
402 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL3,
428 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
431 dev_dbg(cs35l56->base.dev, "tdm config cleared\n");
432 cs35l56->asp_slot_width = 0;
433 cs35l56->asp_slot_count = 0;
438 dev_err(cs35l56->base.dev, "tdm invalid slot width %d\n", slot_width);
439 return -EINVAL;
444 dev_err(cs35l56->base.dev, "tdm invalid slot count %d\n", slots);
445 return -EINVAL;
448 cs35l56->asp_slot_width = (u8)slot_width;
449 cs35l56->asp_slot_count = (u8)slots;
459 regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL1,
461 regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL5,
464 dev_dbg(cs35l56->base.dev, "tdm slot width: %u count: %u tx_mask: %#x rx_mask: %#x\n",
465 cs35l56->asp_slot_width, cs35l56->asp_slot_count, tx_mask, rx_mask);
474 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
479 if (cs35l56->asp_slot_width)
480 asp_width = cs35l56->asp_slot_width;
484 dev_dbg(cs35l56->base.dev, "%s: wl=%d, width=%d, rate=%d",
487 if (!cs35l56->sysclk_set) {
488 unsigned int slots = cs35l56->asp_slot_count;
496 if (!cs35l56->tdm_mode)
503 dev_err(cs35l56->base.dev, "%s: Invalid BCLK %u\n", __func__, bclk_freq);
504 return -EINVAL;
507 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL1,
512 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
513 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL2,
516 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_DATA_CONTROL5,
519 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL2,
522 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_DATA_CONTROL1,
532 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
536 cs35l56->sysclk_set = false;
544 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL1,
547 cs35l56->sysclk_set = true;
568 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
571 cs35l56->rx_mask = tx_mask;
572 cs35l56->tx_mask = rx_mask;
581 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
587 dev_dbg(cs35l56->base.dev, "%s: rate %d\n", __func__, params_rate(params));
589 if (!cs35l56->base.init_done)
590 return -ENODEV;
593 return -EINVAL;
601 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
604 pconfig.ch_mask = cs35l56->rx_mask;
608 pconfig.ch_mask = cs35l56->tx_mask;
613 pconfig.ch_mask = GENMASK(sconfig.ch_count - 1, 0);
618 ret = sdw_stream_add_slave(cs35l56->sdw_peripheral, &sconfig, &pconfig,
621 dev_err(dai->dev, "Failed to add sdw stream: %d\n", ret);
631 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
634 if (!cs35l56->sdw_peripheral)
635 return -EINVAL;
637 sdw_stream_remove_slave(cs35l56->sdw_peripheral, sdw_stream);
660 .name = "cs35l56-asp1",
681 .name = "cs35l56-sdw1",
694 .name = "cs35l56-sdw1c",
712 if (cs35l56->base.secured || !cs35l56->base.cal_data_valid)
713 return -ENODATA;
715 ret = wm_adsp_run(&cs35l56->dsp);
719 ret = cs_amp_write_cal_coeffs(&cs35l56->dsp.cs_dsp,
720 cs35l56->base.calibration_controls,
721 &cs35l56->base.cal_data);
723 wm_adsp_stop(&cs35l56->dsp);
726 dev_info(cs35l56->base.dev, "Calibration applied\n");
740 cs35l56->dsp.bin_mandatory = (load_firmware && cs35l56->fallback_fw_suffix);
742 ret = wm_adsp_power_up(&cs35l56->dsp, load_firmware);
743 if ((ret == -ENOENT) && cs35l56->dsp.bin_mandatory) {
744 cs35l56->dsp.fwf_suffix = cs35l56->fallback_fw_suffix;
745 cs35l56->fallback_fw_suffix = NULL;
746 cs35l56->dsp.bin_mandatory = false;
747 ret = wm_adsp_power_up(&cs35l56->dsp, load_firmware);
751 dev_dbg(cs35l56->base.dev, "wm_adsp_power_up ret %d\n", ret);
769 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT);
778 * Setting sdw_irq_no_unmask prevents the handler re-enabling
781 if (cs35l56->sdw_peripheral) {
782 cs35l56->sdw_irq_no_unmask = true;
783 flush_work(&cs35l56->sdw_irq_work);
784 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1, 0);
785 sdw_read_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1);
786 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1, 0xFF);
787 flush_work(&cs35l56->sdw_irq_work);
790 ret = cs35l56_firmware_shutdown(&cs35l56->base);
797 * power-up wm_adsp without downloading firmware.
803 mutex_lock(&cs35l56->base.irq_lock);
805 reinit_completion(&cs35l56->init_completion);
807 cs35l56->soft_resetting = true;
808 cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral);
810 if (cs35l56->sdw_peripheral) {
812 * The system-reset causes the CS35L56 to detach from the bus.
813 * Wait for the manager to re-enumerate the CS35L56 and
816 if (!wait_for_completion_timeout(&cs35l56->init_completion,
818 dev_err(cs35l56->base.dev, "%s: init_completion timed out (SDW)\n",
827 cs35l56_warn_if_firmware_missing(&cs35l56->base);
829 regmap_clear_bits(cs35l56->base.regmap,
830 cs35l56->base.fw_reg->prot_sts,
832 cs35l56->base.fw_patched = true;
835 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT);
838 mutex_unlock(&cs35l56->base.irq_lock);
840 /* Re-enable SoundWire interrupts */
841 if (cs35l56->sdw_peripheral) {
842 cs35l56->sdw_irq_no_unmask = false;
843 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1,
857 if (!cs35l56->base.init_done)
860 pm_runtime_get_sync(cs35l56->base.dev);
862 ret = cs35l56_read_prot_status(&cs35l56->base, &firmware_missing, &firmware_version);
867 kfree(cs35l56->dsp.fwf_name);
869 cs35l56->dsp.fwf_name = kasprintf(GFP_KERNEL, "%02x-dsp1", cs35l56->base.rev);
872 cs35l56->dsp.fwf_name = kasprintf(GFP_KERNEL,
873 "%02x%s-%06x-dsp1",
874 cs35l56->base.rev,
875 cs35l56->base.secured ? "-s" : "",
879 if (!cs35l56->dsp.fwf_name)
882 dev_dbg(cs35l56->base.dev, "DSP fwf name: '%s' system name: '%s'\n",
883 cs35l56->dsp.fwf_name, cs35l56->dsp.system_name);
897 cs35l56_log_tuning(&cs35l56->base, &cs35l56->dsp.cs_dsp);
899 pm_runtime_put_autosuspend(cs35l56->base.dev);
904 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(cs35l56->component);
918 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(cs35l56->component);
928 struct cs35l56_base *cs35l56_base = file->private_data;
938 ret = cs35l56_calibrate_debugfs_write(&cs35l56->base, from, count, ppos);
950 struct cs35l56_base *cs35l56_base = file->private_data;
959 ret = cs35l56_cal_ambient_debugfs_write(&cs35l56->base, from, count, ppos);
969 struct cs35l56_base *cs35l56_base = file->private_data;
978 ret = cs35l56_cal_data_debugfs_read(&cs35l56->base, to, count, ppos);
989 if (!cs35l56->base.cal_data_valid)
990 return -ENXIO;
992 if (cs35l56->base.secured)
993 return -EACCES;
1000 ret = cs_amp_write_cal_coeffs(&cs35l56->dsp.cs_dsp,
1001 cs35l56->base.calibration_controls,
1002 &cs35l56->base.cal_data);
1004 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT);
1006 ret = -EIO;
1018 struct cs35l56_base *cs35l56_base = file->private_data;
1022 ret = cs35l56_cal_data_debugfs_write(&cs35l56->base, from, count, ppos);
1023 if (ret == -ENODATA)
1026 return -EIO;
1054 if (!cs35l56->base.cal_data_valid)
1055 return -ENODATA;
1057 memcpy(ucontrol->value.bytes.data, &cs35l56->base.cal_data,
1058 sizeof(cs35l56->base.cal_data));
1070 * This control is write-only but mixer libraries often try to read
1075 memset(ucontrol->value.bytes.data, 0, sizeof(cs35l56->base.cal_data));
1085 const struct cirrus_amp_cal_data *cal_data = (const void *)ucontrol->value.bytes.data;
1088 if (cs35l56->base.cal_data_valid)
1089 return -EACCES;
1091 ret = cs35l56_stash_calibration(&cs35l56->base, cal_data);
1112 if (cs35l56->dsp.fwf_suffix)
1115 if (!cs35l56->sdw_peripheral)
1118 cs35l56->dsp.fwf_suffix = devm_kasprintf(cs35l56->base.dev, GFP_KERNEL,
1120 cs35l56->sdw_link_num,
1121 cs35l56->sdw_unique_id);
1122 if (!cs35l56->dsp.fwf_suffix)
1123 return -ENOMEM;
1130 if ((cs35l56->base.type == 0x56) && (cs35l56->base.rev == 0xb0)) {
1131 cs35l56->fallback_fw_suffix = cs35l56->dsp.fwf_suffix;
1132 cs35l56->dsp.fwf_suffix = cs35l56->component->name_prefix;
1142 struct dentry *debugfs_root = component->debugfs_root;
1148 if (!cs35l56->dsp.system_name &&
1149 (snd_soc_card_get_pci_ssid(component->card, &vendor, &device) == 0)) {
1151 if (cs35l56->speaker_id >= 0) {
1152 cs35l56->dsp.system_name = devm_kasprintf(cs35l56->base.dev,
1154 "%04x%04x-spkid%d",
1156 cs35l56->speaker_id);
1158 cs35l56->dsp.system_name = devm_kasprintf(cs35l56->base.dev,
1163 if (!cs35l56->dsp.system_name)
1164 return -ENOMEM;
1167 if (!wait_for_completion_timeout(&cs35l56->init_completion,
1169 dev_err(cs35l56->base.dev, "%s: init_completion timed out\n", __func__);
1170 return -ENODEV;
1173 cs35l56->dsp.part = kasprintf(GFP_KERNEL, "cs35l%02x", cs35l56->base.type);
1174 if (!cs35l56->dsp.part)
1175 return -ENOMEM;
1177 cs35l56->component = component;
1182 wm_adsp2_component_probe(&cs35l56->dsp, component);
1184 debugfs_create_bool("init_done", 0444, debugfs_root, &cs35l56->base.init_done);
1185 debugfs_create_bool("can_hibernate", 0444, debugfs_root, &cs35l56->base.can_hibernate);
1186 debugfs_create_bool("fw_patched", 0444, debugfs_root, &cs35l56->base.fw_patched);
1189 switch (cs35l56->base.type) {
1201 ret = -ENODEV;
1212 return dev_err_probe(cs35l56->base.dev, ret, "unable to add controls\n");
1219 cs35l56_create_cal_debugfs(&cs35l56->base, &cs35l56_cal_debugfs_fops);
1221 queue_work(cs35l56->dsp_wq, &cs35l56->dsp_work);
1230 cancel_work_sync(&cs35l56->dsp_work);
1232 cs35l56_remove_cal_debugfs(&cs35l56->base);
1234 if (cs35l56->dsp.cs_dsp.booted)
1235 wm_adsp_power_down(&cs35l56->dsp);
1237 wm_adsp2_component_remove(&cs35l56->dsp, component);
1239 kfree(cs35l56->dsp.part);
1240 cs35l56->dsp.part = NULL;
1242 kfree(cs35l56->dsp.fwf_name);
1243 cs35l56->dsp.fwf_name = NULL;
1245 cs35l56->component = NULL;
1289 return cs35l56_runtime_suspend_common(&cs35l56->base);
1296 return cs35l56_runtime_resume_common(&cs35l56->base, false);
1305 if (cs35l56->component)
1306 flush_work(&cs35l56->dsp_work);
1314 if (cs35l56->base.irq)
1315 disable_irq(cs35l56->base.irq);
1332 if (cs35l56->base.reset_gpio) {
1333 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1337 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1349 /* Handlers are now disabled so the parent IRQ can safely be re-enabled. */
1350 if (cs35l56->base.irq)
1351 enable_irq(cs35l56->base.irq);
1370 if (cs35l56->base.irq)
1371 disable_irq(cs35l56->base.irq);
1384 /* Ensure a spec-compliant RESET pulse. */
1385 if (cs35l56->base.reset_gpio) {
1386 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1391 ret = regulator_bulk_enable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1398 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
1412 * We might have done a hard reset or the CS35L56 was power-cycled
1417 /* Undo pm_runtime_force_suspend() before re-enabling the irq */
1419 if (cs35l56->base.irq)
1420 enable_irq(cs35l56->base.irq);
1426 if (!cs35l56->component)
1429 ret = cs35l56_is_fw_reload_needed(&cs35l56->base);
1430 dev_dbg(cs35l56->base.dev, "fw_reload_needed: %d\n", ret);
1434 cs35l56->base.fw_patched = false;
1435 wm_adsp_power_down(&cs35l56->dsp);
1436 queue_work(cs35l56->dsp_wq, &cs35l56->dsp_work);
1440 * a BIAS_OFF->BIAS_STANDBY transition to complete dsp patching.
1457 cs35l56->dsp_wq = create_singlethread_workqueue("cs35l56-dsp");
1458 if (!cs35l56->dsp_wq)
1459 return -ENOMEM;
1461 INIT_WORK(&cs35l56->dsp_work, cs35l56_dsp_work);
1463 dsp = &cs35l56->dsp;
1464 cs35l56_init_cs_dsp(&cs35l56->base, &dsp->cs_dsp);
1467 * dsp->part is filled in later as it is based on the DEVID. In a
1471 dsp->fw = 12;
1472 dsp->wmfw_optional = true;
1475 * None of the firmware controls need to be exported so add a no-op
1478 dsp->control_add = &cs35l56_control_add_nop;
1480 dev_dbg(cs35l56->base.dev, "DSP system name: '%s'\n", dsp->system_name);
1484 dev_err(cs35l56->base.dev, "wm_halo_init failed\n");
1493 struct device *dev = cs35l56->base.dev;
1497 ret = device_property_read_string(dev, "cirrus,firmware-uid", &prop);
1503 if (cs35l56->speaker_id >= 0)
1504 cs35l56->dsp.system_name = devm_kasprintf(dev, GFP_KERNEL, "%s-spkid%d",
1505 prop, cs35l56->speaker_id);
1507 cs35l56->dsp.system_name = devm_kstrdup(dev, prop, GFP_KERNEL);
1509 if (cs35l56->dsp.system_name == NULL)
1510 return -ENOMEM;
1512 dev_dbg(dev, "Firmware UID: %s\n", cs35l56->dsp.system_name);
1518 * Some SoundWire laptops have a spk-id-gpios property but it points to
1525 { "spk-id-gpios", &cs35l56_af01_first_gpio, 1 },
1542 af01_fwnode = device_get_named_child_node(cs35l56->base.dev, "AF01");
1544 dev_dbg(cs35l56->base.dev, "No AF01 node\n");
1545 return -ENOENT;
1548 ret = acpi_dev_get_property(ACPI_COMPANION(cs35l56->base.dev),
1549 "spk-id-gpios", ACPI_TYPE_PACKAGE, &obj);
1551 dev_dbg(cs35l56->base.dev, "Could not get spk-id-gpios package: %d\n", ret);
1553 return -ENOENT;
1556 /* The broken properties we can handle are a 4-element package (one GPIO) */
1557 if (obj->package.count != 4) {
1558 dev_warn(cs35l56->base.dev, "Unexpected spk-id element count %d\n",
1559 obj->package.count);
1561 return -ENOENT;
1565 if (!fwnode_property_present(af01_fwnode, "spk-id-gpios")) {
1576 return dev_err_probe(cs35l56->base.dev, ret,
1580 ret = devm_add_action_or_reset(cs35l56->base.dev,
1588 dev_dbg(cs35l56->base.dev, "Added spk-id-gpios mapping to AF01\n");
1591 desc = fwnode_gpiod_get_index(af01_fwnode, "spk-id", 0, GPIOD_IN, NULL);
1595 return dev_err_probe(cs35l56->base.dev, ret, "Get GPIO from AF01 failed\n");
1603 dev_err_probe(cs35l56->base.dev, ret, "Error reading spk-id GPIO\n");
1609 dev_info(cs35l56->base.dev, "Got spk-id from AF01\n");
1618 init_completion(&cs35l56->init_completion);
1619 mutex_init(&cs35l56->base.irq_lock);
1620 cs35l56->base.cal_index = -1;
1621 cs35l56->speaker_id = -ENOENT;
1623 dev_set_drvdata(cs35l56->base.dev, cs35l56);
1625 cs35l56_fill_supply_names(cs35l56->supplies);
1626 ret = devm_regulator_bulk_get(cs35l56->base.dev, ARRAY_SIZE(cs35l56->supplies),
1627 cs35l56->supplies);
1629 return dev_err_probe(cs35l56->base.dev, ret, "Failed to request supplies\n");
1631 /* Reset could be controlled by the BIOS or shared by multiple amps */
1632 cs35l56->base.reset_gpio = devm_gpiod_get_optional(cs35l56->base.dev, "reset",
1634 if (IS_ERR(cs35l56->base.reset_gpio)) {
1635 ret = PTR_ERR(cs35l56->base.reset_gpio);
1637 * If RESET is shared the first amp to probe will grab the reset
1640 if (ret != -EBUSY)
1641 return dev_err_probe(cs35l56->base.dev, ret, "Failed to get reset GPIO\n");
1643 dev_info(cs35l56->base.dev, "Reset GPIO busy, assume shared reset\n");
1644 cs35l56->base.reset_gpio = NULL;
1647 ret = regulator_bulk_enable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1649 return dev_err_probe(cs35l56->base.dev, ret, "Failed to enable supplies\n");
1651 if (cs35l56->base.reset_gpio) {
1653 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1655 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
1658 ret = cs35l56_get_speaker_id(&cs35l56->base);
1659 if (ACPI_COMPANION(cs35l56->base.dev) && cs35l56->sdw_peripheral && (ret == -ENOENT))
1662 if ((ret < 0) && (ret != -ENOENT))
1665 cs35l56->speaker_id = ret;
1673 dev_err_probe(cs35l56->base.dev, ret, "DSP init failed\n");
1677 ret = devm_snd_soc_register_component(cs35l56->base.dev,
1681 dev_err_probe(cs35l56->base.dev, ret, "Register codec failed\n");
1688 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1689 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1703 if (cs35l56->soft_resetting)
1706 if (cs35l56->base.init_done)
1709 pm_runtime_set_autosuspend_delay(cs35l56->base.dev, 100);
1710 pm_runtime_use_autosuspend(cs35l56->base.dev);
1711 pm_runtime_set_active(cs35l56->base.dev);
1712 pm_runtime_enable(cs35l56->base.dev);
1714 ret = cs35l56_hw_init(&cs35l56->base);
1718 ret = cs35l56_set_patch(&cs35l56->base);
1722 ret = cs35l56_get_calibration(&cs35l56->base);
1726 if (!cs35l56->base.reset_gpio) {
1727 dev_dbg(cs35l56->base.dev, "No reset gpio: using soft reset\n");
1728 cs35l56->soft_resetting = true;
1729 cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral);
1730 if (cs35l56->sdw_peripheral) {
1731 /* Keep alive while we wait for re-enumeration */
1732 pm_runtime_get_noresume(cs35l56->base.dev);
1738 if (cs35l56->soft_resetting) {
1739 cs35l56->soft_resetting = false;
1741 /* Done re-enumerating after one-time init so release the keep-alive */
1742 if (cs35l56->sdw_peripheral && !cs35l56->base.init_done)
1743 pm_runtime_put_noidle(cs35l56->base.dev);
1745 regcache_mark_dirty(cs35l56->base.regmap);
1746 ret = cs35l56_wait_for_firmware_boot(&cs35l56->base);
1750 dev_dbg(cs35l56->base.dev, "Firmware rebooted after soft reset\n");
1752 regcache_cache_only(cs35l56->base.regmap, false);
1755 /* Disable auto-hibernate so that runtime_pm has control */
1756 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE);
1761 regcache_sync(cs35l56->base.regmap);
1763 /* Set ASP1 DOUT to high-impedance when it is not transmitting audio data. */
1764 ret = regmap_set_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL3,
1767 return dev_err_probe(cs35l56->base.dev, ret, "Failed to write ASP1_CONTROL3\n");
1769 cs35l56->base.init_done = true;
1770 complete(&cs35l56->init_completion);
1778 cs35l56->base.init_done = false;
1784 if (cs35l56->base.irq)
1785 devm_free_irq(cs35l56->base.dev, cs35l56->base.irq, &cs35l56->base);
1787 destroy_workqueue(cs35l56->dsp_wq);
1789 pm_runtime_dont_use_autosuspend(cs35l56->base.dev);
1790 pm_runtime_suspend(cs35l56->base.dev);
1791 pm_runtime_disable(cs35l56->base.dev);
1793 regcache_cache_only(cs35l56->base.regmap, true);
1795 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1796 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);