Lines Matching defs:cs35l56
31 #include "cs35l56.h"
36 static void cs35l56_wait_dsp_ready(struct cs35l56_private *cs35l56)
39 flush_work(&cs35l56->dsp_work);
46 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component);
48 cs35l56_wait_dsp_ready(cs35l56);
56 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component);
58 cs35l56_wait_dsp_ready(cs35l56);
71 static int cs35l56_sync_asp1_mixer_widgets_with_firmware(struct cs35l56_private *cs35l56)
73 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(cs35l56->component);
74 const char *prefix = cs35l56->component->name_prefix;
82 if (cs35l56->asp1_mixer_widgets_initialized)
89 ret = pm_runtime_resume_and_get(cs35l56->base.dev);
94 cs35l56_wait_dsp_ready(cs35l56);
96 ret = regmap_bulk_read(cs35l56->base.regmap, CS35L56_ASP1TX1_INPUT,
99 pm_runtime_mark_last_busy(cs35l56->base.dev);
100 pm_runtime_put_autosuspend(cs35l56->base.dev);
103 dev_err(cs35l56->base.dev, "Failed to read ASP1 mixer regs: %d\n", ret);
117 dev_warn(cs35l56->base.dev, "Could not find control %s\n", name);
126 cs35l56->asp1_mixer_widgets_initialized = true;
135 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component);
141 ret = cs35l56_sync_asp1_mixer_widgets_with_firmware(cs35l56);
146 ret = regmap_read(cs35l56->base.regmap, addr, &val);
161 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component);
169 ret = cs35l56_sync_asp1_mixer_widgets_with_firmware(cs35l56);
176 ret = regmap_update_bits_check(cs35l56->base.regmap, addr,
284 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component);
288 dev_dbg(cs35l56->base.dev, "play: %d\n", event);
293 return regmap_write(cs35l56->base.regmap, CS35L56_DSP_VIRTUAL1_MBOX_1,
297 ret = regmap_read_poll_timeout(cs35l56->base.regmap,
303 dev_err(cs35l56->base.dev, "PS0 wait failed: %d\n", ret);
306 return cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_PAUSE);
422 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component);
424 dev_dbg(cs35l56->base.dev, "%s: %d\n", __func__, event);
431 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(codec_dai->component);
434 dev_dbg(cs35l56->base.dev, "%s: %#x\n", __func__, fmt);
440 dev_err(cs35l56->base.dev, "Unsupported clock source mode\n");
447 cs35l56->tdm_mode = true;
451 cs35l56->tdm_mode = false;
454 dev_err(cs35l56->base.dev, "Unsupported DAI format\n");
471 dev_err(cs35l56->base.dev, "Invalid clock invert\n");
475 regmap_update_bits(cs35l56->base.regmap,
482 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL3,
508 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
511 dev_dbg(cs35l56->base.dev, "tdm config cleared\n");
512 cs35l56->asp_slot_width = 0;
513 cs35l56->asp_slot_count = 0;
518 dev_err(cs35l56->base.dev, "tdm invalid slot width %d\n", slot_width);
524 dev_err(cs35l56->base.dev, "tdm invalid slot count %d\n", slots);
528 cs35l56->asp_slot_width = (u8)slot_width;
529 cs35l56->asp_slot_count = (u8)slots;
539 regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL1,
541 regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL5,
544 dev_dbg(cs35l56->base.dev, "tdm slot width: %u count: %u tx_mask: %#x rx_mask: %#x\n",
545 cs35l56->asp_slot_width, cs35l56->asp_slot_count, tx_mask, rx_mask);
554 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
559 if (cs35l56->asp_slot_width)
560 asp_width = cs35l56->asp_slot_width;
564 dev_dbg(cs35l56->base.dev, "%s: wl=%d, width=%d, rate=%d",
567 if (!cs35l56->sysclk_set) {
568 unsigned int slots = cs35l56->asp_slot_count;
576 if (!cs35l56->tdm_mode)
583 dev_err(cs35l56->base.dev, "%s: Invalid BCLK %u\n", __func__, bclk_freq);
587 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL1,
593 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL2,
596 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_DATA_CONTROL5,
599 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL2,
602 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_DATA_CONTROL1,
612 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
616 cs35l56->sysclk_set = false;
624 regmap_update_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL1,
627 cs35l56->sysclk_set = true;
648 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
651 cs35l56->rx_mask = tx_mask;
652 cs35l56->tx_mask = rx_mask;
661 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
667 dev_dbg(cs35l56->base.dev, "%s: rate %d\n", __func__, params_rate(params));
669 if (!cs35l56->base.init_done)
684 pconfig.ch_mask = cs35l56->rx_mask;
688 pconfig.ch_mask = cs35l56->tx_mask;
698 ret = sdw_stream_add_slave(cs35l56->sdw_peripheral, &sconfig, &pconfig,
711 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
714 if (!cs35l56->sdw_peripheral)
717 sdw_stream_remove_slave(cs35l56->sdw_peripheral, sdw_stream);
740 .name = "cs35l56-asp1",
761 .name = "cs35l56-sdw1",
782 static void cs35l56_secure_patch(struct cs35l56_private *cs35l56)
787 ret = wm_adsp_power_up(&cs35l56->dsp, true);
789 dev_dbg(cs35l56->base.dev, "%s: wm_adsp_power_up ret %d\n", __func__, ret);
791 cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_AUDIO_REINIT);
794 static void cs35l56_patch(struct cs35l56_private *cs35l56)
799 ret = regmap_read(cs35l56->base.regmap, CS35L56_PROTECTION_STATUS, &firmware_missing);
801 dev_err(cs35l56->base.dev, "Failed to read PROTECTION_STATUS: %d\n", ret);
812 if (cs35l56->sdw_peripheral) {
813 cs35l56->sdw_irq_no_unmask = true;
814 flush_work(&cs35l56->sdw_irq_work);
815 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1, 0);
816 sdw_read_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1);
817 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1, 0xFF);
818 flush_work(&cs35l56->sdw_irq_work);
821 ret = cs35l56_firmware_shutdown(&cs35l56->base);
830 ret = wm_adsp_power_up(&cs35l56->dsp, !!firmware_missing);
832 dev_dbg(cs35l56->base.dev, "%s: wm_adsp_power_up ret %d\n", __func__, ret);
836 mutex_lock(&cs35l56->base.irq_lock);
838 reinit_completion(&cs35l56->init_completion);
840 cs35l56->soft_resetting = true;
841 cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral);
843 if (cs35l56->sdw_peripheral) {
849 if (!wait_for_completion_timeout(&cs35l56->init_completion,
851 dev_err(cs35l56->base.dev, "%s: init_completion timed out (SDW)\n",
855 } else if (cs35l56_init(cs35l56)) {
859 regmap_clear_bits(cs35l56->base.regmap, CS35L56_PROTECTION_STATUS,
861 cs35l56->base.fw_patched = true;
864 mutex_unlock(&cs35l56->base.irq_lock);
867 if (cs35l56->sdw_peripheral) {
868 cs35l56->sdw_irq_no_unmask = false;
869 sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1,
876 struct cs35l56_private *cs35l56 = container_of(work,
880 if (!cs35l56->base.init_done)
883 pm_runtime_get_sync(cs35l56->base.dev);
886 if (!cs35l56->dsp.fwf_name) {
887 cs35l56->dsp.fwf_name = kasprintf(GFP_KERNEL, "%02x%s-dsp1",
888 cs35l56->base.rev,
889 cs35l56->base.secured ? "-s" : "");
890 if (!cs35l56->dsp.fwf_name)
894 dev_dbg(cs35l56->base.dev, "DSP fwf name: '%s' system name: '%s'\n",
895 cs35l56->dsp.fwf_name, cs35l56->dsp.system_name);
903 if (cs35l56->base.secured)
904 cs35l56_secure_patch(cs35l56);
906 cs35l56_patch(cs35l56);
909 pm_runtime_mark_last_busy(cs35l56->base.dev);
910 pm_runtime_put_autosuspend(cs35l56->base.dev);
915 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component);
921 if (!cs35l56->dsp.system_name &&
923 cs35l56->dsp.system_name = devm_kasprintf(cs35l56->base.dev,
927 if (!cs35l56->dsp.system_name)
931 if (!wait_for_completion_timeout(&cs35l56->init_completion,
933 dev_err(cs35l56->base.dev, "%s: init_completion timed out\n", __func__);
937 cs35l56->component = component;
938 wm_adsp2_component_probe(&cs35l56->dsp, component);
940 debugfs_create_bool("init_done", 0444, debugfs_root, &cs35l56->base.init_done);
941 debugfs_create_bool("can_hibernate", 0444, debugfs_root, &cs35l56->base.can_hibernate);
942 debugfs_create_bool("fw_patched", 0444, debugfs_root, &cs35l56->base.fw_patched);
948 regcache_drop_region(cs35l56->base.regmap, CS35L56_ASP1TX1_INPUT, CS35L56_ASP1TX4_INPUT);
949 cs35l56->asp1_mixer_widgets_initialized = false;
951 queue_work(cs35l56->dsp_wq, &cs35l56->dsp_work);
958 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component);
960 cancel_work_sync(&cs35l56->dsp_work);
962 if (cs35l56->dsp.cs_dsp.booted)
963 wm_adsp_power_down(&cs35l56->dsp);
965 wm_adsp2_component_remove(&cs35l56->dsp, component);
967 kfree(cs35l56->dsp.fwf_name);
968 cs35l56->dsp.fwf_name = NULL;
970 cs35l56->component = NULL;
976 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component);
985 cs35l56_wait_dsp_ready(cs35l56);
1013 struct cs35l56_private *cs35l56 = dev_get_drvdata(dev);
1015 return cs35l56_runtime_suspend_common(&cs35l56->base);
1020 struct cs35l56_private *cs35l56 = dev_get_drvdata(dev);
1022 return cs35l56_runtime_resume_common(&cs35l56->base, false);
1027 struct cs35l56_private *cs35l56 = dev_get_drvdata(dev);
1031 if (cs35l56->component)
1032 flush_work(&cs35l56->dsp_work);
1040 if (cs35l56->base.irq)
1041 disable_irq(cs35l56->base.irq);
1049 struct cs35l56_private *cs35l56 = dev_get_drvdata(dev);
1058 if (cs35l56->base.reset_gpio) {
1059 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1063 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1071 struct cs35l56_private *cs35l56 = dev_get_drvdata(dev);
1076 if (cs35l56->base.irq)
1077 enable_irq(cs35l56->base.irq);
1085 struct cs35l56_private *cs35l56 = dev_get_drvdata(dev);
1096 if (cs35l56->base.irq)
1097 disable_irq(cs35l56->base.irq);
1105 struct cs35l56_private *cs35l56 = dev_get_drvdata(dev);
1111 if (cs35l56->base.reset_gpio) {
1112 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1117 ret = regulator_bulk_enable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1124 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
1132 struct cs35l56_private *cs35l56 = dev_get_drvdata(dev);
1145 if (cs35l56->base.irq)
1146 enable_irq(cs35l56->base.irq);
1152 if (!cs35l56->component)
1155 ret = cs35l56_is_fw_reload_needed(&cs35l56->base);
1156 dev_dbg(cs35l56->base.dev, "fw_reload_needed: %d\n", ret);
1160 cs35l56->base.fw_patched = false;
1161 wm_adsp_power_down(&cs35l56->dsp);
1162 queue_work(cs35l56->dsp_wq, &cs35l56->dsp_work);
1173 static int cs35l56_dsp_init(struct cs35l56_private *cs35l56)
1178 cs35l56->dsp_wq = create_singlethread_workqueue("cs35l56-dsp");
1179 if (!cs35l56->dsp_wq)
1182 INIT_WORK(&cs35l56->dsp_work, cs35l56_dsp_work);
1184 dsp = &cs35l56->dsp;
1185 cs35l56_init_cs_dsp(&cs35l56->base, &dsp->cs_dsp);
1186 dsp->part = "cs35l56";
1190 dev_dbg(cs35l56->base.dev, "DSP system name: '%s'\n", dsp->system_name);
1194 dev_err(cs35l56->base.dev, "wm_halo_init failed\n");
1201 static int cs35l56_get_firmware_uid(struct cs35l56_private *cs35l56)
1203 struct device *dev = cs35l56->base.dev;
1212 cs35l56->dsp.system_name = devm_kstrdup(dev, prop, GFP_KERNEL);
1213 if (cs35l56->dsp.system_name == NULL)
1216 dev_dbg(dev, "Firmware UID: %s\n", cs35l56->dsp.system_name);
1221 int cs35l56_common_probe(struct cs35l56_private *cs35l56)
1225 init_completion(&cs35l56->init_completion);
1226 mutex_init(&cs35l56->base.irq_lock);
1228 dev_set_drvdata(cs35l56->base.dev, cs35l56);
1230 cs35l56_fill_supply_names(cs35l56->supplies);
1231 ret = devm_regulator_bulk_get(cs35l56->base.dev, ARRAY_SIZE(cs35l56->supplies),
1232 cs35l56->supplies);
1234 return dev_err_probe(cs35l56->base.dev, ret, "Failed to request supplies\n");
1237 cs35l56->base.reset_gpio = devm_gpiod_get_optional(cs35l56->base.dev, "reset",
1239 if (IS_ERR(cs35l56->base.reset_gpio)) {
1240 ret = PTR_ERR(cs35l56->base.reset_gpio);
1246 return dev_err_probe(cs35l56->base.dev, ret, "Failed to get reset GPIO\n");
1248 dev_info(cs35l56->base.dev, "Reset GPIO busy, assume shared reset\n");
1249 cs35l56->base.reset_gpio = NULL;
1252 ret = regulator_bulk_enable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1254 return dev_err_probe(cs35l56->base.dev, ret, "Failed to enable supplies\n");
1256 if (cs35l56->base.reset_gpio) {
1258 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1260 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1);
1263 ret = cs35l56_get_firmware_uid(cs35l56);
1267 ret = cs35l56_dsp_init(cs35l56);
1269 dev_err_probe(cs35l56->base.dev, ret, "DSP init failed\n");
1273 ret = devm_snd_soc_register_component(cs35l56->base.dev,
1277 dev_err_probe(cs35l56->base.dev, ret, "Register codec failed\n");
1284 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1285 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
1291 int cs35l56_init(struct cs35l56_private *cs35l56)
1299 if (cs35l56->soft_resetting)
1302 if (cs35l56->base.init_done)
1305 pm_runtime_set_autosuspend_delay(cs35l56->base.dev, 100);
1306 pm_runtime_use_autosuspend(cs35l56->base.dev);
1307 pm_runtime_set_active(cs35l56->base.dev);
1308 pm_runtime_enable(cs35l56->base.dev);
1310 ret = cs35l56_hw_init(&cs35l56->base);
1314 ret = cs35l56_set_patch(&cs35l56->base);
1318 if (!cs35l56->base.reset_gpio) {
1319 dev_dbg(cs35l56->base.dev, "No reset gpio: using soft reset\n");
1320 cs35l56->soft_resetting = true;
1321 cs35l56_system_reset(&cs35l56->base, !!cs35l56->sdw_peripheral);
1322 if (cs35l56->sdw_peripheral) {
1324 pm_runtime_get_noresume(cs35l56->base.dev);
1330 if (cs35l56->soft_resetting) {
1331 cs35l56->soft_resetting = false;
1334 if (cs35l56->sdw_peripheral && !cs35l56->base.init_done)
1335 pm_runtime_put_noidle(cs35l56->base.dev);
1337 regcache_mark_dirty(cs35l56->base.regmap);
1338 ret = cs35l56_wait_for_firmware_boot(&cs35l56->base);
1342 dev_dbg(cs35l56->base.dev, "Firmware rebooted after soft reset\n");
1346 ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE);
1351 regcache_sync(cs35l56->base.regmap);
1354 ret = regmap_set_bits(cs35l56->base.regmap, CS35L56_ASP1_CONTROL3,
1357 return dev_err_probe(cs35l56->base.dev, ret, "Failed to write ASP1_CONTROL3\n");
1359 cs35l56->base.init_done = true;
1360 complete(&cs35l56->init_completion);
1366 void cs35l56_remove(struct cs35l56_private *cs35l56)
1368 cs35l56->base.init_done = false;
1374 if (cs35l56->base.irq)
1375 devm_free_irq(cs35l56->base.dev, cs35l56->base.irq, &cs35l56->base);
1377 flush_workqueue(cs35l56->dsp_wq);
1378 destroy_workqueue(cs35l56->dsp_wq);
1380 pm_runtime_dont_use_autosuspend(cs35l56->base.dev);
1381 pm_runtime_suspend(cs35l56->base.dev);
1382 pm_runtime_disable(cs35l56->base.dev);
1384 regcache_cache_only(cs35l56->base.regmap, true);
1386 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0);
1387 regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);