Lines Matching refs:dsp

47 	adsp_err(_obj->dsp, "%s: " fmt, _obj->name ? _obj->name : "legacy", \
50 adsp_dbg(_obj->dsp, "%s: " fmt, _obj->name ? _obj->name : "legacy", \
151 struct wm_adsp *dsp;
168 struct wm_adsp *dsp;
200 static int wm_adsp_buffer_init(struct wm_adsp *dsp);
201 static int wm_adsp_buffer_free(struct wm_adsp *dsp);
323 struct wm_adsp *dsp = snd_soc_component_get_drvdata(component);
325 ucontrol->value.enumerated.item[0] = dsp[e->shift_l].fw;
336 struct wm_adsp *dsp = snd_soc_component_get_drvdata(component);
339 if (ucontrol->value.enumerated.item[0] == dsp[e->shift_l].fw)
345 mutex_lock(&dsp[e->shift_l].cs_dsp.pwr_lock);
347 if (dsp[e->shift_l].cs_dsp.booted || !list_empty(&dsp[e->shift_l].compr_list))
350 dsp[e->shift_l].fw = ucontrol->value.enumerated.item[0];
352 mutex_unlock(&dsp[e->shift_l].cs_dsp.pwr_lock);
448 mutex_lock(&cs_ctl->dsp->pwr_lock);
455 mutex_unlock(&cs_ctl->dsp->pwr_lock);
484 mutex_lock(&cs_ctl->dsp->pwr_lock);
491 mutex_unlock(&cs_ctl->dsp->pwr_lock);
548 struct wm_adsp *dsp = container_of(cs_ctl->dsp,
581 snd_soc_add_component_controls(dsp->component, kcontrol, 1);
588 struct wm_adsp *dsp = container_of(cs_ctl->dsp, struct wm_adsp, cs_dsp);
589 struct cs_dsp *cs_dsp = &dsp->cs_dsp;
600 adsp_err(dsp, "Unknown region type: %d\n", cs_ctl->alg_region.type);
614 wm_adsp_fw_text[dsp->fw], cs_ctl->alg_region.alg);
619 wm_adsp_fw_text[dsp->fw], cs_ctl->alg_region.alg);
627 if (dsp->component->name_prefix)
628 avail -= strlen(dsp->component->name_prefix) + 1;
672 int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type,
678 mutex_lock(&dsp->cs_dsp.pwr_lock);
679 cs_ctl = cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg);
681 mutex_unlock(&dsp->cs_dsp.pwr_lock);
690 int wm_adsp_read_ctl(struct wm_adsp *dsp, const char *name, int type,
695 mutex_lock(&dsp->cs_dsp.pwr_lock);
696 ret = cs_dsp_coeff_read_ctrl(cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg),
698 mutex_unlock(&dsp->cs_dsp.pwr_lock);
704 static void wm_adsp_release_firmware_files(struct wm_adsp *dsp,
719 static int wm_adsp_request_firmware_file(struct wm_adsp *dsp,
725 struct cs_dsp *cs_dsp = &dsp->cs_dsp;
730 if (dsp->fwf_name)
731 fwf = dsp->fwf_name;
733 fwf = dsp->cs_dsp.name;
736 *filename = kasprintf(GFP_KERNEL, "%s%s-%s-%s-%s-%s.%s", dir, dsp->part,
737 fwf, wm_adsp_fw[dsp->fw].file, system_name,
740 *filename = kasprintf(GFP_KERNEL, "%s%s-%s-%s-%s.%s", dir, dsp->part,
741 fwf, wm_adsp_fw[dsp->fw].file, system_name,
744 *filename = kasprintf(GFP_KERNEL, "%s%s-%s-%s.%s", dir, dsp->part, fwf,
745 wm_adsp_fw[dsp->fw].file, filetype);
767 adsp_dbg(dsp, "Failed to request '%s'\n", *filename);
771 adsp_dbg(dsp, "Found '%s'\n", *filename);
778 static int wm_adsp_request_firmware_files(struct wm_adsp *dsp,
784 const char *system_name = dsp->system_name;
785 const char *asoc_component_prefix = dsp->component->name_prefix;
789 if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
792 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
800 if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
804 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
809 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
817 if (dsp->wmfw_optional && system_name) {
819 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
824 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
833 if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
835 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
841 ret = wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
843 if (!ret || dsp->wmfw_optional) {
844 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
849 adsp_err(dsp, "Failed to request firmware <%s>%s-%s-%s<-%s<%s>>.wmfw\n",
850 cirrus_dir, dsp->part,
851 dsp->fwf_name ? dsp->fwf_name : dsp->cs_dsp.name,
852 wm_adsp_fw[dsp->fw].file, system_name, asoc_component_prefix);
857 static int wm_adsp_common_init(struct wm_adsp *dsp)
859 INIT_LIST_HEAD(&dsp->compr_list);
860 INIT_LIST_HEAD(&dsp->buffer_list);
865 int wm_adsp1_init(struct wm_adsp *dsp)
869 dsp->cs_dsp.client_ops = &wm_adsp1_client_ops;
871 ret = cs_dsp_adsp1_init(&dsp->cs_dsp);
875 return wm_adsp_common_init(dsp);
885 struct wm_adsp *dsp = &dsps[w->shift];
892 dsp->component = component;
896 ret = wm_adsp_request_firmware_files(dsp,
902 ret = cs_dsp_adsp1_power_up(&dsp->cs_dsp,
905 wm_adsp_fw_text[dsp->fw]);
907 wm_adsp_release_firmware_files(dsp,
912 cs_dsp_adsp1_power_down(&dsp->cs_dsp);
926 struct wm_adsp *dsp = &dsps[w->shift];
928 return cs_dsp_set_dspclk(&dsp->cs_dsp, freq);
939 struct wm_adsp *dsp = &dsps[mc->shift - 1];
941 ucontrol->value.integer.value[0] = dsp->preloaded;
955 struct wm_adsp *dsp = &dsps[mc->shift - 1];
958 if (dsp->preloaded == ucontrol->value.integer.value[0])
961 snprintf(preload, ARRAY_SIZE(preload), "%s Preload", dsp->cs_dsp.name);
963 if (ucontrol->value.integer.value[0] || dsp->toggle_preload)
970 flush_work(&dsp->boot_work);
972 dsp->preloaded = ucontrol->value.integer.value[0];
974 if (dsp->toggle_preload) {
983 int wm_adsp_power_up(struct wm_adsp *dsp, bool load_firmware)
992 ret = wm_adsp_request_firmware_files(dsp,
999 ret = cs_dsp_power_up(&dsp->cs_dsp,
1002 wm_adsp_fw_text[dsp->fw]);
1004 wm_adsp_release_firmware_files(dsp,
1012 void wm_adsp_power_down(struct wm_adsp *dsp)
1014 cs_dsp_power_down(&dsp->cs_dsp);
1020 struct wm_adsp *dsp = container_of(work,
1024 wm_adsp_power_up(dsp, true);
1032 struct wm_adsp *dsp = &dsps[w->shift];
1036 queue_work(system_unbound_wq, &dsp->boot_work);
1039 wm_adsp_power_down(dsp);
1051 struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
1053 if (!dsp->pre_run)
1056 return (*dsp->pre_run)(dsp);
1061 struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
1063 if (wm_adsp_fw[dsp->fw].num_caps != 0)
1064 return wm_adsp_buffer_init(dsp);
1071 struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
1073 if (wm_adsp_fw[dsp->fw].num_caps != 0)
1074 wm_adsp_buffer_free(dsp);
1076 dsp->fatal_error = false;
1079 int wm_adsp_run(struct wm_adsp *dsp)
1081 flush_work(&dsp->boot_work);
1083 return cs_dsp_run(&dsp->cs_dsp);
1087 void wm_adsp_stop(struct wm_adsp *dsp)
1089 cs_dsp_stop(&dsp->cs_dsp);
1098 struct wm_adsp *dsp = &dsps[w->shift];
1102 return wm_adsp_run(dsp);
1104 wm_adsp_stop(dsp);
1112 int wm_adsp2_component_probe(struct wm_adsp *dsp, struct snd_soc_component *component)
1116 if (!dsp->cs_dsp.no_core_startstop) {
1117 snprintf(preload, ARRAY_SIZE(preload), "%s Preload", dsp->cs_dsp.name);
1121 cs_dsp_init_debugfs(&dsp->cs_dsp, component->debugfs_root);
1123 dsp->component = component;
1129 int wm_adsp2_component_remove(struct wm_adsp *dsp, struct snd_soc_component *component)
1131 cs_dsp_cleanup_debugfs(&dsp->cs_dsp);
1137 int wm_adsp2_init(struct wm_adsp *dsp)
1141 INIT_WORK(&dsp->boot_work, wm_adsp_boot_work);
1143 dsp->sys_config_size = sizeof(struct wm_adsp_system_config_xm_hdr);
1144 dsp->cs_dsp.client_ops = &wm_adsp2_client_ops;
1146 ret = cs_dsp_adsp2_init(&dsp->cs_dsp);
1150 return wm_adsp_common_init(dsp);
1154 int wm_halo_init(struct wm_adsp *dsp)
1158 INIT_WORK(&dsp->boot_work, wm_adsp_boot_work);
1160 dsp->sys_config_size = sizeof(struct wm_halo_system_config_xm_hdr);
1161 dsp->cs_dsp.client_ops = &wm_adsp2_client_ops;
1163 ret = cs_dsp_halo_init(&dsp->cs_dsp);
1167 return wm_adsp_common_init(dsp);
1171 void wm_adsp2_remove(struct wm_adsp *dsp)
1173 cs_dsp_remove(&dsp->cs_dsp);
1186 if (compr->dsp->fatal_error)
1189 list_for_each_entry(tmp, &compr->dsp->buffer_list, list) {
1220 int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream)
1226 mutex_lock(&dsp->cs_dsp.pwr_lock);
1228 if (wm_adsp_fw[dsp->fw].num_caps == 0) {
1229 adsp_err(dsp, "%s: Firmware does not support compressed API\n",
1235 if (wm_adsp_fw[dsp->fw].compr_direction != stream->direction) {
1236 adsp_err(dsp, "%s: Firmware does not support stream direction\n",
1242 list_for_each_entry(tmp, &dsp->compr_list, list) {
1244 adsp_err(dsp, "%s: Only a single stream supported per dai\n",
1257 compr->dsp = dsp;
1261 list_add_tail(&compr->list, &dsp->compr_list);
1266 mutex_unlock(&dsp->cs_dsp.pwr_lock);
1276 struct wm_adsp *dsp = compr->dsp;
1278 mutex_lock(&dsp->cs_dsp.pwr_lock);
1286 mutex_unlock(&dsp->cs_dsp.pwr_lock);
1296 struct wm_adsp *dsp = compr->dsp;
1313 for (i = 0; i < wm_adsp_fw[dsp->fw].num_caps; i++) {
1314 caps = &wm_adsp_fw[dsp->fw].caps[i];
1380 int fw = compr->dsp->fw;
1403 return cs_dsp_read_data_word(&buf->dsp->cs_dsp, buf->host_buf_mem_type,
1410 return cs_dsp_write_data_word(&buf->dsp->cs_dsp, buf->host_buf_mem_type,
1417 const struct wm_adsp_fw_caps *caps = wm_adsp_fw[buf->dsp->fw].caps;
1465 static struct wm_adsp_compr_buf *wm_adsp_buffer_alloc(struct wm_adsp *dsp)
1473 buf->dsp = dsp;
1480 static int wm_adsp_buffer_parse_legacy(struct wm_adsp *dsp)
1487 alg_region = cs_dsp_find_alg_region(&dsp->cs_dsp, WMFW_ADSP2_XM, dsp->cs_dsp.fw_id);
1489 adsp_err(dsp, "No algorithm region found\n");
1493 xmalg = dsp->sys_config_size / sizeof(__be32);
1496 ret = cs_dsp_read_data_word(&dsp->cs_dsp, WMFW_ADSP2_XM, addr, &magic);
1503 buf = wm_adsp_buffer_alloc(dsp);
1509 ret = cs_dsp_read_data_word(&dsp->cs_dsp, WMFW_ADSP2_XM, addr,
1531 list_add_tail(&buf->list, &dsp->buffer_list);
1547 struct wm_adsp *dsp = container_of(cs_ctl->dsp, struct wm_adsp, cs_dsp);
1564 adsp_err(dsp, "Failed to acquire host buffer\n");
1568 buf = wm_adsp_buffer_alloc(dsp);
1590 adsp_err(dsp,
1599 buf->name = kasprintf(GFP_KERNEL, "%s-dsp-%s", dsp->part,
1603 list_add_tail(&buf->list, &dsp->buffer_list);
1616 static int wm_adsp_buffer_init(struct wm_adsp *dsp)
1621 list_for_each_entry(cs_ctl, &dsp->cs_dsp.ctl_list, list) {
1630 adsp_err(dsp, "Failed to parse coeff: %d\n", ret);
1638 if (list_empty(&dsp->buffer_list)) {
1640 ret = wm_adsp_buffer_parse_legacy(dsp);
1642 adsp_info(dsp, "Legacy support not available\n");
1644 adsp_warn(dsp, "Failed to parse legacy: %d\n", ret);
1650 wm_adsp_buffer_free(dsp);
1654 static int wm_adsp_buffer_free(struct wm_adsp *dsp)
1658 list_for_each_entry_safe(buf, tmp, &dsp->buffer_list, list) {
1691 struct wm_adsp *dsp = compr->dsp;
1696 mutex_lock(&dsp->cs_dsp.pwr_lock);
1732 mutex_unlock(&dsp->cs_dsp.pwr_lock);
1740 int last_region = wm_adsp_fw[buf->dsp->fw].caps->num_regions - 1;
1788 int wm_adsp_compr_handle_irq(struct wm_adsp *dsp)
1794 mutex_lock(&dsp->cs_dsp.pwr_lock);
1796 if (list_empty(&dsp->buffer_list)) {
1801 adsp_dbg(dsp, "Handling buffer IRQ\n");
1803 list_for_each_entry(buf, &dsp->buffer_list, list) {
1823 if (wm_adsp_fw[dsp->fw].voice_trigger && buf->irq_count == 2)
1832 mutex_unlock(&dsp->cs_dsp.pwr_lock);
1856 struct wm_adsp *dsp = compr->dsp;
1862 mutex_lock(&dsp->cs_dsp.pwr_lock);
1866 if (dsp->fatal_error || !buf || buf->error) {
1906 mutex_unlock(&dsp->cs_dsp.pwr_lock);
1920 for (i = 0; i < wm_adsp_fw[buf->dsp->fw].caps->num_regions; ++i)
1924 if (i == wm_adsp_fw[buf->dsp->fw].caps->num_regions)
1944 ret = cs_dsp_read_raw_data_block(&buf->dsp->cs_dsp, mem_type, adsp_addr,
1970 struct wm_adsp *dsp = compr->dsp;
1976 if (dsp->fatal_error || !compr->buf || compr->buf->error) {
2015 struct wm_adsp *dsp = compr->dsp;
2018 mutex_lock(&dsp->cs_dsp.pwr_lock);
2025 mutex_unlock(&dsp->cs_dsp.pwr_lock);
2033 struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
2036 dsp->fatal_error = true;
2038 list_for_each_entry(compr, &dsp->compr_list, list) {
2046 struct wm_adsp *dsp = (struct wm_adsp *)data;
2048 cs_dsp_adsp2_bus_error(&dsp->cs_dsp);
2056 struct wm_adsp *dsp = (struct wm_adsp *)data;
2058 cs_dsp_halo_bus_error(&dsp->cs_dsp);
2066 struct wm_adsp *dsp = data;
2068 cs_dsp_halo_wdt_expire(&dsp->cs_dsp);