• Home
  • Raw
  • Download

Lines Matching +full:asrc +full:- +full:format

1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
19 #include "sof-priv.h"
20 #include "sof-audio.h"
26 * from dB gain 20th root of 10 in Q1.16 fixed-point notation
29 /* 40th root of 10 in Q1.16 fixed-point notation*/
33 * the volume linear gain value to use Qx.16 format
61 struct snd_soc_component *scomp = swidget->scomp; in ipc_pcm_params()
71 spcm = snd_sof_find_spcm_name(scomp, swidget->widget->sname); in ipc_pcm_params()
73 dev_err(scomp->dev, "error: cannot find PCM for %s\n", in ipc_pcm_params()
74 swidget->widget->name); in ipc_pcm_params()
75 return -EINVAL; in ipc_pcm_params()
78 params = &spcm->params[dir]; in ipc_pcm_params()
83 pcm.comp_id = swidget->comp_id; in ipc_pcm_params()
92 /* set format */ in ipc_pcm_params()
104 return -EINVAL; in ipc_pcm_params()
108 ret = sof_ipc_tx_message(sdev->ipc, pcm.hdr.cmd, &pcm, sizeof(pcm), in ipc_pcm_params()
111 dev_err(scomp->dev, "error: pcm params failed for %s\n", in ipc_pcm_params()
112 swidget->widget->name); in ipc_pcm_params()
120 struct snd_soc_component *scomp = swidget->scomp; in ipc_trigger()
129 stream.comp_id = swidget->comp_id; in ipc_trigger()
132 ret = sof_ipc_tx_message(sdev->ipc, stream.hdr.cmd, &stream, in ipc_trigger()
135 dev_err(scomp->dev, "error: failed to trigger %s\n", in ipc_trigger()
136 swidget->widget->name); in ipc_trigger()
144 struct snd_sof_widget *swidget = w->dobj.private; in sof_keyword_dapm_event()
153 scomp = swidget->scomp; in sof_keyword_dapm_event()
155 dev_dbg(scomp->dev, "received event %d for widget %s\n", in sof_keyword_dapm_event()
156 event, w->name); in sof_keyword_dapm_event()
159 spcm = snd_sof_find_spcm_name(scomp, swidget->widget->sname); in sof_keyword_dapm_event()
161 dev_err(scomp->dev, "error: cannot find PCM for %s\n", in sof_keyword_dapm_event()
162 swidget->widget->name); in sof_keyword_dapm_event()
163 return -EINVAL; in sof_keyword_dapm_event()
169 if (spcm->stream[stream].suspend_ignored) { in sof_keyword_dapm_event()
170 dev_dbg(scomp->dev, "PRE_PMU event ignored, KWD pipeline is already RUNNING\n"); in sof_keyword_dapm_event()
177 dev_err(scomp->dev, in sof_keyword_dapm_event()
179 swidget->widget->name); in sof_keyword_dapm_event()
186 dev_err(scomp->dev, in sof_keyword_dapm_event()
188 swidget->widget->name); in sof_keyword_dapm_event()
191 if (spcm->stream[stream].suspend_ignored) { in sof_keyword_dapm_event()
192 dev_dbg(scomp->dev, "POST_PMD even ignored, KWD pipeline will remain RUNNING\n"); in sof_keyword_dapm_event()
199 dev_err(scomp->dev, in sof_keyword_dapm_event()
201 swidget->widget->name); in sof_keyword_dapm_event()
206 dev_err(scomp->dev, in sof_keyword_dapm_event()
208 swidget->widget->name); in sof_keyword_dapm_event()
226 return -EINVAL; in get_tlv_data()
246 * Function to truncate an unsigned 64-bit number
247 * by x bits and return 32-bit unsigned number. This
259 return (u32)(((i >> (x - 1)) + 1) >> 1); in vol_shift_64()
264 * a is a fractional number represented by a fixed-point
269 * fixed-point integer with a fractional word length of "fwl"
283 iter = exp * -1; in vol_pow32()
290 * Product of 2 Qx.fwl fixed-point numbers yields a Q2*x.2*fwl in vol_pow32()
329 * compute linear gain represented by fixed-point in vol_compute_gain()
335 f_step = tlv[TLV_STEP] - (tlv[TLV_STEP] / 100); in vol_compute_gain()
356 scontrol->volume_table = kcalloc(size, sizeof(u32), GFP_KERNEL); in set_up_volume_table()
357 if (!scontrol->volume_table) in set_up_volume_table()
358 return -ENOMEM; in set_up_volume_table()
362 scontrol->volume_table[j] = vol_compute_gain(j, tlv); in set_up_volume_table()
394 * Supported Frame format types and lookup, add new ones to end of list.
482 *val = le32_to_cpu(velem->value); in get_token_u32()
491 *val = (u16)le32_to_cpu(velem->value); in get_token_u16()
500 memcpy(dst, velem->uuid, UUID_SIZE); in get_token_uuid()
510 *val = find_format(velem->string); in get_token_comp_format()
519 *val = find_dai(velem->string); in get_token_dai_type()
529 *val = find_process(velem->string); in get_token_process_type()
592 /* ASRC */
812 for (i = 0; i < le32_to_cpu(array->num_elems); i++) { in sof_parse_uuid_tokens()
813 elem = &array->uuid[i]; in sof_parse_uuid_tokens()
822 if (tokens[j].token != le32_to_cpu(elem->token)) in sof_parse_uuid_tokens()
825 /* matched - now load token */ in sof_parse_uuid_tokens()
849 for (i = 0; i < le32_to_cpu(array->num_elems); i++) { in sof_parse_string_tokens()
850 elem = &array->string[i]; in sof_parse_string_tokens()
859 if (tokens[j].token != le32_to_cpu(elem->token)) in sof_parse_string_tokens()
862 /* matched - now load token */ in sof_parse_string_tokens()
886 for (i = 0; i < le32_to_cpu(array->num_elems); i++) { in sof_parse_word_tokens()
887 elem = &array->value[i]; in sof_parse_word_tokens()
899 if (tokens[j].token != le32_to_cpu(elem->token)) in sof_parse_word_tokens()
915 * sof_parse_token_sets - Parse multiple sets of tokens
941 asize = le32_to_cpu(array->size); in sof_parse_token_sets()
944 if (asize < 0) { /* FIXME: A zero-size array makes no sense */ in sof_parse_token_sets()
945 dev_err(scomp->dev, "error: invalid array size 0x%x\n", in sof_parse_token_sets()
947 return -EINVAL; in sof_parse_token_sets()
951 priv_size -= asize; in sof_parse_token_sets()
953 dev_err(scomp->dev, "error: invalid array size 0x%x\n", in sof_parse_token_sets()
955 return -EINVAL; in sof_parse_token_sets()
959 switch (le32_to_cpu(array->type)) { in sof_parse_token_sets()
976 dev_err(scomp->dev, "error: unknown token type %d\n", in sof_parse_token_sets()
977 array->type); in sof_parse_token_sets()
978 return -EINVAL; in sof_parse_token_sets()
1016 dev_dbg(scomp->dev, " config: periods snk %d src %d fmt %d\n", in sof_dbg_comp_config()
1017 config->periods_sink, config->periods_source, in sof_dbg_comp_config()
1018 config->frame_fmt); in sof_dbg_comp_config()
1039 if (le32_to_cpu(mc->num_channels) > SND_SOC_TPLG_MAX_CHAN) { in sof_control_load_volume()
1040 ret = -EINVAL; in sof_control_load_volume()
1045 scontrol->size = struct_size(scontrol->control_data, chanv, in sof_control_load_volume()
1046 le32_to_cpu(mc->num_channels)); in sof_control_load_volume()
1047 scontrol->control_data = kzalloc(scontrol->size, GFP_KERNEL); in sof_control_load_volume()
1048 if (!scontrol->control_data) { in sof_control_load_volume()
1049 ret = -ENOMEM; in sof_control_load_volume()
1053 scontrol->comp_id = sdev->next_comp_id; in sof_control_load_volume()
1054 scontrol->min_volume_step = le32_to_cpu(mc->min); in sof_control_load_volume()
1055 scontrol->max_volume_step = le32_to_cpu(mc->max); in sof_control_load_volume()
1056 scontrol->num_channels = le32_to_cpu(mc->num_channels); in sof_control_load_volume()
1059 if (le32_to_cpu(mc->max) == 1) { in sof_control_load_volume()
1060 scontrol->cmd = SOF_CTRL_CMD_SWITCH; in sof_control_load_volume()
1064 scontrol->cmd = SOF_CTRL_CMD_VOLUME; in sof_control_load_volume()
1067 if (get_tlv_data(kc->tlv.p, tlv) < 0) { in sof_control_load_volume()
1068 dev_err(scomp->dev, "error: invalid TLV data\n"); in sof_control_load_volume()
1069 ret = -EINVAL; in sof_control_load_volume()
1074 ret = set_up_volume_table(scontrol, tlv, le32_to_cpu(mc->max) + 1); in sof_control_load_volume()
1076 dev_err(scomp->dev, "error: setting up volume table\n"); in sof_control_load_volume()
1081 cdata = scontrol->control_data; in sof_control_load_volume()
1082 for (i = 0; i < scontrol->num_channels; i++) { in sof_control_load_volume()
1083 cdata->chanv[i].channel = i; in sof_control_load_volume()
1084 cdata->chanv[i].value = VOL_ZERO_DB; in sof_control_load_volume()
1089 ret = sof_parse_tokens(scomp, &scontrol->led_ctl, led_tokens, in sof_control_load_volume()
1090 ARRAY_SIZE(led_tokens), mc->priv.array, in sof_control_load_volume()
1091 le32_to_cpu(mc->priv.size)); in sof_control_load_volume()
1093 dev_err(scomp->dev, "error: parse led tokens failed %d\n", in sof_control_load_volume()
1094 le32_to_cpu(mc->priv.size)); in sof_control_load_volume()
1098 dev_dbg(scomp->dev, "tplg: load kcontrol index %d chans %d\n", in sof_control_load_volume()
1099 scontrol->comp_id, scontrol->num_channels); in sof_control_load_volume()
1104 if (le32_to_cpu(mc->max) > 1) in sof_control_load_volume()
1105 kfree(scontrol->volume_table); in sof_control_load_volume()
1107 kfree(scontrol->control_data); in sof_control_load_volume()
1122 if (le32_to_cpu(ec->num_channels) > SND_SOC_TPLG_MAX_CHAN) in sof_control_load_enum()
1123 return -EINVAL; in sof_control_load_enum()
1126 scontrol->size = struct_size(scontrol->control_data, chanv, in sof_control_load_enum()
1127 le32_to_cpu(ec->num_channels)); in sof_control_load_enum()
1128 scontrol->control_data = kzalloc(scontrol->size, GFP_KERNEL); in sof_control_load_enum()
1129 if (!scontrol->control_data) in sof_control_load_enum()
1130 return -ENOMEM; in sof_control_load_enum()
1132 scontrol->comp_id = sdev->next_comp_id; in sof_control_load_enum()
1133 scontrol->num_channels = le32_to_cpu(ec->num_channels); in sof_control_load_enum()
1135 scontrol->cmd = SOF_CTRL_CMD_ENUM; in sof_control_load_enum()
1137 dev_dbg(scomp->dev, "tplg: load kcontrol index %d chans %d comp_id %d\n", in sof_control_load_enum()
1138 scontrol->comp_id, scontrol->num_channels, scontrol->comp_id); in sof_control_load_enum()
1152 struct soc_bytes_ext *sbe = (struct soc_bytes_ext *)kc->private_value; in sof_control_load_bytes()
1153 size_t max_size = sbe->max; in sof_control_load_bytes()
1154 size_t priv_size = le32_to_cpu(control->priv.size); in sof_control_load_bytes()
1159 ret = -EINVAL; in sof_control_load_bytes()
1164 if (priv_size > max_size - sizeof(struct sof_ipc_ctrl_data)) { in sof_control_load_bytes()
1165 dev_err(scomp->dev, "err: bytes data size %zu exceeds max %zu.\n", in sof_control_load_bytes()
1166 priv_size, max_size - sizeof(struct sof_ipc_ctrl_data)); in sof_control_load_bytes()
1167 ret = -EINVAL; in sof_control_load_bytes()
1171 scontrol->size = sizeof(struct sof_ipc_ctrl_data) + priv_size; in sof_control_load_bytes()
1173 scontrol->control_data = kzalloc(max_size, GFP_KERNEL); in sof_control_load_bytes()
1174 cdata = scontrol->control_data; in sof_control_load_bytes()
1175 if (!scontrol->control_data) { in sof_control_load_bytes()
1176 ret = -ENOMEM; in sof_control_load_bytes()
1180 scontrol->comp_id = sdev->next_comp_id; in sof_control_load_bytes()
1181 scontrol->cmd = SOF_CTRL_CMD_BINARY; in sof_control_load_bytes()
1183 dev_dbg(scomp->dev, "tplg: load kcontrol index %d chans %d\n", in sof_control_load_bytes()
1184 scontrol->comp_id, scontrol->num_channels); in sof_control_load_bytes()
1186 if (le32_to_cpu(control->priv.size) > 0) { in sof_control_load_bytes()
1187 memcpy(cdata->data, control->priv.data, in sof_control_load_bytes()
1188 le32_to_cpu(control->priv.size)); in sof_control_load_bytes()
1190 if (cdata->data->magic != SOF_ABI_MAGIC) { in sof_control_load_bytes()
1191 dev_err(scomp->dev, "error: Wrong ABI magic 0x%08x.\n", in sof_control_load_bytes()
1192 cdata->data->magic); in sof_control_load_bytes()
1193 ret = -EINVAL; in sof_control_load_bytes()
1197 cdata->data->abi)) { in sof_control_load_bytes()
1198 dev_err(scomp->dev, in sof_control_load_bytes()
1200 cdata->data->abi); in sof_control_load_bytes()
1201 ret = -EINVAL; in sof_control_load_bytes()
1204 if (cdata->data->size + sizeof(const struct sof_abi_hdr) != in sof_control_load_bytes()
1205 le32_to_cpu(control->priv.size)) { in sof_control_load_bytes()
1206 dev_err(scomp->dev, in sof_control_load_bytes()
1208 ret = -EINVAL; in sof_control_load_bytes()
1216 kfree(scontrol->control_data); in sof_control_load_bytes()
1221 /* external kcontrol init - used for any driver specific init */
1234 dev_dbg(scomp->dev, "tplg: load control type %d name : %s\n", in sof_control_load()
1235 hdr->type, hdr->name); in sof_control_load()
1239 return -ENOMEM; in sof_control_load()
1241 scontrol->scomp = scomp; in sof_control_load()
1243 switch (le32_to_cpu(hdr->ops.info)) { in sof_control_load()
1247 sm = (struct soc_mixer_control *)kc->private_value; in sof_control_load()
1248 dobj = &sm->dobj; in sof_control_load()
1252 sbe = (struct soc_bytes_ext *)kc->private_value; in sof_control_load()
1253 dobj = &sbe->dobj; in sof_control_load()
1258 se = (struct soc_enum *)kc->private_value; in sof_control_load()
1259 dobj = &se->dobj; in sof_control_load()
1270 dev_warn(scomp->dev, "control type not supported %d:%d:%d\n", in sof_control_load()
1271 hdr->ops.get, hdr->ops.put, hdr->ops.info); in sof_control_load()
1281 scontrol->led_ctl.led_value = -1; in sof_control_load()
1283 dobj->private = scontrol; in sof_control_load()
1284 list_add(&scontrol->list, &sdev->kcontrol_list); in sof_control_load()
1293 struct snd_sof_control *scontrol = dobj->private; in sof_control_unload()
1295 dev_dbg(scomp->dev, "tplg: unload control name : %s\n", scomp->name); in sof_control_unload()
1299 fcomp.id = scontrol->comp_id; in sof_control_unload()
1301 kfree(scontrol->control_data); in sof_control_unload()
1302 list_del(&scontrol->list); in sof_control_unload()
1305 return sof_ipc_tx_message(sdev->ipc, in sof_control_unload()
1322 .enable_mask = sdev->enabled_cores_mask | BIT(core), in sof_core_enable()
1326 if (sdev->enabled_cores_mask & BIT(core)) in sof_core_enable()
1332 dev_err(sdev->dev, "error: %d powering up core %d\n", in sof_core_enable()
1338 ret = sof_ipc_tx_message(sdev->ipc, pm_core_config.hdr.cmd, in sof_core_enable()
1342 dev_err(sdev->dev, "error: core %d enable ipc failure %d\n", in sof_core_enable()
1348 sdev->enabled_cores_mask |= BIT(core); in sof_core_enable()
1354 dev_err(sdev->dev, "error: powering down core %d\n", core); in sof_core_enable()
1365 if (swidget->id == snd_soc_dapm_scheduler) { in sof_pipeline_core_enable()
1366 pipeline = swidget->private; in sof_pipeline_core_enable()
1368 pipeline = snd_sof_pipeline_find(sdev, swidget->pipeline_id); in sof_pipeline_core_enable()
1370 return -ENOENT; in sof_pipeline_core_enable()
1374 ret = sof_core_enable(sdev, pipeline->core); in sof_pipeline_core_enable()
1378 return sof_core_enable(sdev, swidget->core); in sof_pipeline_core_enable()
1386 struct snd_soc_card *card = scomp->card; in sof_connect_dai_widget()
1391 list_for_each_entry(rtd, &card->rtd_list, list) { in sof_connect_dai_widget()
1392 dev_vdbg(scomp->dev, "tplg: check widget: %s stream: %s dai stream: %s\n", in sof_connect_dai_widget()
1393 w->name, w->sname, rtd->dai_link->stream_name); in sof_connect_dai_widget()
1395 if (!w->sname || !rtd->dai_link->stream_name) in sof_connect_dai_widget()
1399 if (strcmp(w->sname, rtd->dai_link->stream_name)) in sof_connect_dai_widget()
1402 switch (w->id) { in sof_connect_dai_widget()
1410 if (!cpu_dai->capture_widget) { in sof_connect_dai_widget()
1411 cpu_dai->capture_widget = w; in sof_connect_dai_widget()
1415 if (i == rtd->num_cpus) { in sof_connect_dai_widget()
1416 dev_err(scomp->dev, "error: can't find BE for DAI %s\n", in sof_connect_dai_widget()
1417 w->name); in sof_connect_dai_widget()
1419 return -EINVAL; in sof_connect_dai_widget()
1421 dai->name = rtd->dai_link->name; in sof_connect_dai_widget()
1422 dev_dbg(scomp->dev, "tplg: connected widget %s -> DAI link %s\n", in sof_connect_dai_widget()
1423 w->name, rtd->dai_link->name); in sof_connect_dai_widget()
1432 if (!cpu_dai->playback_widget) { in sof_connect_dai_widget()
1433 cpu_dai->playback_widget = w; in sof_connect_dai_widget()
1437 if (i == rtd->num_cpus) { in sof_connect_dai_widget()
1438 dev_err(scomp->dev, "error: can't find BE for DAI %s\n", in sof_connect_dai_widget()
1439 w->name); in sof_connect_dai_widget()
1441 return -EINVAL; in sof_connect_dai_widget()
1443 dai->name = rtd->dai_link->name; in sof_connect_dai_widget()
1444 dev_dbg(scomp->dev, "tplg: connected widget %s -> DAI link %s\n", in sof_connect_dai_widget()
1445 w->name, rtd->dai_link->name); in sof_connect_dai_widget()
1453 if (!dai->name) { in sof_connect_dai_widget()
1454 dev_err(scomp->dev, "error: can't connect DAI %s stream %s\n", in sof_connect_dai_widget()
1455 w->name, w->sname); in sof_connect_dai_widget()
1456 return -EINVAL; in sof_connect_dai_widget()
1463 * sof_comp_alloc - allocate and initialize buffer for a new component
1478 /* only non-zero UUID is valid */ in sof_comp_alloc()
1479 if (memcmp(&swidget->comp_ext, nil_uuid, SOF_UUID_SIZE)) in sof_comp_alloc()
1480 total_size += sizeof(swidget->comp_ext); in sof_comp_alloc()
1487 comp->hdr.size = total_size; in sof_comp_alloc()
1488 comp->hdr.cmd = SOF_IPC_GLB_TPLG_MSG | SOF_IPC_TPLG_COMP_NEW; in sof_comp_alloc()
1489 comp->id = swidget->comp_id; in sof_comp_alloc()
1490 comp->pipeline_id = index; in sof_comp_alloc()
1491 comp->core = swidget->core; in sof_comp_alloc()
1496 memcpy((u8 *)comp + *ipc_size, &swidget->comp_ext, sizeof(swidget->comp_ext)); in sof_comp_alloc()
1497 comp->ext_data_length = sizeof(swidget->comp_ext); in sof_comp_alloc()
1512 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_dai()
1520 return -ENOMEM; in sof_widget_load_dai()
1523 comp_dai->comp.type = SOF_COMP_DAI; in sof_widget_load_dai()
1524 comp_dai->config.hdr.size = sizeof(comp_dai->config); in sof_widget_load_dai()
1527 ARRAY_SIZE(dai_tokens), private->array, in sof_widget_load_dai()
1528 le32_to_cpu(private->size)); in sof_widget_load_dai()
1530 dev_err(scomp->dev, "error: parse dai tokens failed %d\n", in sof_widget_load_dai()
1531 le32_to_cpu(private->size)); in sof_widget_load_dai()
1535 ret = sof_parse_tokens(scomp, &comp_dai->config, comp_tokens, in sof_widget_load_dai()
1536 ARRAY_SIZE(comp_tokens), private->array, in sof_widget_load_dai()
1537 le32_to_cpu(private->size)); in sof_widget_load_dai()
1539 dev_err(scomp->dev, "error: parse dai.cfg tokens failed %d\n", in sof_widget_load_dai()
1540 private->size); in sof_widget_load_dai()
1544 dev_dbg(scomp->dev, "dai %s: type %d index %d\n", in sof_widget_load_dai()
1545 swidget->widget->name, comp_dai->type, comp_dai->dai_index); in sof_widget_load_dai()
1546 sof_dbg_comp_config(scomp, &comp_dai->config); in sof_widget_load_dai()
1548 ret = sof_ipc_tx_message(sdev->ipc, comp_dai->comp.hdr.cmd, in sof_widget_load_dai()
1552 dai->scomp = scomp; in sof_widget_load_dai()
1559 memcpy(&dai->comp_dai, comp_dai, sizeof(*comp_dai)); in sof_widget_load_dai()
1577 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_buffer()
1583 return -ENOMEM; in sof_widget_load_buffer()
1586 buffer->comp.hdr.size = sizeof(*buffer); in sof_widget_load_buffer()
1587 buffer->comp.hdr.cmd = SOF_IPC_GLB_TPLG_MSG | SOF_IPC_TPLG_BUFFER_NEW; in sof_widget_load_buffer()
1588 buffer->comp.id = swidget->comp_id; in sof_widget_load_buffer()
1589 buffer->comp.type = SOF_COMP_BUFFER; in sof_widget_load_buffer()
1590 buffer->comp.pipeline_id = index; in sof_widget_load_buffer()
1591 buffer->comp.core = swidget->core; in sof_widget_load_buffer()
1594 ARRAY_SIZE(buffer_tokens), private->array, in sof_widget_load_buffer()
1595 le32_to_cpu(private->size)); in sof_widget_load_buffer()
1597 dev_err(scomp->dev, "error: parse buffer tokens failed %d\n", in sof_widget_load_buffer()
1598 private->size); in sof_widget_load_buffer()
1603 dev_dbg(scomp->dev, "buffer %s: size %d caps 0x%x\n", in sof_widget_load_buffer()
1604 swidget->widget->name, buffer->size, buffer->caps); in sof_widget_load_buffer()
1606 swidget->private = buffer; in sof_widget_load_buffer()
1608 ret = sof_ipc_tx_message(sdev->ipc, buffer->comp.hdr.cmd, buffer, in sof_widget_load_buffer()
1611 dev_err(scomp->dev, "error: buffer %s load failed\n", in sof_widget_load_buffer()
1612 swidget->widget->name); in sof_widget_load_buffer()
1626 spcm->pcm.caps[dir].name, in spcm_bind()
1629 dev_err(scomp->dev, "can't find host comp to bind pcm\n"); in spcm_bind()
1630 return -EINVAL; in spcm_bind()
1633 spcm->stream[dir].comp_id = host_widget->comp_id; in spcm_bind()
1649 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_pcm()
1657 return -ENOMEM; in sof_widget_load_pcm()
1660 host->comp.type = SOF_COMP_HOST; in sof_widget_load_pcm()
1661 host->direction = dir; in sof_widget_load_pcm()
1662 host->config.hdr.size = sizeof(host->config); in sof_widget_load_pcm()
1665 ARRAY_SIZE(pcm_tokens), private->array, in sof_widget_load_pcm()
1666 le32_to_cpu(private->size)); in sof_widget_load_pcm()
1668 dev_err(scomp->dev, "error: parse host tokens failed %d\n", in sof_widget_load_pcm()
1669 private->size); in sof_widget_load_pcm()
1673 ret = sof_parse_tokens(scomp, &host->config, comp_tokens, in sof_widget_load_pcm()
1674 ARRAY_SIZE(comp_tokens), private->array, in sof_widget_load_pcm()
1675 le32_to_cpu(private->size)); in sof_widget_load_pcm()
1677 dev_err(scomp->dev, "error: parse host.cfg tokens failed %d\n", in sof_widget_load_pcm()
1678 le32_to_cpu(private->size)); in sof_widget_load_pcm()
1682 dev_dbg(scomp->dev, "loaded host %s\n", swidget->widget->name); in sof_widget_load_pcm()
1683 sof_dbg_comp_config(scomp, &host->config); in sof_widget_load_pcm()
1685 swidget->private = host; in sof_widget_load_pcm()
1687 ret = sof_ipc_tx_message(sdev->ipc, host->comp.hdr.cmd, host, in sof_widget_load_pcm()
1704 int ret = sof_core_enable(sdev, pipeline->core); in sof_load_pipeline_ipc()
1709 ret = sof_ipc_tx_message(sdev->ipc, pipeline->hdr.cmd, pipeline, in sof_load_pipeline_ipc()
1722 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_pipeline()
1729 return -ENOMEM; in sof_widget_load_pipeline()
1732 pipeline->hdr.size = sizeof(*pipeline); in sof_widget_load_pipeline()
1733 pipeline->hdr.cmd = SOF_IPC_GLB_TPLG_MSG | SOF_IPC_TPLG_PIPE_NEW; in sof_widget_load_pipeline()
1734 pipeline->pipeline_id = index; in sof_widget_load_pipeline()
1735 pipeline->comp_id = swidget->comp_id; in sof_widget_load_pipeline()
1738 comp_swidget = snd_sof_find_swidget(scomp, tw->sname); in sof_widget_load_pipeline()
1740 dev_err(scomp->dev, "error: widget %s refers to non existent widget %s\n", in sof_widget_load_pipeline()
1741 tw->name, tw->sname); in sof_widget_load_pipeline()
1742 ret = -EINVAL; in sof_widget_load_pipeline()
1746 pipeline->sched_id = comp_swidget->comp_id; in sof_widget_load_pipeline()
1748 dev_dbg(scomp->dev, "tplg: pipeline id %d comp %d scheduling comp id %d\n", in sof_widget_load_pipeline()
1749 pipeline->pipeline_id, pipeline->comp_id, pipeline->sched_id); in sof_widget_load_pipeline()
1752 ARRAY_SIZE(sched_tokens), private->array, in sof_widget_load_pipeline()
1753 le32_to_cpu(private->size)); in sof_widget_load_pipeline()
1755 dev_err(scomp->dev, "error: parse pipeline tokens failed %d\n", in sof_widget_load_pipeline()
1756 private->size); in sof_widget_load_pipeline()
1760 dev_dbg(scomp->dev, "pipeline %s: period %d pri %d mips %d core %d frames %d\n", in sof_widget_load_pipeline()
1761 swidget->widget->name, pipeline->period, pipeline->priority, in sof_widget_load_pipeline()
1762 pipeline->period_mips, pipeline->core, pipeline->frames_per_sched); in sof_widget_load_pipeline()
1764 swidget->private = pipeline; in sof_widget_load_pipeline()
1767 ret = sof_load_pipeline_ipc(scomp->dev, pipeline, r); in sof_widget_load_pipeline()
1785 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_mixer()
1793 return -ENOMEM; in sof_widget_load_mixer()
1796 mixer->comp.type = SOF_COMP_MIXER; in sof_widget_load_mixer()
1797 mixer->config.hdr.size = sizeof(mixer->config); in sof_widget_load_mixer()
1799 ret = sof_parse_tokens(scomp, &mixer->config, comp_tokens, in sof_widget_load_mixer()
1800 ARRAY_SIZE(comp_tokens), private->array, in sof_widget_load_mixer()
1801 le32_to_cpu(private->size)); in sof_widget_load_mixer()
1803 dev_err(scomp->dev, "error: parse mixer.cfg tokens failed %d\n", in sof_widget_load_mixer()
1804 private->size); in sof_widget_load_mixer()
1809 sof_dbg_comp_config(scomp, &mixer->config); in sof_widget_load_mixer()
1811 swidget->private = mixer; in sof_widget_load_mixer()
1813 ret = sof_ipc_tx_message(sdev->ipc, mixer->comp.hdr.cmd, mixer, in sof_widget_load_mixer()
1830 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_mux()
1838 return -ENOMEM; in sof_widget_load_mux()
1841 mux->comp.type = SOF_COMP_MUX; in sof_widget_load_mux()
1842 mux->config.hdr.size = sizeof(mux->config); in sof_widget_load_mux()
1844 ret = sof_parse_tokens(scomp, &mux->config, comp_tokens, in sof_widget_load_mux()
1845 ARRAY_SIZE(comp_tokens), private->array, in sof_widget_load_mux()
1846 le32_to_cpu(private->size)); in sof_widget_load_mux()
1848 dev_err(scomp->dev, "error: parse mux.cfg tokens failed %d\n", in sof_widget_load_mux()
1849 private->size); in sof_widget_load_mux()
1854 sof_dbg_comp_config(scomp, &mux->config); in sof_widget_load_mux()
1856 swidget->private = mux; in sof_widget_load_mux()
1858 ret = sof_ipc_tx_message(sdev->ipc, mux->comp.hdr.cmd, mux, in sof_widget_load_mux()
1876 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_pga()
1887 return -ENOMEM; in sof_widget_load_pga()
1889 if (!le32_to_cpu(tw->num_kcontrols)) { in sof_widget_load_pga()
1890 dev_err(scomp->dev, "error: invalid kcontrol count %d for volume\n", in sof_widget_load_pga()
1891 tw->num_kcontrols); in sof_widget_load_pga()
1892 ret = -EINVAL; in sof_widget_load_pga()
1897 volume->comp.type = SOF_COMP_VOLUME; in sof_widget_load_pga()
1898 volume->config.hdr.size = sizeof(volume->config); in sof_widget_load_pga()
1901 ARRAY_SIZE(volume_tokens), private->array, in sof_widget_load_pga()
1902 le32_to_cpu(private->size)); in sof_widget_load_pga()
1904 dev_err(scomp->dev, "error: parse volume tokens failed %d\n", in sof_widget_load_pga()
1905 private->size); in sof_widget_load_pga()
1908 ret = sof_parse_tokens(scomp, &volume->config, comp_tokens, in sof_widget_load_pga()
1909 ARRAY_SIZE(comp_tokens), private->array, in sof_widget_load_pga()
1910 le32_to_cpu(private->size)); in sof_widget_load_pga()
1912 dev_err(scomp->dev, "error: parse volume.cfg tokens failed %d\n", in sof_widget_load_pga()
1913 le32_to_cpu(private->size)); in sof_widget_load_pga()
1917 sof_dbg_comp_config(scomp, &volume->config); in sof_widget_load_pga()
1919 swidget->private = volume; in sof_widget_load_pga()
1921 list_for_each_entry(scontrol, &sdev->kcontrol_list, list) { in sof_widget_load_pga()
1922 if (scontrol->comp_id == swidget->comp_id && in sof_widget_load_pga()
1923 scontrol->volume_table) { in sof_widget_load_pga()
1924 min_step = scontrol->min_volume_step; in sof_widget_load_pga()
1925 max_step = scontrol->max_volume_step; in sof_widget_load_pga()
1926 volume->min_value = scontrol->volume_table[min_step]; in sof_widget_load_pga()
1927 volume->max_value = scontrol->volume_table[max_step]; in sof_widget_load_pga()
1928 volume->channels = scontrol->num_channels; in sof_widget_load_pga()
1933 ret = sof_ipc_tx_message(sdev->ipc, volume->comp.hdr.cmd, volume, in sof_widget_load_pga()
1952 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_src()
1960 return -ENOMEM; in sof_widget_load_src()
1963 src->comp.type = SOF_COMP_SRC; in sof_widget_load_src()
1964 src->config.hdr.size = sizeof(src->config); in sof_widget_load_src()
1967 ARRAY_SIZE(src_tokens), private->array, in sof_widget_load_src()
1968 le32_to_cpu(private->size)); in sof_widget_load_src()
1970 dev_err(scomp->dev, "error: parse src tokens failed %d\n", in sof_widget_load_src()
1971 private->size); in sof_widget_load_src()
1975 ret = sof_parse_tokens(scomp, &src->config, comp_tokens, in sof_widget_load_src()
1976 ARRAY_SIZE(comp_tokens), private->array, in sof_widget_load_src()
1977 le32_to_cpu(private->size)); in sof_widget_load_src()
1979 dev_err(scomp->dev, "error: parse src.cfg tokens failed %d\n", in sof_widget_load_src()
1980 le32_to_cpu(private->size)); in sof_widget_load_src()
1984 dev_dbg(scomp->dev, "src %s: source rate %d sink rate %d\n", in sof_widget_load_src()
1985 swidget->widget->name, src->source_rate, src->sink_rate); in sof_widget_load_src()
1986 sof_dbg_comp_config(scomp, &src->config); in sof_widget_load_src()
1988 swidget->private = src; in sof_widget_load_src()
1990 ret = sof_ipc_tx_message(sdev->ipc, src->comp.hdr.cmd, src, in sof_widget_load_src()
2000 * ASRC Topology
2009 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_asrc()
2010 struct sof_ipc_comp_asrc *asrc; in sof_widget_load_asrc() local
2011 size_t ipc_size = sizeof(*asrc); in sof_widget_load_asrc()
2014 asrc = (struct sof_ipc_comp_asrc *) in sof_widget_load_asrc()
2016 if (!asrc) in sof_widget_load_asrc()
2017 return -ENOMEM; in sof_widget_load_asrc()
2019 /* configure ASRC IPC message */ in sof_widget_load_asrc()
2020 asrc->comp.type = SOF_COMP_ASRC; in sof_widget_load_asrc()
2021 asrc->config.hdr.size = sizeof(asrc->config); in sof_widget_load_asrc()
2023 ret = sof_parse_tokens(scomp, asrc, asrc_tokens, in sof_widget_load_asrc()
2024 ARRAY_SIZE(asrc_tokens), private->array, in sof_widget_load_asrc()
2025 le32_to_cpu(private->size)); in sof_widget_load_asrc()
2027 dev_err(scomp->dev, "error: parse asrc tokens failed %d\n", in sof_widget_load_asrc()
2028 private->size); in sof_widget_load_asrc()
2032 ret = sof_parse_tokens(scomp, &asrc->config, comp_tokens, in sof_widget_load_asrc()
2033 ARRAY_SIZE(comp_tokens), private->array, in sof_widget_load_asrc()
2034 le32_to_cpu(private->size)); in sof_widget_load_asrc()
2036 dev_err(scomp->dev, "error: parse asrc.cfg tokens failed %d\n", in sof_widget_load_asrc()
2037 le32_to_cpu(private->size)); in sof_widget_load_asrc()
2041 dev_dbg(scomp->dev, "asrc %s: source rate %d sink rate %d " in sof_widget_load_asrc()
2043 swidget->widget->name, asrc->source_rate, asrc->sink_rate, in sof_widget_load_asrc()
2044 asrc->asynchronous_mode, asrc->operation_mode); in sof_widget_load_asrc()
2045 sof_dbg_comp_config(scomp, &asrc->config); in sof_widget_load_asrc()
2047 swidget->private = asrc; in sof_widget_load_asrc()
2049 ret = sof_ipc_tx_message(sdev->ipc, asrc->comp.hdr.cmd, asrc, in sof_widget_load_asrc()
2054 kfree(asrc); in sof_widget_load_asrc()
2068 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_siggen()
2076 return -ENOMEM; in sof_widget_load_siggen()
2079 tone->comp.type = SOF_COMP_TONE; in sof_widget_load_siggen()
2080 tone->config.hdr.size = sizeof(tone->config); in sof_widget_load_siggen()
2083 ARRAY_SIZE(tone_tokens), private->array, in sof_widget_load_siggen()
2084 le32_to_cpu(private->size)); in sof_widget_load_siggen()
2086 dev_err(scomp->dev, "error: parse tone tokens failed %d\n", in sof_widget_load_siggen()
2087 le32_to_cpu(private->size)); in sof_widget_load_siggen()
2091 ret = sof_parse_tokens(scomp, &tone->config, comp_tokens, in sof_widget_load_siggen()
2092 ARRAY_SIZE(comp_tokens), private->array, in sof_widget_load_siggen()
2093 le32_to_cpu(private->size)); in sof_widget_load_siggen()
2095 dev_err(scomp->dev, "error: parse tone.cfg tokens failed %d\n", in sof_widget_load_siggen()
2096 le32_to_cpu(private->size)); in sof_widget_load_siggen()
2100 dev_dbg(scomp->dev, "tone %s: frequency %d amplitude %d\n", in sof_widget_load_siggen()
2101 swidget->widget->name, tone->frequency, tone->amplitude); in sof_widget_load_siggen()
2102 sof_dbg_comp_config(scomp, &tone->config); in sof_widget_load_siggen()
2104 swidget->private = tone; in sof_widget_load_siggen()
2106 ret = sof_ipc_tx_message(sdev->ipc, tone->comp.hdr.cmd, tone, in sof_widget_load_siggen()
2128 for (i = 0; i < widget->num_kcontrols; i++) { in sof_get_control_data()
2129 kc = &widget->kcontrol_news[i]; in sof_get_control_data()
2131 switch (widget->dobj.widget.kcontrol_type) { in sof_get_control_data()
2133 sm = (struct soc_mixer_control *)kc->private_value; in sof_get_control_data()
2134 wdata[i].control = sm->dobj.private; in sof_get_control_data()
2137 sbe = (struct soc_bytes_ext *)kc->private_value; in sof_get_control_data()
2138 wdata[i].control = sbe->dobj.private; in sof_get_control_data()
2141 se = (struct soc_enum *)kc->private_value; in sof_get_control_data()
2142 wdata[i].control = se->dobj.private; in sof_get_control_data()
2145 dev_err(scomp->dev, "error: unknown kcontrol type %d in widget %s\n", in sof_get_control_data()
2146 widget->dobj.widget.kcontrol_type, in sof_get_control_data()
2147 widget->name); in sof_get_control_data()
2148 return -EINVAL; in sof_get_control_data()
2152 dev_err(scomp->dev, "error: no scontrol for widget %s\n", in sof_get_control_data()
2153 widget->name); in sof_get_control_data()
2154 return -EINVAL; in sof_get_control_data()
2157 wdata[i].pdata = wdata[i].control->control_data->data; in sof_get_control_data()
2159 return -EINVAL; in sof_get_control_data()
2161 /* make sure data is valid - data can be updated at runtime */ in sof_get_control_data()
2162 if (wdata[i].pdata->magic != SOF_ABI_MAGIC) in sof_get_control_data()
2163 return -EINVAL; in sof_get_control_data()
2165 *size += wdata[i].pdata->size; in sof_get_control_data()
2168 switch (wdata[i].control->cmd) { in sof_get_control_data()
2194 struct snd_soc_dapm_widget *widget = swidget->widget; in sof_process_load()
2195 struct snd_soc_tplg_private *private = &tw->priv; in sof_process_load()
2205 if (widget->num_kcontrols) { in sof_process_load()
2206 wdata = kcalloc(widget->num_kcontrols, in sof_process_load()
2211 return -ENOMEM; in sof_process_load()
2225 ipc_size -= ipc_data_size; in sof_process_load()
2232 ret = -ENOMEM; in sof_process_load()
2237 process->comp.type = type; in sof_process_load()
2238 process->config.hdr.size = sizeof(process->config); in sof_process_load()
2240 ret = sof_parse_tokens(scomp, &process->config, comp_tokens, in sof_process_load()
2241 ARRAY_SIZE(comp_tokens), private->array, in sof_process_load()
2242 le32_to_cpu(private->size)); in sof_process_load()
2244 dev_err(scomp->dev, "error: parse process.cfg tokens failed %d\n", in sof_process_load()
2245 le32_to_cpu(private->size)); in sof_process_load()
2249 sof_dbg_comp_config(scomp, &process->config); in sof_process_load()
2253 * get possible component controls - get size of all pdata, in sof_process_load()
2257 for (i = 0; i < widget->num_kcontrols; i++) { in sof_process_load()
2258 memcpy(&process->data + offset, in sof_process_load()
2259 wdata[i].pdata->data, in sof_process_load()
2260 wdata[i].pdata->size); in sof_process_load()
2261 offset += wdata[i].pdata->size; in sof_process_load()
2265 process->size = ipc_data_size; in sof_process_load()
2266 swidget->private = process; in sof_process_load()
2268 ret = sof_ipc_tx_message(sdev->ipc, process->comp.hdr.cmd, process, in sof_process_load()
2272 dev_err(scomp->dev, "error: create process failed\n"); in sof_process_load()
2281 for (i = 0; i < widget->num_kcontrols; i++) { in sof_process_load()
2282 wdata[i].control->readback_offset = 0; in sof_process_load()
2286 wdata[i].control->cmd, in sof_process_load()
2289 dev_err(scomp->dev, "error: send control failed\n"); in sof_process_load()
2303 * Processing Component Topology - can be "effect", "codec", or general
2312 struct snd_soc_tplg_private *private = &tw->priv; in sof_widget_load_process()
2316 /* check we have some tokens - we need at least process type */ in sof_widget_load_process()
2317 if (le32_to_cpu(private->size) == 0) { in sof_widget_load_process()
2318 dev_err(scomp->dev, "error: process tokens not found\n"); in sof_widget_load_process()
2319 return -EINVAL; in sof_widget_load_process()
2323 config.comp.core = swidget->core; in sof_widget_load_process()
2327 ARRAY_SIZE(process_tokens), private->array, in sof_widget_load_process()
2328 le32_to_cpu(private->size)); in sof_widget_load_process()
2330 dev_err(scomp->dev, "error: parse process tokens failed %d\n", in sof_widget_load_process()
2331 le32_to_cpu(private->size)); in sof_widget_load_process()
2339 dev_err(scomp->dev, "error: process loading failed\n"); in sof_widget_load_process()
2356 if (swidget->id != snd_soc_dapm_effect) in sof_widget_bind_event()
2359 ipc_comp = swidget->private; in sof_widget_bind_event()
2360 if (ipc_comp && ipc_comp->type != SOF_COMP_KEYWORD_DETECT) in sof_widget_bind_event()
2364 return snd_soc_tplg_widget_bind_event(swidget->widget, in sof_widget_bind_event()
2372 dev_err(scomp->dev, in sof_widget_bind_event()
2374 event_type, swidget->widget->name); in sof_widget_bind_event()
2375 return -EINVAL; in sof_widget_bind_event()
2378 /* external widget init - used for any driver specific init */
2395 return -ENOMEM; in sof_widget_ready()
2397 swidget->scomp = scomp; in sof_widget_ready()
2398 swidget->widget = w; in sof_widget_ready()
2399 swidget->comp_id = sdev->next_comp_id++; in sof_widget_ready()
2400 swidget->complete = 0; in sof_widget_ready()
2401 swidget->id = w->id; in sof_widget_ready()
2402 swidget->pipeline_id = index; in sof_widget_ready()
2403 swidget->private = NULL; in sof_widget_ready()
2406 dev_dbg(scomp->dev, "tplg: ready widget id %d pipe %d type %d name : %s stream %s\n", in sof_widget_ready()
2407 swidget->comp_id, index, swidget->id, tw->name, in sof_widget_ready()
2408 strnlen(tw->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0 in sof_widget_ready()
2409 ? tw->sname : "none"); in sof_widget_ready()
2412 ARRAY_SIZE(core_tokens), tw->priv.array, in sof_widget_ready()
2413 le32_to_cpu(tw->priv.size)); in sof_widget_ready()
2415 dev_err(scomp->dev, "error: parsing core tokens failed %d\n", in sof_widget_ready()
2421 swidget->core = comp.core; in sof_widget_ready()
2426 dev_err(scomp->dev, "error: enable core: %d\n", ret); in sof_widget_ready()
2431 ret = sof_parse_tokens(scomp, &swidget->comp_ext, comp_ext_tokens, in sof_widget_ready()
2432 ARRAY_SIZE(comp_ext_tokens), tw->priv.array, in sof_widget_ready()
2433 le32_to_cpu(tw->priv.size)); in sof_widget_ready()
2435 dev_err(scomp->dev, "error: parsing comp_ext_tokens failed %d\n", in sof_widget_ready()
2442 switch (w->id) { in sof_widget_ready()
2448 return -ENOMEM; in sof_widget_ready()
2454 list_add(&dai->list, &sdev->dai_list); in sof_widget_ready()
2455 swidget->private = dai; in sof_widget_ready()
2466 list_for_each_entry(scontrol, &sdev->kcontrol_list, list) { in sof_widget_ready()
2467 if (scontrol->comp_id == swidget->comp_id) { in sof_widget_ready()
2468 scontrol->readback_offset = reply.offset; in sof_widget_ready()
2507 dev_dbg(scomp->dev, "widget type %d name %s not handled\n", swidget->id, tw->name); in sof_widget_ready()
2513 dev_err(scomp->dev, in sof_widget_ready()
2515 tw->shift, swidget->id, tw->name, in sof_widget_ready()
2516 strnlen(tw->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0 in sof_widget_ready()
2517 ? tw->sname : "none", reply.rhdr.error); in sof_widget_ready()
2523 if (tw->event_type) { in sof_widget_ready()
2525 le16_to_cpu(tw->event_type)); in sof_widget_ready()
2527 dev_err(scomp->dev, "error: widget event binding failed\n"); in sof_widget_ready()
2528 kfree(swidget->private); in sof_widget_ready()
2534 w->dobj.private = swidget; in sof_widget_ready()
2535 list_add(&swidget->list, &sdev->widget_list); in sof_widget_ready()
2544 sroute = dobj->private; in sof_route_unload()
2549 kfree(sroute->private); in sof_route_unload()
2550 list_del(&sroute->list); in sof_route_unload()
2572 swidget = dobj->private; in sof_widget_unload()
2576 widget = swidget->widget; in sof_widget_unload()
2578 switch (swidget->id) { in sof_widget_unload()
2581 dai = swidget->private; in sof_widget_unload()
2585 kfree(dai->dai_config); in sof_widget_unload()
2586 list_del(&dai->list); in sof_widget_unload()
2592 pipeline = swidget->private; in sof_widget_unload()
2599 if (pipeline->core == SOF_DSP_PRIMARY_CORE) in sof_widget_unload()
2602 ret = snd_sof_dsp_core_power_down(sdev, 1 << pipeline->core); in sof_widget_unload()
2604 dev_err(scomp->dev, "error: powering down pipeline schedule core %d\n", in sof_widget_unload()
2605 pipeline->core); in sof_widget_unload()
2608 sdev->enabled_cores_mask &= ~(1 << pipeline->core); in sof_widget_unload()
2614 for (i = 0; i < widget->num_kcontrols; i++) { in sof_widget_unload()
2615 kc = &widget->kcontrol_news[i]; in sof_widget_unload()
2616 switch (dobj->widget.kcontrol_type) { in sof_widget_unload()
2618 sm = (struct soc_mixer_control *)kc->private_value; in sof_widget_unload()
2619 scontrol = sm->dobj.private; in sof_widget_unload()
2620 if (sm->max > 1) in sof_widget_unload()
2621 kfree(scontrol->volume_table); in sof_widget_unload()
2624 se = (struct soc_enum *)kc->private_value; in sof_widget_unload()
2625 scontrol = se->dobj.private; in sof_widget_unload()
2628 sbe = (struct soc_bytes_ext *)kc->private_value; in sof_widget_unload()
2629 scontrol = sbe->dobj.private; in sof_widget_unload()
2632 dev_warn(scomp->dev, "unsupported kcontrol_type\n"); in sof_widget_unload()
2635 kfree(scontrol->control_data); in sof_widget_unload()
2636 list_del(&scontrol->list); in sof_widget_unload()
2642 kfree(swidget->private); in sof_widget_unload()
2645 list_del(&swidget->list); in sof_widget_unload()
2655 /* FE DAI - used for any driver specific init */
2662 struct snd_soc_tplg_private *private = &pcm->priv; in sof_dai_load()
2673 return -ENOMEM; in sof_dai_load()
2675 spcm->scomp = scomp; in sof_dai_load()
2678 spcm->stream[stream].comp_id = COMP_ID_UNASSIGNED; in sof_dai_load()
2679 INIT_WORK(&spcm->stream[stream].period_elapsed_work, in sof_dai_load()
2683 spcm->pcm = *pcm; in sof_dai_load()
2684 dev_dbg(scomp->dev, "tplg: load pcm %s\n", pcm->dai_name); in sof_dai_load()
2686 dai_drv->dobj.private = spcm; in sof_dai_load()
2687 list_add(&spcm->list, &sdev->pcm_list); in sof_dai_load()
2690 ARRAY_SIZE(stream_tokens), private->array, in sof_dai_load()
2691 le32_to_cpu(private->size)); in sof_dai_load()
2693 dev_err(scomp->dev, "error: parse stream tokens failed %d\n", in sof_dai_load()
2694 le32_to_cpu(private->size)); in sof_dai_load()
2699 if (!spcm->pcm.playback) in sof_dai_load()
2704 dev_vdbg(scomp->dev, "tplg: pcm %s stream tokens: playback d0i3:%d\n", in sof_dai_load()
2705 spcm->pcm.pcm_name, spcm->stream[stream].d0i3_compatible); in sof_dai_load()
2707 caps = &spcm->pcm.caps[stream]; in sof_dai_load()
2710 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev, in sof_dai_load()
2711 PAGE_SIZE, &spcm->stream[stream].page_table); in sof_dai_load()
2713 dev_err(scomp->dev, "error: can't alloc page table for %s %d\n", in sof_dai_load()
2714 caps->name, ret); in sof_dai_load()
2722 dev_err(scomp->dev, in sof_dai_load()
2731 if (!spcm->pcm.capture) in sof_dai_load()
2734 dev_vdbg(scomp->dev, "tplg: pcm %s stream tokens: capture d0i3:%d\n", in sof_dai_load()
2735 spcm->pcm.pcm_name, spcm->stream[stream].d0i3_compatible); in sof_dai_load()
2737 caps = &spcm->pcm.caps[stream]; in sof_dai_load()
2740 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev, in sof_dai_load()
2741 PAGE_SIZE, &spcm->stream[stream].page_table); in sof_dai_load()
2743 dev_err(scomp->dev, "error: can't alloc page table for %s %d\n", in sof_dai_load()
2744 caps->name, ret); in sof_dai_load()
2751 dev_err(scomp->dev, in sof_dai_load()
2753 snd_dma_free_pages(&spcm->stream[stream].page_table); in sof_dai_load()
2760 if (spcm->pcm.playback) in sof_dai_load()
2761 snd_dma_free_pages(&spcm->stream[SNDRV_PCM_STREAM_PLAYBACK].page_table); in sof_dai_load()
2769 struct snd_sof_pcm *spcm = dobj->private; in sof_dai_unload()
2772 if (spcm->pcm.playback) in sof_dai_unload()
2773 snd_dma_free_pages(&spcm->stream[SNDRV_PCM_STREAM_PLAYBACK].page_table); in sof_dai_unload()
2775 if (spcm->pcm.capture) in sof_dai_unload()
2776 snd_dma_free_pages(&spcm->stream[SNDRV_PCM_STREAM_CAPTURE].page_table); in sof_dai_unload()
2779 list_del(&spcm->list); in sof_dai_unload()
2789 if (hw_config->bclk_master == SND_SOC_TPLG_BCLK_CM) { in sof_dai_set_format()
2791 if (hw_config->fsync_master == SND_SOC_TPLG_FSYNC_CM) in sof_dai_set_format()
2792 config->format |= SOF_DAI_FMT_CBM_CFM; in sof_dai_set_format()
2794 config->format |= SOF_DAI_FMT_CBM_CFS; in sof_dai_set_format()
2797 if (hw_config->fsync_master == SND_SOC_TPLG_FSYNC_CM) in sof_dai_set_format()
2798 config->format |= SOF_DAI_FMT_CBS_CFM; in sof_dai_set_format()
2800 config->format |= SOF_DAI_FMT_CBS_CFS; in sof_dai_set_format()
2804 if (hw_config->invert_bclk) { in sof_dai_set_format()
2805 if (hw_config->invert_fsync) in sof_dai_set_format()
2806 config->format |= SOF_DAI_FMT_IB_IF; in sof_dai_set_format()
2808 config->format |= SOF_DAI_FMT_IB_NF; in sof_dai_set_format()
2810 if (hw_config->invert_fsync) in sof_dai_set_format()
2811 config->format |= SOF_DAI_FMT_NB_IF; in sof_dai_set_format()
2813 config->format |= SOF_DAI_FMT_NB_NF; in sof_dai_set_format()
2829 list_for_each_entry(dai, &sdev->dai_list, list) { in sof_set_dai_config()
2830 if (!dai->name) in sof_set_dai_config()
2833 if (strcmp(link->name, dai->name) == 0) { in sof_set_dai_config()
2843 config->dai_index = dai->comp_dai.dai_index; in sof_set_dai_config()
2846 ret = sof_ipc_tx_message(sdev->ipc, in sof_set_dai_config()
2847 config->hdr.cmd, config, size, in sof_set_dai_config()
2851 dev_err(sdev->dev, "error: failed to set DAI config for %s index %d\n", in sof_set_dai_config()
2852 dai->name, config->dai_index); in sof_set_dai_config()
2855 dai->dai_config = kmemdup(config, size, GFP_KERNEL); in sof_set_dai_config()
2856 if (!dai->dai_config) in sof_set_dai_config()
2857 return -ENOMEM; in sof_set_dai_config()
2860 dai->cpu_dai_name = link->cpus->dai_name; in sof_set_dai_config()
2872 dev_warn(sdev->dev, "warning: failed to find dai for dai link %s", in sof_set_dai_config()
2873 link->name); in sof_set_dai_config()
2886 struct snd_soc_tplg_private *private = &cfg->priv; in sof_link_ssp_load()
2894 memset(&config->ssp, 0, sizeof(struct sof_ipc_dai_ssp_params)); in sof_link_ssp_load()
2895 config->hdr.size = size; in sof_link_ssp_load()
2897 ret = sof_parse_tokens(scomp, &config->ssp, ssp_tokens, in sof_link_ssp_load()
2898 ARRAY_SIZE(ssp_tokens), private->array, in sof_link_ssp_load()
2899 le32_to_cpu(private->size)); in sof_link_ssp_load()
2901 dev_err(scomp->dev, "error: parse ssp tokens failed %d\n", in sof_link_ssp_load()
2902 le32_to_cpu(private->size)); in sof_link_ssp_load()
2906 config->ssp.mclk_rate = le32_to_cpu(hw_config->mclk_rate); in sof_link_ssp_load()
2907 config->ssp.bclk_rate = le32_to_cpu(hw_config->bclk_rate); in sof_link_ssp_load()
2908 config->ssp.fsync_rate = le32_to_cpu(hw_config->fsync_rate); in sof_link_ssp_load()
2909 config->ssp.tdm_slots = le32_to_cpu(hw_config->tdm_slots); in sof_link_ssp_load()
2910 config->ssp.tdm_slot_width = le32_to_cpu(hw_config->tdm_slot_width); in sof_link_ssp_load()
2911 config->ssp.mclk_direction = hw_config->mclk_direction; in sof_link_ssp_load()
2912 config->ssp.rx_slots = le32_to_cpu(hw_config->rx_slots); in sof_link_ssp_load()
2913 config->ssp.tx_slots = le32_to_cpu(hw_config->tx_slots); in sof_link_ssp_load()
2915 …dev_dbg(scomp->dev, "tplg: config SSP%d fmt 0x%x mclk %d bclk %d fclk %d width (%d)%d slots %d mcl… in sof_link_ssp_load()
2916 config->dai_index, config->format, in sof_link_ssp_load()
2917 config->ssp.mclk_rate, config->ssp.bclk_rate, in sof_link_ssp_load()
2918 config->ssp.fsync_rate, config->ssp.sample_valid_bits, in sof_link_ssp_load()
2919 config->ssp.tdm_slot_width, config->ssp.tdm_slots, in sof_link_ssp_load()
2920 config->ssp.mclk_id, config->ssp.quirks); in sof_link_ssp_load()
2923 if (config->ssp.fsync_rate < 8000 || config->ssp.fsync_rate > 192000) { in sof_link_ssp_load()
2924 dev_err(scomp->dev, "error: invalid fsync rate for SSP%d\n", in sof_link_ssp_load()
2925 config->dai_index); in sof_link_ssp_load()
2926 return -EINVAL; in sof_link_ssp_load()
2929 if (config->ssp.tdm_slots < 1 || config->ssp.tdm_slots > 8) { in sof_link_ssp_load()
2930 dev_err(scomp->dev, "error: invalid channel count for SSP%d\n", in sof_link_ssp_load()
2931 config->dai_index); in sof_link_ssp_load()
2932 return -EINVAL; in sof_link_ssp_load()
2938 dev_err(scomp->dev, "error: failed to save DAI config for SSP%d\n", in sof_link_ssp_load()
2939 config->dai_index); in sof_link_ssp_load()
2951 struct snd_soc_tplg_private *private = &cfg->priv; in sof_link_sai_load()
2959 memset(&config->sai, 0, sizeof(struct sof_ipc_dai_sai_params)); in sof_link_sai_load()
2960 config->hdr.size = size; in sof_link_sai_load()
2962 ret = sof_parse_tokens(scomp, &config->sai, sai_tokens, in sof_link_sai_load()
2963 ARRAY_SIZE(sai_tokens), private->array, in sof_link_sai_load()
2964 le32_to_cpu(private->size)); in sof_link_sai_load()
2966 dev_err(scomp->dev, "error: parse sai tokens failed %d\n", in sof_link_sai_load()
2967 le32_to_cpu(private->size)); in sof_link_sai_load()
2971 config->sai.mclk_rate = le32_to_cpu(hw_config->mclk_rate); in sof_link_sai_load()
2972 config->sai.bclk_rate = le32_to_cpu(hw_config->bclk_rate); in sof_link_sai_load()
2973 config->sai.fsync_rate = le32_to_cpu(hw_config->fsync_rate); in sof_link_sai_load()
2974 config->sai.mclk_direction = hw_config->mclk_direction; in sof_link_sai_load()
2976 config->sai.tdm_slots = le32_to_cpu(hw_config->tdm_slots); in sof_link_sai_load()
2977 config->sai.tdm_slot_width = le32_to_cpu(hw_config->tdm_slot_width); in sof_link_sai_load()
2978 config->sai.rx_slots = le32_to_cpu(hw_config->rx_slots); in sof_link_sai_load()
2979 config->sai.tx_slots = le32_to_cpu(hw_config->tx_slots); in sof_link_sai_load()
2981 dev_info(scomp->dev, in sof_link_sai_load()
2983 config->dai_index, config->format, in sof_link_sai_load()
2984 config->sai.mclk_rate, config->sai.tdm_slot_width, in sof_link_sai_load()
2985 config->sai.tdm_slots, config->sai.mclk_id); in sof_link_sai_load()
2987 if (config->sai.tdm_slots < 1 || config->sai.tdm_slots > 8) { in sof_link_sai_load()
2988 dev_err(scomp->dev, "error: invalid channel count for SAI%d\n", in sof_link_sai_load()
2989 config->dai_index); in sof_link_sai_load()
2990 return -EINVAL; in sof_link_sai_load()
2996 dev_err(scomp->dev, "error: failed to save DAI config for SAI%d\n", in sof_link_sai_load()
2997 config->dai_index); in sof_link_sai_load()
3009 struct snd_soc_tplg_private *private = &cfg->priv; in sof_link_esai_load()
3017 memset(&config->esai, 0, sizeof(struct sof_ipc_dai_esai_params)); in sof_link_esai_load()
3018 config->hdr.size = size; in sof_link_esai_load()
3020 ret = sof_parse_tokens(scomp, &config->esai, esai_tokens, in sof_link_esai_load()
3021 ARRAY_SIZE(esai_tokens), private->array, in sof_link_esai_load()
3022 le32_to_cpu(private->size)); in sof_link_esai_load()
3024 dev_err(scomp->dev, "error: parse esai tokens failed %d\n", in sof_link_esai_load()
3025 le32_to_cpu(private->size)); in sof_link_esai_load()
3029 config->esai.mclk_rate = le32_to_cpu(hw_config->mclk_rate); in sof_link_esai_load()
3030 config->esai.bclk_rate = le32_to_cpu(hw_config->bclk_rate); in sof_link_esai_load()
3031 config->esai.fsync_rate = le32_to_cpu(hw_config->fsync_rate); in sof_link_esai_load()
3032 config->esai.mclk_direction = hw_config->mclk_direction; in sof_link_esai_load()
3033 config->esai.tdm_slots = le32_to_cpu(hw_config->tdm_slots); in sof_link_esai_load()
3034 config->esai.tdm_slot_width = le32_to_cpu(hw_config->tdm_slot_width); in sof_link_esai_load()
3035 config->esai.rx_slots = le32_to_cpu(hw_config->rx_slots); in sof_link_esai_load()
3036 config->esai.tx_slots = le32_to_cpu(hw_config->tx_slots); in sof_link_esai_load()
3038 dev_info(scomp->dev, in sof_link_esai_load()
3040 config->dai_index, config->format, in sof_link_esai_load()
3041 config->esai.mclk_rate, config->esai.tdm_slot_width, in sof_link_esai_load()
3042 config->esai.tdm_slots, config->esai.mclk_id); in sof_link_esai_load()
3044 if (config->esai.tdm_slots < 1 || config->esai.tdm_slots > 8) { in sof_link_esai_load()
3045 dev_err(scomp->dev, "error: invalid channel count for ESAI%d\n", in sof_link_esai_load()
3046 config->dai_index); in sof_link_esai_load()
3047 return -EINVAL; in sof_link_esai_load()
3053 dev_err(scomp->dev, "error: failed to save DAI config for ESAI%d\n", in sof_link_esai_load()
3054 config->dai_index); in sof_link_esai_load()
3066 struct snd_soc_tplg_private *private = &cfg->priv; in sof_link_dmic_load()
3067 struct sof_ipc_fw_ready *ready = &sdev->fw_ready; in sof_link_dmic_load()
3068 struct sof_ipc_fw_version *v = &ready->version; in sof_link_dmic_load()
3073 memset(&config->dmic, 0, sizeof(struct sof_ipc_dai_dmic_params)); in sof_link_dmic_load()
3076 ret = sof_parse_tokens(scomp, &config->dmic, dmic_tokens, in sof_link_dmic_load()
3077 ARRAY_SIZE(dmic_tokens), private->array, in sof_link_dmic_load()
3078 le32_to_cpu(private->size)); in sof_link_dmic_load()
3080 dev_err(scomp->dev, "error: parse dmic tokens failed %d\n", in sof_link_dmic_load()
3081 le32_to_cpu(private->size)); in sof_link_dmic_load()
3086 ret = sof_parse_token_sets(scomp, &config->dmic.pdm[0], dmic_pdm_tokens, in sof_link_dmic_load()
3087 ARRAY_SIZE(dmic_pdm_tokens), private->array, in sof_link_dmic_load()
3088 le32_to_cpu(private->size), in sof_link_dmic_load()
3089 config->dmic.num_pdm_active, in sof_link_dmic_load()
3093 dev_err(scomp->dev, "error: parse dmic pdm tokens failed %d\n", in sof_link_dmic_load()
3094 le32_to_cpu(private->size)); in sof_link_dmic_load()
3099 config->hdr.size = size; in sof_link_dmic_load()
3102 dev_dbg(scomp->dev, "tplg: config DMIC%d driver version %d\n", in sof_link_dmic_load()
3103 config->dai_index, config->dmic.driver_ipc_version); in sof_link_dmic_load()
3104 dev_dbg(scomp->dev, "pdmclk_min %d pdm_clkmax %d duty_min %hd\n", in sof_link_dmic_load()
3105 config->dmic.pdmclk_min, config->dmic.pdmclk_max, in sof_link_dmic_load()
3106 config->dmic.duty_min); in sof_link_dmic_load()
3107 dev_dbg(scomp->dev, "duty_max %hd fifo_fs %d num_pdms active %d\n", in sof_link_dmic_load()
3108 config->dmic.duty_max, config->dmic.fifo_fs, in sof_link_dmic_load()
3109 config->dmic.num_pdm_active); in sof_link_dmic_load()
3110 dev_dbg(scomp->dev, "fifo word length %hd\n", config->dmic.fifo_bits); in sof_link_dmic_load()
3112 for (j = 0; j < config->dmic.num_pdm_active; j++) { in sof_link_dmic_load()
3113 dev_dbg(scomp->dev, "pdm %hd mic a %hd mic b %hd\n", in sof_link_dmic_load()
3114 config->dmic.pdm[j].id, in sof_link_dmic_load()
3115 config->dmic.pdm[j].enable_mic_a, in sof_link_dmic_load()
3116 config->dmic.pdm[j].enable_mic_b); in sof_link_dmic_load()
3117 dev_dbg(scomp->dev, "pdm %hd polarity a %hd polarity b %hd\n", in sof_link_dmic_load()
3118 config->dmic.pdm[j].id, in sof_link_dmic_load()
3119 config->dmic.pdm[j].polarity_mic_a, in sof_link_dmic_load()
3120 config->dmic.pdm[j].polarity_mic_b); in sof_link_dmic_load()
3121 dev_dbg(scomp->dev, "pdm %hd clk_edge %hd skew %hd\n", in sof_link_dmic_load()
3122 config->dmic.pdm[j].id, in sof_link_dmic_load()
3123 config->dmic.pdm[j].clk_edge, in sof_link_dmic_load()
3124 config->dmic.pdm[j].skew); in sof_link_dmic_load()
3131 if (SOF_ABI_VER(v->major, v->minor, v->micro) < SOF_ABI_VER(3, 0, 1)) in sof_link_dmic_load()
3132 config->dmic.fifo_bits_b = config->dmic.fifo_bits; in sof_link_dmic_load()
3137 dev_err(scomp->dev, "error: failed to save DAI config for DMIC%d\n", in sof_link_dmic_load()
3138 config->dai_index); in sof_link_dmic_load()
3150 struct snd_soc_tplg_private *private = &cfg->priv; in sof_link_hda_load()
3156 memset(&config->hda, 0, sizeof(struct sof_ipc_dai_hda_params)); in sof_link_hda_load()
3157 config->hdr.size = size; in sof_link_hda_load()
3160 ret = sof_parse_tokens(scomp, &config->hda, hda_tokens, in sof_link_hda_load()
3161 ARRAY_SIZE(hda_tokens), private->array, in sof_link_hda_load()
3162 le32_to_cpu(private->size)); in sof_link_hda_load()
3164 dev_err(scomp->dev, "error: parse hda tokens failed %d\n", in sof_link_hda_load()
3165 le32_to_cpu(private->size)); in sof_link_hda_load()
3169 dev_dbg(scomp->dev, "HDA config rate %d channels %d\n", in sof_link_hda_load()
3170 config->hda.rate, config->hda.channels); in sof_link_hda_load()
3172 dai = snd_soc_find_dai(link->cpus); in sof_link_hda_load()
3174 dev_err(scomp->dev, "error: failed to find dai %s in %s", in sof_link_hda_load()
3175 link->cpus->dai_name, __func__); in sof_link_hda_load()
3176 return -EINVAL; in sof_link_hda_load()
3179 config->hda.link_dma_ch = DMA_CHAN_INVALID; in sof_link_hda_load()
3183 dev_err(scomp->dev, "error: failed to process hda dai link %s", in sof_link_hda_load()
3184 link->name); in sof_link_hda_load()
3196 struct snd_soc_tplg_private *private = &cfg->priv; in sof_link_alh_load()
3200 ret = sof_parse_tokens(scomp, &config->alh, alh_tokens, in sof_link_alh_load()
3201 ARRAY_SIZE(alh_tokens), private->array, in sof_link_alh_load()
3202 le32_to_cpu(private->size)); in sof_link_alh_load()
3204 dev_err(scomp->dev, "error: parse alh tokens failed %d\n", in sof_link_alh_load()
3205 le32_to_cpu(private->size)); in sof_link_alh_load()
3210 config->hdr.size = size; in sof_link_alh_load()
3215 dev_err(scomp->dev, "error: failed to save DAI config for ALH %d\n", in sof_link_alh_load()
3216 config->dai_index); in sof_link_alh_load()
3221 /* DAI link - used for any driver specific init */
3226 struct snd_soc_tplg_private *private = &cfg->priv; in sof_link_load()
3233 if (!link->platforms) { in sof_link_load()
3234 dev_err(scomp->dev, "error: no platforms\n"); in sof_link_load()
3235 return -EINVAL; in sof_link_load()
3237 link->platforms->name = dev_name(scomp->dev); in sof_link_load()
3243 if (!link->no_pcm) { in sof_link_load()
3244 link->nonatomic = true; in sof_link_load()
3253 link->trigger[SNDRV_PCM_STREAM_PLAYBACK] = in sof_link_load()
3255 link->trigger[SNDRV_PCM_STREAM_CAPTURE] = in sof_link_load()
3262 /* check we have some tokens - we need at least DAI type */ in sof_link_load()
3263 if (le32_to_cpu(private->size) == 0) { in sof_link_load()
3264 dev_err(scomp->dev, "error: expected tokens for DAI, none found\n"); in sof_link_load()
3265 return -EINVAL; in sof_link_load()
3273 ARRAY_SIZE(dai_link_tokens), private->array, in sof_link_load()
3274 le32_to_cpu(private->size)); in sof_link_load()
3276 dev_err(scomp->dev, "error: parse link tokens failed %d\n", in sof_link_load()
3277 le32_to_cpu(private->size)); in sof_link_load()
3285 num_hw_configs = le32_to_cpu(cfg->num_hw_configs); in sof_link_load()
3288 dev_err(scomp->dev, "error: unexpected DAI config count %d!\n", in sof_link_load()
3289 le32_to_cpu(cfg->num_hw_configs)); in sof_link_load()
3290 return -EINVAL; in sof_link_load()
3293 dev_dbg(scomp->dev, "tplg: %d hw_configs found, default id: %d!\n", in sof_link_load()
3294 cfg->num_hw_configs, le32_to_cpu(cfg->default_hw_config_id)); in sof_link_load()
3297 if (cfg->hw_config[i].id == cfg->default_hw_config_id) in sof_link_load()
3302 dev_err(scomp->dev, "error: default hw_config id: %d not found!\n", in sof_link_load()
3303 le32_to_cpu(cfg->default_hw_config_id)); in sof_link_load()
3304 return -EINVAL; in sof_link_load()
3309 hw_config = &cfg->hw_config[i]; in sof_link_load()
3312 config.format = le32_to_cpu(hw_config->fmt); in sof_link_load()
3314 /* now load DAI specific data and send IPC - type comes from token */ in sof_link_load()
3341 dev_err(scomp->dev, "error: invalid DAI type %d\n", in sof_link_load()
3343 ret = -EINVAL; in sof_link_load()
3357 dai = snd_soc_find_dai(link->cpus); in sof_link_hda_unload()
3359 dev_err(sdev->dev, "error: failed to find dai %s in %s", in sof_link_hda_unload()
3360 link->cpus->dai_name, __func__); in sof_link_hda_unload()
3361 return -EINVAL; in sof_link_hda_unload()
3378 if (!link->no_pcm) in sof_link_unload()
3381 list_for_each_entry(sof_dai, &sdev->dai_list, list) { in sof_link_unload()
3382 if (!sof_dai->name) in sof_link_unload()
3385 if (strcmp(link->name, sof_dai->name) == 0) in sof_link_unload()
3389 dev_err(scomp->dev, "error: failed to find dai %s in %s", in sof_link_unload()
3390 link->name, __func__); in sof_link_unload()
3391 return -EINVAL; in sof_link_unload()
3394 switch (sof_dai->dai_config->type) { in sof_link_unload()
3406 dev_err(scomp->dev, "error: invalid DAI type %d\n", in sof_link_unload()
3407 sof_dai->dai_config->type); in sof_link_unload()
3408 ret = -EINVAL; in sof_link_unload()
3415 /* DAI link - used for any driver specific init */
3422 struct snd_soc_dobj *dobj = &route->dobj; in sof_route_load()
3430 return -ENOMEM; in sof_route_load()
3432 sroute->scomp = scomp; in sof_route_load()
3437 return -ENOMEM; in sof_route_load()
3440 connect->hdr.size = sizeof(*connect); in sof_route_load()
3441 connect->hdr.cmd = SOF_IPC_GLB_TPLG_MSG | SOF_IPC_TPLG_COMP_CONNECT; in sof_route_load()
3443 dev_dbg(scomp->dev, "sink %s control %s source %s\n", in sof_route_load()
3444 route->sink, route->control ? route->control : "none", in sof_route_load()
3445 route->source); in sof_route_load()
3448 source_swidget = snd_sof_find_swidget(scomp, (char *)route->source); in sof_route_load()
3450 dev_err(scomp->dev, "error: source %s not found\n", in sof_route_load()
3451 route->source); in sof_route_load()
3452 ret = -EINVAL; in sof_route_load()
3462 if (source_swidget->id == snd_soc_dapm_out_drv || in sof_route_load()
3463 source_swidget->id == snd_soc_dapm_output) in sof_route_load()
3466 connect->source_id = source_swidget->comp_id; in sof_route_load()
3469 sink_swidget = snd_sof_find_swidget(scomp, (char *)route->sink); in sof_route_load()
3471 dev_err(scomp->dev, "error: sink %s not found\n", in sof_route_load()
3472 route->sink); in sof_route_load()
3473 ret = -EINVAL; in sof_route_load()
3481 if (sink_swidget->id == snd_soc_dapm_out_drv || in sof_route_load()
3482 sink_swidget->id == snd_soc_dapm_output) in sof_route_load()
3485 connect->sink_id = sink_swidget->comp_id; in sof_route_load()
3493 if (source_swidget->id != snd_soc_dapm_buffer && in sof_route_load()
3494 sink_swidget->id != snd_soc_dapm_buffer) { in sof_route_load()
3495 …dev_dbg(scomp->dev, "warning: neither Linked source component %s nor sink component %s is of buffe… in sof_route_load()
3496 route->source, route->sink); in sof_route_load()
3499 ret = sof_ipc_tx_message(sdev->ipc, in sof_route_load()
3500 connect->hdr.cmd, in sof_route_load()
3506 dev_err(scomp->dev, "error: failed to add route sink %s control %s source %s\n", in sof_route_load()
3507 route->sink, in sof_route_load()
3508 route->control ? route->control : "none", in sof_route_load()
3509 route->source); in sof_route_load()
3515 dev_err(scomp->dev, "error: DSP failed to add route sink %s control %s source %s result %d\n", in sof_route_load()
3516 route->sink, in sof_route_load()
3517 route->control ? route->control : "none", in sof_route_load()
3518 route->source, reply.error); in sof_route_load()
3523 sroute->route = route; in sof_route_load()
3524 dobj->private = sroute; in sof_route_load()
3525 sroute->private = connect; in sof_route_load()
3528 list_add(&sroute->list, &sdev->route_list); in sof_route_load()
3540 * The value will be stored in scontrol->control_data
3549 list_for_each_entry(scontrol, &sdev->kcontrol_list, list) { in snd_sof_cache_kcontrol_val()
3552 switch (scontrol->cmd) { in snd_sof_cache_kcontrol_val()
3564 dev_err(scomp->dev, in snd_sof_cache_kcontrol_val()
3565 "error: Invalid scontrol->cmd: %d\n", in snd_sof_cache_kcontrol_val()
3566 scontrol->cmd); in snd_sof_cache_kcontrol_val()
3567 return -EINVAL; in snd_sof_cache_kcontrol_val()
3571 scontrol->cmd, in snd_sof_cache_kcontrol_val()
3574 dev_warn(scomp->dev, in snd_sof_cache_kcontrol_val()
3576 scontrol->comp_id); in snd_sof_cache_kcontrol_val()
3592 swidget->widget->name, swidget->comp_id); in snd_sof_complete_pipeline()
3597 ready.comp_id = swidget->comp_id; in snd_sof_complete_pipeline()
3599 ret = sof_ipc_tx_message(sdev->ipc, in snd_sof_complete_pipeline()
3607 /* completion - called at completion of firmware loading */
3614 list_for_each_entry(swidget, &sdev->widget_list, list) { in sof_complete()
3615 if (swidget->complete) in sof_complete()
3618 switch (swidget->id) { in sof_complete()
3620 swidget->complete = in sof_complete()
3621 snd_sof_complete_pipeline(scomp->dev, swidget); in sof_complete()
3629 * IPC. It may be overwritten by alsa-mixer after booting up in sof_complete()
3634 /* manifest - optional to inform component of manifest */
3641 size = le32_to_cpu(man->priv.size); in sof_manifest()
3645 dev_dbg(scomp->dev, "No topology ABI info\n"); in sof_manifest()
3650 dev_err(scomp->dev, "error: invalid topology ABI size\n"); in sof_manifest()
3651 return -EINVAL; in sof_manifest()
3654 dev_info(scomp->dev, in sof_manifest()
3656 man->priv.data[0], man->priv.data[1], in sof_manifest()
3657 man->priv.data[2], SOF_ABI_MAJOR, SOF_ABI_MINOR, in sof_manifest()
3660 abi_version = SOF_ABI_VER(man->priv.data[0], in sof_manifest()
3661 man->priv.data[1], in sof_manifest()
3662 man->priv.data[2]); in sof_manifest()
3665 dev_err(scomp->dev, "error: incompatible topology ABI version\n"); in sof_manifest()
3666 return -EINVAL; in sof_manifest()
3671 dev_warn(scomp->dev, "warn: topology ABI is more recent than kernel\n"); in sof_manifest()
3673 dev_err(scomp->dev, "error: topology ABI is more recent than kernel\n"); in sof_manifest()
3674 return -EINVAL; in sof_manifest()
3696 /* external kcontrol init - used for any driver specific init */
3700 /* external kcontrol init - used for any driver specific init */
3704 /* external widget init - used for any driver specific init */
3709 /* FE DAI - used for any driver specific init */
3713 /* DAI link - used for any driver specific init */
3717 /* completion - called at completion of firmware loading */
3720 /* manifest - optional to inform component of manifest */
3737 dev_dbg(scomp->dev, "loading topology:%s\n", file); in snd_sof_load_topology()
3739 ret = request_firmware(&fw, file, scomp->dev); in snd_sof_load_topology()
3741 dev_err(scomp->dev, "error: tplg request firmware %s failed err: %d\n", in snd_sof_load_topology()
3750 dev_err(scomp->dev, "error: tplg component load failed %d\n", in snd_sof_load_topology()
3752 ret = -EINVAL; in snd_sof_load_topology()