Lines Matching +full:imon +full:- +full:slot +full:- +full:no
1 // SPDX-License-Identifier: GPL-2.0-only
27 #include <sound/soc-dapm.h>
39 flush_work(&cs35l56->dsp_work); in cs35l56_wait_dsp_ready()
62 static DECLARE_TLV_DB_SCALE(vol_tlv, -10000, 25, 0);
70 6, -400, 400, 9, 0,
154 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in cs35l56_play_event()
159 dev_dbg(cs35l56->base.dev, "play: %d\n", event); in cs35l56_play_event()
164 return regmap_write(cs35l56->base.regmap, CS35L56_DSP_VIRTUAL1_MBOX_1, in cs35l56_play_event()
168 ret = regmap_read_poll_timeout(cs35l56->base.regmap, in cs35l56_play_event()
174 dev_err(cs35l56->base.dev, "PS0 wait failed: %d\n", ret); in cs35l56_play_event()
177 return cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_PAUSE); in cs35l56_play_event()
220 SND_SOC_DAPM_SIGGEN("IMON ADC"),
232 { name" Source", "IMON", "IMON ADC" }, \
292 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in cs35l56_dsp_event()
295 dev_dbg(cs35l56->base.dev, "%s: %d\n", __func__, event); in cs35l56_dsp_event()
302 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(codec_dai->component); in cs35l56_asp_dai_set_fmt()
305 dev_dbg(cs35l56->base.dev, "%s: %#x\n", __func__, fmt); in cs35l56_asp_dai_set_fmt()
311 dev_err(cs35l56->base.dev, "Unsupported clock source mode\n"); in cs35l56_asp_dai_set_fmt()
312 return -EINVAL; in cs35l56_asp_dai_set_fmt()
318 cs35l56->tdm_mode = true; in cs35l56_asp_dai_set_fmt()
322 cs35l56->tdm_mode = false; in cs35l56_asp_dai_set_fmt()
325 dev_err(cs35l56->base.dev, "Unsupported DAI format\n"); in cs35l56_asp_dai_set_fmt()
326 return -EINVAL; in cs35l56_asp_dai_set_fmt()
342 dev_err(cs35l56->base.dev, "Invalid clock invert\n"); in cs35l56_asp_dai_set_fmt()
343 return -EINVAL; in cs35l56_asp_dai_set_fmt()
346 regmap_update_bits(cs35l56->base.regmap, in cs35l56_asp_dai_set_fmt()
352 /* Hi-Z DOUT in unused slots and when all TX are disabled */ in cs35l56_asp_dai_set_fmt()
353 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL3, in cs35l56_asp_dai_set_fmt()
379 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component); in cs35l56_asp_dai_set_tdm_slot()
382 dev_dbg(cs35l56->base.dev, "tdm config cleared\n"); in cs35l56_asp_dai_set_tdm_slot()
383 cs35l56->asp_slot_width = 0; in cs35l56_asp_dai_set_tdm_slot()
384 cs35l56->asp_slot_count = 0; in cs35l56_asp_dai_set_tdm_slot()
389 dev_err(cs35l56->base.dev, "tdm invalid slot width %d\n", slot_width); in cs35l56_asp_dai_set_tdm_slot()
390 return -EINVAL; in cs35l56_asp_dai_set_tdm_slot()
395 dev_err(cs35l56->base.dev, "tdm invalid slot count %d\n", slots); in cs35l56_asp_dai_set_tdm_slot()
396 return -EINVAL; in cs35l56_asp_dai_set_tdm_slot()
399 cs35l56->asp_slot_width = (u8)slot_width; in cs35l56_asp_dai_set_tdm_slot()
400 cs35l56->asp_slot_count = (u8)slots; in cs35l56_asp_dai_set_tdm_slot()
410 regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL1, in cs35l56_asp_dai_set_tdm_slot()
412 regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL5, in cs35l56_asp_dai_set_tdm_slot()
415 dev_dbg(cs35l56->base.dev, "tdm slot width: %u count: %u tx_mask: %#x rx_mask: %#x\n", in cs35l56_asp_dai_set_tdm_slot()
416 cs35l56->asp_slot_width, cs35l56->asp_slot_count, tx_mask, rx_mask); in cs35l56_asp_dai_set_tdm_slot()
425 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component); in cs35l56_asp_dai_hw_params()
430 if (cs35l56->asp_slot_width) in cs35l56_asp_dai_hw_params()
431 asp_width = cs35l56->asp_slot_width; in cs35l56_asp_dai_hw_params()
435 dev_dbg(cs35l56->base.dev, "%s: wl=%d, width=%d, rate=%d", in cs35l56_asp_dai_hw_params()
438 if (!cs35l56->sysclk_set) { in cs35l56_asp_dai_hw_params()
439 unsigned int slots = cs35l56->asp_slot_count; in cs35l56_asp_dai_hw_params()
447 if (!cs35l56->tdm_mode) in cs35l56_asp_dai_hw_params()
454 dev_err(cs35l56->base.dev, "%s: Invalid BCLK %u\n", __func__, bclk_freq); in cs35l56_asp_dai_hw_params()
455 return -EINVAL; in cs35l56_asp_dai_hw_params()
458 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL1, in cs35l56_asp_dai_hw_params()
463 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in cs35l56_asp_dai_hw_params()
464 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL2, in cs35l56_asp_dai_hw_params()
467 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_DATA_CONTROL5, in cs35l56_asp_dai_hw_params()
470 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL2, in cs35l56_asp_dai_hw_params()
473 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_DATA_CONTROL1, in cs35l56_asp_dai_hw_params()
483 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component); in cs35l56_asp_dai_set_sysclk()
487 cs35l56->sysclk_set = false; in cs35l56_asp_dai_set_sysclk()
495 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL1, in cs35l56_asp_dai_set_sysclk()
498 cs35l56->sysclk_set = true; in cs35l56_asp_dai_set_sysclk()
519 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component); in cs35l56_sdw_dai_set_tdm_slot()
522 cs35l56->rx_mask = tx_mask; in cs35l56_sdw_dai_set_tdm_slot()
523 cs35l56->tx_mask = rx_mask; in cs35l56_sdw_dai_set_tdm_slot()
532 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component); in cs35l56_sdw_dai_hw_params()
538 dev_dbg(cs35l56->base.dev, "%s: rate %d\n", __func__, params_rate(params)); in cs35l56_sdw_dai_hw_params()
540 if (!cs35l56->base.init_done) in cs35l56_sdw_dai_hw_params()
541 return -ENODEV; in cs35l56_sdw_dai_hw_params()
544 return -EINVAL; in cs35l56_sdw_dai_hw_params()
552 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in cs35l56_sdw_dai_hw_params()
555 pconfig.ch_mask = cs35l56->rx_mask; in cs35l56_sdw_dai_hw_params()
559 pconfig.ch_mask = cs35l56->tx_mask; in cs35l56_sdw_dai_hw_params()
564 pconfig.ch_mask = GENMASK(sconfig.ch_count - 1, 0); in cs35l56_sdw_dai_hw_params()
569 ret = sdw_stream_add_slave(cs35l56->sdw_peripheral, &sconfig, &pconfig, in cs35l56_sdw_dai_hw_params()
572 dev_err(dai->dev, "Failed to add sdw stream: %d\n", ret); in cs35l56_sdw_dai_hw_params()
582 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component); in cs35l56_sdw_dai_hw_free()
585 if (!cs35l56->sdw_peripheral) in cs35l56_sdw_dai_hw_free()
586 return -EINVAL; in cs35l56_sdw_dai_hw_free()
588 sdw_stream_remove_slave(cs35l56->sdw_peripheral, sdw_stream); in cs35l56_sdw_dai_hw_free()
611 .name = "cs35l56-asp1",
632 .name = "cs35l56-sdw1",
658 ret = wm_adsp_power_up(&cs35l56->dsp, true); in cs35l56_secure_patch()
660 dev_dbg(cs35l56->base.dev, "%s: wm_adsp_power_up ret %d\n", __func__, ret); in cs35l56_secure_patch()
662 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT); in cs35l56_secure_patch()
670 ret = regmap_read(cs35l56->base.regmap, CS35L56_PROTECTION_STATUS, &firmware_missing); in cs35l56_patch()
672 dev_err(cs35l56->base.dev, "Failed to read PROTECTION_STATUS: %d\n", ret); in cs35l56_patch()
680 * Setting sdw_irq_no_unmask prevents the handler re-enabling in cs35l56_patch()
683 if (cs35l56->sdw_peripheral) { in cs35l56_patch()
684 cs35l56->sdw_irq_no_unmask = true; in cs35l56_patch()
685 flush_work(&cs35l56->sdw_irq_work); in cs35l56_patch()
686 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1, 0); in cs35l56_patch()
687 sdw_read_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1); in cs35l56_patch()
688 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1, 0xFF); in cs35l56_patch()
689 flush_work(&cs35l56->sdw_irq_work); in cs35l56_patch()
692 ret = cs35l56_firmware_shutdown(&cs35l56->base); in cs35l56_patch()
699 * power-up wm_adsp without downloading firmware. in cs35l56_patch()
701 ret = wm_adsp_power_up(&cs35l56->dsp, !!firmware_missing); in cs35l56_patch()
703 dev_dbg(cs35l56->base.dev, "%s: wm_adsp_power_up ret %d\n", __func__, ret); in cs35l56_patch()
707 mutex_lock(&cs35l56->base.irq_lock); in cs35l56_patch()
709 reinit_completion(&cs35l56->init_completion); in cs35l56_patch()
711 cs35l56->soft_resetting = true; in cs35l56_patch()
712 cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral); in cs35l56_patch()
714 if (cs35l56->sdw_peripheral) { in cs35l56_patch()
716 * The system-reset causes the CS35L56 to detach from the bus. in cs35l56_patch()
717 * Wait for the manager to re-enumerate the CS35L56 and in cs35l56_patch()
720 if (!wait_for_completion_timeout(&cs35l56->init_completion, in cs35l56_patch()
722 dev_err(cs35l56->base.dev, "%s: init_completion timed out (SDW)\n", in cs35l56_patch()
730 regmap_clear_bits(cs35l56->base.regmap, CS35L56_PROTECTION_STATUS, in cs35l56_patch()
732 cs35l56->base.fw_patched = true; in cs35l56_patch()
735 mutex_unlock(&cs35l56->base.irq_lock); in cs35l56_patch()
737 /* Re-enable SoundWire interrupts */ in cs35l56_patch()
738 if (cs35l56->sdw_peripheral) { in cs35l56_patch()
739 cs35l56->sdw_irq_no_unmask = false; in cs35l56_patch()
740 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1, in cs35l56_patch()
751 if (!cs35l56->base.init_done) in cs35l56_dsp_work()
754 pm_runtime_get_sync(cs35l56->base.dev); in cs35l56_dsp_work()
762 if (cs35l56->base.secured) in cs35l56_dsp_work()
767 pm_runtime_mark_last_busy(cs35l56->base.dev); in cs35l56_dsp_work()
768 pm_runtime_put_autosuspend(cs35l56->base.dev); in cs35l56_dsp_work()
774 struct dentry *debugfs_root = component->debugfs_root; in cs35l56_component_probe()
778 if (!wait_for_completion_timeout(&cs35l56->init_completion, in cs35l56_component_probe()
780 dev_err(cs35l56->base.dev, "%s: init_completion timed out\n", __func__); in cs35l56_component_probe()
781 return -ENODEV; in cs35l56_component_probe()
784 cs35l56->component = component; in cs35l56_component_probe()
785 wm_adsp2_component_probe(&cs35l56->dsp, component); in cs35l56_component_probe()
787 debugfs_create_bool("init_done", 0444, debugfs_root, &cs35l56->base.init_done); in cs35l56_component_probe()
788 debugfs_create_bool("can_hibernate", 0444, debugfs_root, &cs35l56->base.can_hibernate); in cs35l56_component_probe()
789 debugfs_create_bool("fw_patched", 0444, debugfs_root, &cs35l56->base.fw_patched); in cs35l56_component_probe()
791 queue_work(cs35l56->dsp_wq, &cs35l56->dsp_work); in cs35l56_component_probe()
800 cancel_work_sync(&cs35l56->dsp_work); in cs35l56_component_remove()
845 return cs35l56_runtime_suspend_common(&cs35l56->base); in cs35l56_runtime_suspend_i2c_spi()
852 return cs35l56_runtime_resume_common(&cs35l56->base, false); in cs35l56_runtime_resume_i2c_spi()
861 if (cs35l56->component) in cs35l56_system_suspend()
862 flush_work(&cs35l56->dsp_work); in cs35l56_system_suspend()
870 if (cs35l56->base.irq) in cs35l56_system_suspend()
871 disable_irq(cs35l56->base.irq); in cs35l56_system_suspend()
888 if (cs35l56->base.reset_gpio) { in cs35l56_system_suspend_late()
889 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0); in cs35l56_system_suspend_late()
893 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies); in cs35l56_system_suspend_late()
905 /* Handlers are now disabled so the parent IRQ can safely be re-enabled. */ in cs35l56_system_suspend_no_irq()
906 if (cs35l56->base.irq) in cs35l56_system_suspend_no_irq()
907 enable_irq(cs35l56->base.irq); in cs35l56_system_suspend_no_irq()
926 if (cs35l56->base.irq) in cs35l56_system_resume_no_irq()
927 disable_irq(cs35l56->base.irq); in cs35l56_system_resume_no_irq()
940 /* Ensure a spec-compliant RESET pulse. */ in cs35l56_system_resume_early()
941 if (cs35l56->base.reset_gpio) { in cs35l56_system_resume_early()
942 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0); in cs35l56_system_resume_early()
947 ret = regulator_bulk_enable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies); in cs35l56_system_resume_early()
954 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1); in cs35l56_system_resume_early()
968 * We might have done a hard reset or the CS35L56 was power-cycled in cs35l56_system_resume()
973 /* Undo pm_runtime_force_suspend() before re-enabling the irq */ in cs35l56_system_resume()
975 if (cs35l56->base.irq) in cs35l56_system_resume()
976 enable_irq(cs35l56->base.irq); in cs35l56_system_resume()
982 if (!cs35l56->component) in cs35l56_system_resume()
985 ret = cs35l56_is_fw_reload_needed(&cs35l56->base); in cs35l56_system_resume()
986 dev_dbg(cs35l56->base.dev, "fw_reload_needed: %d\n", ret); in cs35l56_system_resume()
990 cs35l56->base.fw_patched = false; in cs35l56_system_resume()
991 wm_adsp_power_down(&cs35l56->dsp); in cs35l56_system_resume()
992 queue_work(cs35l56->dsp_wq, &cs35l56->dsp_work); in cs35l56_system_resume()
996 * a BIAS_OFF->BIAS_STANDBY transition to complete dsp patching. in cs35l56_system_resume()
1008 cs35l56->dsp_wq = create_singlethread_workqueue("cs35l56-dsp"); in cs35l56_dsp_init()
1009 if (!cs35l56->dsp_wq) in cs35l56_dsp_init()
1010 return -ENOMEM; in cs35l56_dsp_init()
1012 INIT_WORK(&cs35l56->dsp_work, cs35l56_dsp_work); in cs35l56_dsp_init()
1014 dsp = &cs35l56->dsp; in cs35l56_dsp_init()
1015 cs35l56_init_cs_dsp(&cs35l56->base, &dsp->cs_dsp); in cs35l56_dsp_init()
1016 dsp->part = "cs35l56"; in cs35l56_dsp_init()
1017 dsp->fw = 12; in cs35l56_dsp_init()
1018 dsp->wmfw_optional = true; in cs35l56_dsp_init()
1020 dev_dbg(cs35l56->base.dev, "DSP system name: '%s'\n", dsp->system_name); in cs35l56_dsp_init()
1024 dev_err(cs35l56->base.dev, "wm_halo_init failed\n"); in cs35l56_dsp_init()
1033 struct device *dev = cs35l56->base.dev; in cs35l56_get_firmware_uid()
1037 ret = device_property_read_string(dev, "cirrus,firmware-uid", &prop); in cs35l56_get_firmware_uid()
1042 cs35l56->dsp.system_name = devm_kstrdup(dev, prop, GFP_KERNEL); in cs35l56_get_firmware_uid()
1043 if (cs35l56->dsp.system_name == NULL) in cs35l56_get_firmware_uid()
1044 return -ENOMEM; in cs35l56_get_firmware_uid()
1046 dev_dbg(dev, "Firmware UID: %s\n", cs35l56->dsp.system_name); in cs35l56_get_firmware_uid()
1055 init_completion(&cs35l56->init_completion); in cs35l56_common_probe()
1056 mutex_init(&cs35l56->base.irq_lock); in cs35l56_common_probe()
1058 dev_set_drvdata(cs35l56->base.dev, cs35l56); in cs35l56_common_probe()
1060 cs35l56_fill_supply_names(cs35l56->supplies); in cs35l56_common_probe()
1061 ret = devm_regulator_bulk_get(cs35l56->base.dev, ARRAY_SIZE(cs35l56->supplies), in cs35l56_common_probe()
1062 cs35l56->supplies); in cs35l56_common_probe()
1064 return dev_err_probe(cs35l56->base.dev, ret, "Failed to request supplies\n"); in cs35l56_common_probe()
1067 cs35l56->base.reset_gpio = devm_gpiod_get_optional(cs35l56->base.dev, "reset", in cs35l56_common_probe()
1069 if (IS_ERR(cs35l56->base.reset_gpio)) { in cs35l56_common_probe()
1070 ret = PTR_ERR(cs35l56->base.reset_gpio); in cs35l56_common_probe()
1075 if (ret != -EBUSY) in cs35l56_common_probe()
1076 return dev_err_probe(cs35l56->base.dev, ret, "Failed to get reset GPIO\n"); in cs35l56_common_probe()
1078 dev_info(cs35l56->base.dev, "Reset GPIO busy, assume shared reset\n"); in cs35l56_common_probe()
1079 cs35l56->base.reset_gpio = NULL; in cs35l56_common_probe()
1082 ret = regulator_bulk_enable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies); in cs35l56_common_probe()
1084 return dev_err_probe(cs35l56->base.dev, ret, "Failed to enable supplies\n"); in cs35l56_common_probe()
1086 if (cs35l56->base.reset_gpio) { in cs35l56_common_probe()
1088 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0); in cs35l56_common_probe()
1090 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1); in cs35l56_common_probe()
1099 dev_err_probe(cs35l56->base.dev, ret, "DSP init failed\n"); in cs35l56_common_probe()
1103 ret = devm_snd_soc_register_component(cs35l56->base.dev, in cs35l56_common_probe()
1107 dev_err_probe(cs35l56->base.dev, ret, "Register codec failed\n"); in cs35l56_common_probe()
1114 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0); in cs35l56_common_probe()
1115 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies); in cs35l56_common_probe()
1129 if (cs35l56->soft_resetting) in cs35l56_init()
1132 if (cs35l56->base.init_done) in cs35l56_init()
1135 pm_runtime_set_autosuspend_delay(cs35l56->base.dev, 100); in cs35l56_init()
1136 pm_runtime_use_autosuspend(cs35l56->base.dev); in cs35l56_init()
1137 pm_runtime_set_active(cs35l56->base.dev); in cs35l56_init()
1138 pm_runtime_enable(cs35l56->base.dev); in cs35l56_init()
1140 ret = cs35l56_hw_init(&cs35l56->base); in cs35l56_init()
1145 cs35l56->dsp.part = devm_kasprintf(cs35l56->base.dev, GFP_KERNEL, "cs35l56%s-%02x", in cs35l56_init()
1146 cs35l56->base.secured ? "s" : "", cs35l56->base.rev); in cs35l56_init()
1147 if (!cs35l56->dsp.part) in cs35l56_init()
1148 return -ENOMEM; in cs35l56_init()
1150 if (!cs35l56->base.reset_gpio) { in cs35l56_init()
1151 dev_dbg(cs35l56->base.dev, "No reset gpio: using soft reset\n"); in cs35l56_init()
1152 cs35l56->soft_resetting = true; in cs35l56_init()
1153 cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral); in cs35l56_init()
1154 if (cs35l56->sdw_peripheral) { in cs35l56_init()
1155 /* Keep alive while we wait for re-enumeration */ in cs35l56_init()
1156 pm_runtime_get_noresume(cs35l56->base.dev); in cs35l56_init()
1162 if (cs35l56->soft_resetting) { in cs35l56_init()
1163 cs35l56->soft_resetting = false; in cs35l56_init()
1165 /* Done re-enumerating after one-time init so release the keep-alive */ in cs35l56_init()
1166 if (cs35l56->sdw_peripheral && !cs35l56->base.init_done) in cs35l56_init()
1167 pm_runtime_put_noidle(cs35l56->base.dev); in cs35l56_init()
1169 regcache_mark_dirty(cs35l56->base.regmap); in cs35l56_init()
1170 ret = cs35l56_wait_for_firmware_boot(&cs35l56->base); in cs35l56_init()
1174 dev_dbg(cs35l56->base.dev, "Firmware rebooted after soft reset\n"); in cs35l56_init()
1177 /* Disable auto-hibernate so that runtime_pm has control */ in cs35l56_init()
1178 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); in cs35l56_init()
1182 ret = cs35l56_set_patch(&cs35l56->base); in cs35l56_init()
1187 regcache_sync(cs35l56->base.regmap); in cs35l56_init()
1189 /* Set ASP1 DOUT to high-impedance when it is not transmitting audio data. */ in cs35l56_init()
1190 ret = regmap_set_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL3, in cs35l56_init()
1193 return dev_err_probe(cs35l56->base.dev, ret, "Failed to write ASP1_CONTROL3\n"); in cs35l56_init()
1195 cs35l56->base.init_done = true; in cs35l56_init()
1196 complete(&cs35l56->init_completion); in cs35l56_init()
1204 cs35l56->base.init_done = false; in cs35l56_remove()
1210 if (cs35l56->base.irq) in cs35l56_remove()
1211 devm_free_irq(cs35l56->base.dev, cs35l56->base.irq, &cs35l56->base); in cs35l56_remove()
1213 flush_workqueue(cs35l56->dsp_wq); in cs35l56_remove()
1214 destroy_workqueue(cs35l56->dsp_wq); in cs35l56_remove()
1216 pm_runtime_dont_use_autosuspend(cs35l56->base.dev); in cs35l56_remove()
1217 pm_runtime_suspend(cs35l56->base.dev); in cs35l56_remove()
1218 pm_runtime_disable(cs35l56->base.dev); in cs35l56_remove()
1220 regcache_cache_only(cs35l56->base.regmap, true); in cs35l56_remove()
1222 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0); in cs35l56_remove()
1223 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies); in cs35l56_remove()