Lines Matching refs:dsp

46 	adsp_err(_obj->dsp, "%s: " fmt, _obj->name ? _obj->name : "legacy", \
49 adsp_dbg(_obj->dsp, "%s: " fmt, _obj->name ? _obj->name : "legacy", \
150 struct wm_adsp *dsp;
167 struct wm_adsp *dsp;
199 static int wm_adsp_buffer_init(struct wm_adsp *dsp);
200 static int wm_adsp_buffer_free(struct wm_adsp *dsp);
322 struct wm_adsp *dsp = snd_soc_component_get_drvdata(component);
324 ucontrol->value.enumerated.item[0] = dsp[e->shift_l].fw;
335 struct wm_adsp *dsp = snd_soc_component_get_drvdata(component);
338 if (ucontrol->value.enumerated.item[0] == dsp[e->shift_l].fw)
344 mutex_lock(&dsp[e->shift_l].cs_dsp.pwr_lock);
346 if (dsp[e->shift_l].cs_dsp.booted || !list_empty(&dsp[e->shift_l].compr_list))
349 dsp[e->shift_l].fw = ucontrol->value.enumerated.item[0];
351 mutex_unlock(&dsp[e->shift_l].cs_dsp.pwr_lock);
408 mutex_lock(&cs_ctl->dsp->pwr_lock);
410 mutex_unlock(&cs_ctl->dsp->pwr_lock);
432 mutex_lock(&cs_ctl->dsp->pwr_lock);
434 mutex_unlock(&cs_ctl->dsp->pwr_lock);
454 mutex_lock(&cs_ctl->dsp->pwr_lock);
461 mutex_unlock(&cs_ctl->dsp->pwr_lock);
479 mutex_lock(&cs_ctl->dsp->pwr_lock);
481 mutex_unlock(&cs_ctl->dsp->pwr_lock);
495 mutex_lock(&cs_ctl->dsp->pwr_lock);
502 mutex_unlock(&cs_ctl->dsp->pwr_lock);
559 struct wm_adsp *dsp = container_of(cs_ctl->dsp,
592 snd_soc_add_component_controls(dsp->component, kcontrol, 1);
599 struct wm_adsp *dsp = container_of(cs_ctl->dsp, struct wm_adsp, cs_dsp);
600 struct cs_dsp *cs_dsp = &dsp->cs_dsp;
611 adsp_err(dsp, "Unknown region type: %d\n", cs_ctl->alg_region.type);
625 wm_adsp_fw_text[dsp->fw], cs_ctl->alg_region.alg);
630 wm_adsp_fw_text[dsp->fw], cs_ctl->alg_region.alg);
638 if (dsp->component->name_prefix)
639 avail -= strlen(dsp->component->name_prefix) + 1;
683 int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type,
686 struct cs_dsp_coeff_ctl *cs_ctl = cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg);
690 mutex_lock(&dsp->cs_dsp.pwr_lock);
692 mutex_unlock(&dsp->cs_dsp.pwr_lock);
702 return snd_soc_component_notify_control(dsp->component, ctl->name);
706 int wm_adsp_read_ctl(struct wm_adsp *dsp, const char *name, int type,
711 mutex_lock(&dsp->cs_dsp.pwr_lock);
712 ret = cs_dsp_coeff_read_ctrl(cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg),
714 mutex_unlock(&dsp->cs_dsp.pwr_lock);
720 static void wm_adsp_release_firmware_files(struct wm_adsp *dsp,
735 static int wm_adsp_request_firmware_file(struct wm_adsp *dsp,
741 struct cs_dsp *cs_dsp = &dsp->cs_dsp;
746 if (dsp->fwf_name)
747 fwf = dsp->fwf_name;
749 fwf = dsp->cs_dsp.name;
752 *filename = kasprintf(GFP_KERNEL, "%s%s-%s-%s-%s-%s.%s", dir, dsp->part,
753 fwf, wm_adsp_fw[dsp->fw].file, system_name,
756 *filename = kasprintf(GFP_KERNEL, "%s%s-%s-%s-%s.%s", dir, dsp->part,
757 fwf, wm_adsp_fw[dsp->fw].file, system_name,
760 *filename = kasprintf(GFP_KERNEL, "%s%s-%s-%s.%s", dir, dsp->part, fwf,
761 wm_adsp_fw[dsp->fw].file, filetype);
783 adsp_dbg(dsp, "Failed to request '%s'\n", *filename);
787 adsp_dbg(dsp, "Found '%s'\n", *filename);
794 static int wm_adsp_request_firmware_files(struct wm_adsp *dsp,
800 const char *system_name = dsp->system_name;
801 const char *asoc_component_prefix = dsp->component->name_prefix;
805 if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
808 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
816 if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
820 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
825 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
832 if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
834 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
839 ret = wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
842 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
847 if (dsp->wmfw_optional) {
850 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
855 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
861 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
865 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
871 adsp_err(dsp, "Failed to request firmware <%s>%s-%s-%s<-%s<%s>>.wmfw\n",
872 cirrus_dir, dsp->part,
873 dsp->fwf_name ? dsp->fwf_name : dsp->cs_dsp.name,
874 wm_adsp_fw[dsp->fw].file, system_name, asoc_component_prefix);
879 static int wm_adsp_common_init(struct wm_adsp *dsp)
881 INIT_LIST_HEAD(&dsp->compr_list);
882 INIT_LIST_HEAD(&dsp->buffer_list);
887 int wm_adsp1_init(struct wm_adsp *dsp)
891 dsp->cs_dsp.client_ops = &wm_adsp1_client_ops;
893 ret = cs_dsp_adsp1_init(&dsp->cs_dsp);
897 return wm_adsp_common_init(dsp);
907 struct wm_adsp *dsp = &dsps[w->shift];
914 dsp->component = component;
918 ret = wm_adsp_request_firmware_files(dsp,
924 ret = cs_dsp_adsp1_power_up(&dsp->cs_dsp,
927 wm_adsp_fw_text[dsp->fw]);
929 wm_adsp_release_firmware_files(dsp,
934 cs_dsp_adsp1_power_down(&dsp->cs_dsp);
948 struct wm_adsp *dsp = &dsps[w->shift];
950 return cs_dsp_set_dspclk(&dsp->cs_dsp, freq);
961 struct wm_adsp *dsp = &dsps[mc->shift - 1];
963 ucontrol->value.integer.value[0] = dsp->preloaded;
977 struct wm_adsp *dsp = &dsps[mc->shift - 1];
980 if (dsp->preloaded == ucontrol->value.integer.value[0])
983 snprintf(preload, ARRAY_SIZE(preload), "%s Preload", dsp->cs_dsp.name);
985 if (ucontrol->value.integer.value[0] || dsp->toggle_preload)
992 flush_work(&dsp->boot_work);
994 dsp->preloaded = ucontrol->value.integer.value[0];
996 if (dsp->toggle_preload) {
1005 int wm_adsp_power_up(struct wm_adsp *dsp, bool load_firmware)
1014 ret = wm_adsp_request_firmware_files(dsp,
1021 ret = cs_dsp_power_up(&dsp->cs_dsp,
1024 wm_adsp_fw_text[dsp->fw]);
1026 wm_adsp_release_firmware_files(dsp,
1034 void wm_adsp_power_down(struct wm_adsp *dsp)
1036 cs_dsp_power_down(&dsp->cs_dsp);
1042 struct wm_adsp *dsp = container_of(work,
1046 wm_adsp_power_up(dsp, true);
1054 struct wm_adsp *dsp = &dsps[w->shift];
1058 queue_work(system_unbound_wq, &dsp->boot_work);
1061 wm_adsp_power_down(dsp);
1073 struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
1075 if (!dsp->pre_run)
1078 return (*dsp->pre_run)(dsp);
1083 struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
1085 if (wm_adsp_fw[dsp->fw].num_caps != 0)
1086 return wm_adsp_buffer_init(dsp);
1093 struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
1095 if (wm_adsp_fw[dsp->fw].num_caps != 0)
1096 wm_adsp_buffer_free(dsp);
1098 dsp->fatal_error = false;
1106 struct wm_adsp *dsp = &dsps[w->shift];
1111 flush_work(&dsp->boot_work);
1112 ret = cs_dsp_run(&dsp->cs_dsp);
1115 cs_dsp_stop(&dsp->cs_dsp);
1125 int wm_adsp2_component_probe(struct wm_adsp *dsp, struct snd_soc_component *component)
1129 if (!dsp->cs_dsp.no_core_startstop) {
1130 snprintf(preload, ARRAY_SIZE(preload), "%s Preload", dsp->cs_dsp.name);
1134 cs_dsp_init_debugfs(&dsp->cs_dsp, component->debugfs_root);
1136 dsp->component = component;
1142 int wm_adsp2_component_remove(struct wm_adsp *dsp, struct snd_soc_component *component)
1144 cs_dsp_cleanup_debugfs(&dsp->cs_dsp);
1150 int wm_adsp2_init(struct wm_adsp *dsp)
1154 INIT_WORK(&dsp->boot_work, wm_adsp_boot_work);
1156 dsp->sys_config_size = sizeof(struct wm_adsp_system_config_xm_hdr);
1157 dsp->cs_dsp.client_ops = &wm_adsp2_client_ops;
1159 ret = cs_dsp_adsp2_init(&dsp->cs_dsp);
1163 return wm_adsp_common_init(dsp);
1167 int wm_halo_init(struct wm_adsp *dsp)
1171 INIT_WORK(&dsp->boot_work, wm_adsp_boot_work);
1173 dsp->sys_config_size = sizeof(struct wm_halo_system_config_xm_hdr);
1174 dsp->cs_dsp.client_ops = &wm_adsp2_client_ops;
1176 ret = cs_dsp_halo_init(&dsp->cs_dsp);
1180 return wm_adsp_common_init(dsp);
1184 void wm_adsp2_remove(struct wm_adsp *dsp)
1186 cs_dsp_remove(&dsp->cs_dsp);
1199 if (compr->dsp->fatal_error)
1202 list_for_each_entry(tmp, &compr->dsp->buffer_list, list) {
1233 int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream)
1239 mutex_lock(&dsp->cs_dsp.pwr_lock);
1241 if (wm_adsp_fw[dsp->fw].num_caps == 0) {
1242 adsp_err(dsp, "%s: Firmware does not support compressed API\n",
1248 if (wm_adsp_fw[dsp->fw].compr_direction != stream->direction) {
1249 adsp_err(dsp, "%s: Firmware does not support stream direction\n",
1255 list_for_each_entry(tmp, &dsp->compr_list, list) {
1257 adsp_err(dsp, "%s: Only a single stream supported per dai\n",
1270 compr->dsp = dsp;
1274 list_add_tail(&compr->list, &dsp->compr_list);
1279 mutex_unlock(&dsp->cs_dsp.pwr_lock);
1289 struct wm_adsp *dsp = compr->dsp;
1291 mutex_lock(&dsp->cs_dsp.pwr_lock);
1299 mutex_unlock(&dsp->cs_dsp.pwr_lock);
1309 struct wm_adsp *dsp = compr->dsp;
1326 for (i = 0; i < wm_adsp_fw[dsp->fw].num_caps; i++) {
1327 caps = &wm_adsp_fw[dsp->fw].caps[i];
1393 int fw = compr->dsp->fw;
1416 return cs_dsp_read_data_word(&buf->dsp->cs_dsp, buf->host_buf_mem_type,
1423 return cs_dsp_write_data_word(&buf->dsp->cs_dsp, buf->host_buf_mem_type,
1430 const struct wm_adsp_fw_caps *caps = wm_adsp_fw[buf->dsp->fw].caps;
1478 static struct wm_adsp_compr_buf *wm_adsp_buffer_alloc(struct wm_adsp *dsp)
1486 buf->dsp = dsp;
1493 static int wm_adsp_buffer_parse_legacy(struct wm_adsp *dsp)
1500 alg_region = cs_dsp_find_alg_region(&dsp->cs_dsp, WMFW_ADSP2_XM, dsp->cs_dsp.fw_id);
1502 adsp_err(dsp, "No algorithm region found\n");
1506 xmalg = dsp->sys_config_size / sizeof(__be32);
1509 ret = cs_dsp_read_data_word(&dsp->cs_dsp, WMFW_ADSP2_XM, addr, &magic);
1516 buf = wm_adsp_buffer_alloc(dsp);
1522 ret = cs_dsp_read_data_word(&dsp->cs_dsp, WMFW_ADSP2_XM, addr,
1544 list_add_tail(&buf->list, &dsp->buffer_list);
1560 struct wm_adsp *dsp = container_of(cs_ctl->dsp, struct wm_adsp, cs_dsp);
1577 adsp_err(dsp, "Failed to acquire host buffer\n");
1581 buf = wm_adsp_buffer_alloc(dsp);
1603 adsp_err(dsp,
1612 buf->name = kasprintf(GFP_KERNEL, "%s-dsp-%s", dsp->part,
1616 list_add_tail(&buf->list, &dsp->buffer_list);
1629 static int wm_adsp_buffer_init(struct wm_adsp *dsp)
1634 list_for_each_entry(cs_ctl, &dsp->cs_dsp.ctl_list, list) {
1643 adsp_err(dsp, "Failed to parse coeff: %d\n", ret);
1651 if (list_empty(&dsp->buffer_list)) {
1653 ret = wm_adsp_buffer_parse_legacy(dsp);
1655 adsp_info(dsp, "Legacy support not available\n");
1657 adsp_warn(dsp, "Failed to parse legacy: %d\n", ret);
1663 wm_adsp_buffer_free(dsp);
1667 static int wm_adsp_buffer_free(struct wm_adsp *dsp)
1671 list_for_each_entry_safe(buf, tmp, &dsp->buffer_list, list) {
1704 struct wm_adsp *dsp = compr->dsp;
1709 mutex_lock(&dsp->cs_dsp.pwr_lock);
1745 mutex_unlock(&dsp->cs_dsp.pwr_lock);
1753 int last_region = wm_adsp_fw[buf->dsp->fw].caps->num_regions - 1;
1801 int wm_adsp_compr_handle_irq(struct wm_adsp *dsp)
1807 mutex_lock(&dsp->cs_dsp.pwr_lock);
1809 if (list_empty(&dsp->buffer_list)) {
1814 adsp_dbg(dsp, "Handling buffer IRQ\n");
1816 list_for_each_entry(buf, &dsp->buffer_list, list) {
1836 if (wm_adsp_fw[dsp->fw].voice_trigger && buf->irq_count == 2)
1845 mutex_unlock(&dsp->cs_dsp.pwr_lock);
1869 struct wm_adsp *dsp = compr->dsp;
1875 mutex_lock(&dsp->cs_dsp.pwr_lock);
1879 if (dsp->fatal_error || !buf || buf->error) {
1919 mutex_unlock(&dsp->cs_dsp.pwr_lock);
1933 for (i = 0; i < wm_adsp_fw[buf->dsp->fw].caps->num_regions; ++i)
1937 if (i == wm_adsp_fw[buf->dsp->fw].caps->num_regions)
1957 ret = cs_dsp_read_raw_data_block(&buf->dsp->cs_dsp, mem_type, adsp_addr,
1983 struct wm_adsp *dsp = compr->dsp;
1989 if (dsp->fatal_error || !compr->buf || compr->buf->error) {
2028 struct wm_adsp *dsp = compr->dsp;
2031 mutex_lock(&dsp->cs_dsp.pwr_lock);
2038 mutex_unlock(&dsp->cs_dsp.pwr_lock);
2046 struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
2049 dsp->fatal_error = true;
2051 list_for_each_entry(compr, &dsp->compr_list, list) {
2059 struct wm_adsp *dsp = (struct wm_adsp *)data;
2061 cs_dsp_adsp2_bus_error(&dsp->cs_dsp);
2069 struct wm_adsp *dsp = (struct wm_adsp *)data;
2071 cs_dsp_halo_bus_error(&dsp->cs_dsp);
2079 struct wm_adsp *dsp = data;
2081 cs_dsp_halo_wdt_expire(&dsp->cs_dsp);