Lines Matching defs:swidget
184 sof_ipc4_get_input_pin_audio_fmt(struct snd_sof_widget *swidget, int pin_index)
190 if (swidget->id != snd_soc_dapm_effect) {
191 struct sof_ipc4_base_module_cfg *base = swidget->private;
197 process = swidget->private;
215 * sof_ipc4_get_audio_fmt - get available audio formats from swidget->tuples
217 * @swidget: pointer to struct snd_sof_widget containing tuples
224 struct snd_sof_widget *swidget,
233 SOF_AUDIO_FMT_NUM_TOKENS, swidget->tuples,
234 swidget->num_tuples, sizeof(*available_fmt), 1);
250 ret = sof_update_ipc_object(scomp, module_base_cfg, SOF_COMP_TOKENS, swidget->tuples,
251 swidget->num_tuples, sizeof(*module_base_cfg), 1);
254 swidget->widget->name, ret);
258 dev_dbg(scomp->dev, "widget %s: is_pages: %d\n", swidget->widget->name,
269 SOF_IN_AUDIO_FORMAT_TOKENS, swidget->tuples,
270 swidget->num_tuples, sizeof(*in_format),
277 dev_dbg(scomp->dev, "Input audio formats for %s\n", swidget->widget->name);
291 SOF_OUT_AUDIO_FORMAT_TOKENS, swidget->tuples,
292 swidget->num_tuples, sizeof(*out_format),
300 dev_dbg(scomp->dev, "Output audio formats for %s\n", swidget->widget->name);
325 static void sof_ipc4_widget_free_comp_pipeline(struct snd_sof_widget *swidget)
327 kfree(swidget->private);
330 static int sof_ipc4_widget_set_module_info(struct snd_sof_widget *swidget)
332 struct snd_soc_component *scomp = swidget->scomp;
335 swidget->module_info = sof_ipc4_find_module_by_uuid(sdev, &swidget->uuid);
337 if (swidget->module_info)
341 swidget->widget->name, &swidget->uuid);
345 static int sof_ipc4_widget_setup_msg(struct snd_sof_widget *swidget, struct sof_ipc4_msg *msg)
351 ret = sof_ipc4_widget_set_module_info(swidget);
355 fw_module = swidget->module_info;
362 msg->extension = SOF_IPC4_MOD_EXT_CORE_ID(swidget->core);
370 static void sof_ipc4_widget_update_kcontrol_module_id(struct snd_sof_widget *swidget)
372 struct snd_soc_component *scomp = swidget->scomp;
374 struct sof_ipc4_fw_module *fw_module = swidget->module_info;
379 if (scontrol->comp_id == swidget->comp_id) {
388 static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget)
391 struct snd_soc_component *scomp = swidget->scomp;
400 swidget->private = ipc4_copier;
403 dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name);
405 ret = sof_ipc4_get_audio_fmt(scomp, swidget, available_fmt,
414 if (!WIDGET_IS_AIF(swidget->id))
418 SOF_COPIER_TOKENS, swidget->tuples,
419 swidget->num_tuples, sizeof(node_type), 1);
426 dev_dbg(scomp->dev, "host copier '%s' node_type %u\n", swidget->widget->name, node_type);
439 switch (swidget->id) {
449 dev_err(scomp->dev, "invalid widget type %d\n", swidget->id);
455 ret = sof_ipc4_widget_setup_msg(swidget, &ipc4_copier->msg);
467 swidget->private = NULL;
471 static void sof_ipc4_widget_free_comp_pcm(struct snd_sof_widget *swidget)
473 struct sof_ipc4_copier *ipc4_copier = swidget->private;
483 swidget->private = NULL;
486 static int sof_ipc4_widget_setup_comp_dai(struct snd_sof_widget *swidget)
489 struct snd_soc_component *scomp = swidget->scomp;
490 struct snd_sof_dai *dai = swidget->private;
503 dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name);
505 ret = sof_ipc4_get_audio_fmt(scomp, swidget, available_fmt,
511 SOF_COPIER_TOKENS, swidget->tuples,
512 swidget->num_tuples, sizeof(node_type), 1);
519 SOF_DAI_TOKENS, swidget->tuples,
520 swidget->num_tuples, sizeof(u32), 1);
526 dev_dbg(scomp->dev, "dai %s node_type %u dai_type %u dai_index %d\n", swidget->widget->name,
531 pipe_widget = swidget->spipe->pipe_widget;
550 snd_soc_dapm_widget_for_each_source_path(swidget->widget, p)
553 if (swidget->id == snd_soc_dapm_dai_in && src_num == 0) {
572 strcmp(w->widget->sname, swidget->widget->sname))
609 ret = sof_ipc4_widget_setup_msg(swidget, &ipc4_copier->msg);
626 static void sof_ipc4_widget_free_comp_dai(struct snd_sof_widget *swidget)
629 struct snd_sof_dai *dai = swidget->private;
637 swidget->private = NULL;
650 swidget->private = NULL;
653 static int sof_ipc4_widget_setup_comp_pipeline(struct snd_sof_widget *swidget)
655 struct snd_soc_component *scomp = swidget->scomp;
657 struct snd_sof_pipeline *spipe = swidget->spipe;
664 ret = sof_update_ipc_object(scomp, pipeline, SOF_SCHED_TOKENS, swidget->tuples,
665 swidget->num_tuples, sizeof(*pipeline), 1);
671 swidget->core = pipeline->core_id;
675 dev_dbg(scomp->dev, "Set up chain DMA for %s\n", swidget->widget->name);
676 swidget->private = pipeline;
681 ret = sof_update_ipc_object(scomp, swidget, SOF_PIPELINE_TOKENS, swidget->tuples,
682 swidget->num_tuples, sizeof(*swidget), 1);
692 swidget->widget->name, swidget->pipeline_id,
695 swidget->private = pipeline;
712 static int sof_ipc4_widget_setup_comp_pga(struct snd_sof_widget *swidget)
714 struct snd_soc_component *scomp = swidget->scomp;
722 swidget->private = gain;
727 ret = sof_ipc4_get_audio_fmt(scomp, swidget, &gain->available_fmt, &gain->data.base_config);
732 swidget->tuples, swidget->num_tuples, sizeof(gain->data), 1);
740 swidget->widget->name, gain->data.params.curve_type,
743 ret = sof_ipc4_widget_setup_msg(swidget, &gain->msg);
747 sof_ipc4_widget_update_kcontrol_module_id(swidget);
753 swidget->private = NULL;
757 static void sof_ipc4_widget_free_comp_pga(struct snd_sof_widget *swidget)
759 struct sof_ipc4_gain *gain = swidget->private;
765 kfree(swidget->private);
766 swidget->private = NULL;
769 static int sof_ipc4_widget_setup_comp_mixer(struct snd_sof_widget *swidget)
771 struct snd_soc_component *scomp = swidget->scomp;
775 dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name);
781 swidget->private = mixer;
783 ret = sof_ipc4_get_audio_fmt(scomp, swidget, &mixer->available_fmt,
788 ret = sof_ipc4_widget_setup_msg(swidget, &mixer->msg);
796 swidget->private = NULL;
800 static int sof_ipc4_widget_setup_comp_src(struct snd_sof_widget *swidget)
802 struct snd_soc_component *scomp = swidget->scomp;
803 struct snd_sof_pipeline *spipe = swidget->spipe;
807 dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name);
813 swidget->private = src;
815 ret = sof_ipc4_get_audio_fmt(scomp, swidget, &src->available_fmt,
820 ret = sof_update_ipc_object(scomp, &src->data, SOF_SRC_TOKENS, swidget->tuples,
821 swidget->num_tuples, sizeof(*src), 1);
827 spipe->core_mask |= BIT(swidget->core);
831 ret = sof_ipc4_widget_setup_msg(swidget, &src->msg);
839 swidget->private = NULL;
843 static void sof_ipc4_widget_free_comp_src(struct snd_sof_widget *swidget)
845 struct sof_ipc4_src *src = swidget->private;
851 kfree(swidget->private);
852 swidget->private = NULL;
855 static void sof_ipc4_widget_free_comp_mixer(struct snd_sof_widget *swidget)
857 struct sof_ipc4_mixer *mixer = swidget->private;
863 kfree(swidget->private);
864 swidget->private = NULL;
870 static int sof_ipc4_widget_setup_comp_process(struct snd_sof_widget *swidget)
872 struct snd_soc_component *scomp = swidget->scomp;
874 struct snd_sof_pipeline *spipe = swidget->spipe;
883 swidget->private = process;
885 ret = sof_ipc4_get_audio_fmt(scomp, swidget, &process->available_fmt,
890 ret = sof_ipc4_widget_setup_msg(swidget, &process->msg);
895 fw_module = swidget->module_info;
905 size_add(swidget->num_input_pins,
906 swidget->num_output_pins));
914 base_cfg_ext->num_input_pin_fmts = swidget->num_input_pins;
915 base_cfg_ext->num_output_pin_fmts = swidget->num_output_pins;
929 sof_ipc4_widget_update_kcontrol_module_id(swidget);
932 spipe->core_mask |= BIT(swidget->core);
942 swidget->private = NULL;
946 static void sof_ipc4_widget_free_comp_process(struct snd_sof_widget *swidget)
948 struct sof_ipc4_process *process = swidget->private;
956 kfree(swidget->private);
957 swidget->private = NULL;
961 sof_ipc4_update_resource_usage(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget,
964 struct sof_ipc4_fw_module *fw_module = swidget->module_info;
990 pipe_widget = swidget->spipe->pipe_widget;
999 swidget->widget->name, base_config->ibs, base_config->obs,
1004 swidget->widget->name, base_config->ibs, base_config->obs,
1010 struct snd_sof_widget *swidget)
1012 struct sof_ipc4_fw_module *fw_module = swidget->module_info;
1015 swidget->instance_id = ida_alloc_max(&fw_module->m_ida, max_instances, GFP_KERNEL);
1016 if (swidget->instance_id < 0) {
1018 swidget->widget->name);
1019 return swidget->instance_id;
1155 struct snd_sof_widget *swidget,
1170 dev_err(sdev->dev, "no input formats for %s\n", swidget->widget->name);
1219 dev_dbg(sdev->dev, "Init input audio formats for %s\n", swidget->widget->name);
1226 static void sof_ipc4_unprepare_copier_module(struct snd_sof_widget *swidget)
1233 pipe_widget = swidget->spipe->pipe_widget;
1237 if (WIDGET_IS_AIF(swidget->id) || swidget->id == snd_soc_dapm_buffer) {
1242 ipc4_copier = swidget->private;
1243 } else if (WIDGET_IS_DAI(swidget->id)) {
1244 struct snd_sof_dai *dai = swidget->private;
1409 sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
1415 struct snd_soc_component *scomp = swidget->scomp;
1432 dev_dbg(sdev->dev, "copier %s, type %d", swidget->widget->name, swidget->id);
1434 switch (swidget->id) {
1444 SOF_COPIER_DEEP_BUFFER_TOKENS, swidget->tuples,
1445 swidget->num_tuples, sizeof(u32), 1);
1448 swidget->widget->name);
1452 ipc4_copier = (struct sof_ipc4_copier *)swidget->private;
1457 pipe_widget = swidget->spipe->pipe_widget;
1510 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget;
1516 dai = swidget->private;
1544 ipc4_copier = (struct sof_ipc4_copier *)swidget->private;
1553 swidget->id, swidget->widget->name);
1558 ret = sof_ipc4_init_input_audio_fmt(sdev, swidget, &copier_data->base_config, ref_params,
1567 switch (swidget->id) {
1614 swidget->widget->name, out_ref_rate, out_ref_channels, out_ref_valid_bits);
1621 swidget->widget->name);
1635 dev_dbg(sdev->dev, "Output audio format for %s\n", swidget->widget->name);
1638 switch (swidget->id) {
1681 strcmp(w->widget->sname, swidget->widget->sname))
1734 switch (swidget->id) {
1780 dev_dbg(sdev->dev, "copier %s, IPC size is %d", swidget->widget->name, ipc_size);
1789 sof_ipc4_update_resource_usage(sdev, swidget, &copier_data->base_config);
1812 static int sof_ipc4_prepare_gain_module(struct snd_sof_widget *swidget,
1817 struct snd_soc_component *scomp = swidget->scomp;
1819 struct sof_ipc4_gain *gain = swidget->private;
1825 ret = sof_ipc4_init_input_audio_fmt(sdev, swidget, &gain->data.base_config,
1839 swidget->widget->name);
1844 sof_ipc4_update_resource_usage(sdev, swidget, &gain->data.base_config);
1849 static int sof_ipc4_prepare_mixer_module(struct snd_sof_widget *swidget,
1854 struct snd_soc_component *scomp = swidget->scomp;
1856 struct sof_ipc4_mixer *mixer = swidget->private;
1862 ret = sof_ipc4_init_input_audio_fmt(sdev, swidget, &mixer->base_config,
1876 swidget->widget->name);
1881 sof_ipc4_update_resource_usage(sdev, swidget, &mixer->base_config);
1886 static int sof_ipc4_prepare_src_module(struct snd_sof_widget *swidget,
1891 struct snd_soc_component *scomp = swidget->scomp;
1893 struct sof_ipc4_src *src = swidget->private;
1900 input_format_index = sof_ipc4_init_input_audio_fmt(sdev, swidget, &src->data.base_config,
1911 available_fmt->num_output_formats, swidget->widget->name);
1935 swidget->widget->name);
1940 sof_ipc4_update_resource_usage(sdev, swidget, &src->data.base_config);
1950 sof_ipc4_process_set_pin_formats(struct snd_sof_widget *swidget, int pin_type)
1952 struct sof_ipc4_process *process = swidget->private;
1956 struct snd_soc_component *scomp = swidget->scomp;
1963 num_pins = swidget->num_input_pins;
1967 num_pins = swidget->num_output_pins;
1968 pin_format_offset = swidget->num_input_pins;
2005 i - pin_format_offset, swidget->widget->name);
2013 static int sof_ipc4_process_add_base_cfg_extn(struct snd_sof_widget *swidget)
2019 ret = sof_ipc4_process_set_pin_formats(swidget, i);
2027 static int sof_ipc4_prepare_process_module(struct snd_sof_widget *swidget,
2032 struct snd_soc_component *scomp = swidget->scomp;
2034 struct sof_ipc4_process *process = swidget->private;
2042 ret = sof_ipc4_init_input_audio_fmt(sdev, swidget, &process->base_config,
2057 swidget->widget->name);
2076 sof_ipc4_update_resource_usage(sdev, swidget, &process->base_config);
2085 ret = sof_ipc4_process_add_base_cfg_extn(swidget);
2208 static int sof_ipc4_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
2210 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget;
2218 switch (swidget->id) {
2220 pipeline = swidget->private;
2224 swidget->widget->name);
2228 dev_dbg(sdev->dev, "pipeline: %d memory pages: %d\n", swidget->pipeline_id,
2234 swidget->instance_id = ida_alloc_max(&pipeline_ida, ipc4_data->max_num_pipelines,
2236 if (swidget->instance_id < 0) {
2238 swidget->widget->name, swidget->instance_id);
2239 return swidget->instance_id;
2242 msg->primary |= SOF_IPC4_GLB_PIPE_INSTANCE_ID(swidget->instance_id);
2248 struct sof_ipc4_copier *ipc4_copier = swidget->private;
2263 struct snd_sof_dai *dai = swidget->private;
2278 struct sof_ipc4_gain *gain = swidget->private;
2288 struct sof_ipc4_mixer *mixer = swidget->private;
2298 struct sof_ipc4_src *src = swidget->private;
2308 struct sof_ipc4_process *process = swidget->private;
2312 swidget->widget->name);
2323 dev_err(sdev->dev, "widget type %d not supported", swidget->id);
2327 if (swidget->id != snd_soc_dapm_scheduler) {
2328 ret = sof_ipc4_widget_assign_instance_id(sdev, swidget);
2331 swidget->widget->name);
2336 msg->primary |= SOF_IPC4_MOD_INSTANCE(swidget->instance_id);
2345 swidget->widget->name, swidget->instance_id, swidget->pipeline_id, swidget->core);
2352 dev_err(sdev->dev, "failed to create module %s\n", swidget->widget->name);
2354 if (swidget->id != snd_soc_dapm_scheduler) {
2355 struct sof_ipc4_fw_module *fw_module = swidget->module_info;
2357 ida_free(&fw_module->m_ida, swidget->instance_id);
2359 ida_free(&pipeline_ida, swidget->instance_id);
2366 static int sof_ipc4_widget_free(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
2368 struct sof_ipc4_fw_module *fw_module = swidget->module_info;
2375 if (swidget->id == snd_soc_dapm_scheduler) {
2376 struct sof_ipc4_pipeline *pipeline = swidget->private;
2382 swidget->widget->name);
2387 header = SOF_IPC4_GLB_PIPE_INSTANCE_ID(swidget->instance_id);
2397 swidget->widget->name);
2401 ida_free(&pipeline_ida, swidget->instance_id);
2402 swidget->instance_id = -EINVAL;
2404 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget;
2408 ida_free(&fw_module->m_ida, swidget->instance_id);
2474 static void sof_ipc4_put_queue_id(struct snd_sof_widget *swidget, int queue_id,
2482 pin_binding = swidget->output_pin_binding;
2483 queue_ida = &swidget->output_queue_ida;
2484 num_pins = swidget->num_output_pins;
2486 pin_binding = swidget->input_pin_binding;
2487 queue_ida = &swidget->input_queue_ida;
2488 num_pins = swidget->num_input_pins;
2702 static int sof_ipc4_dai_config(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget,
2705 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget;
2707 struct snd_sof_dai *dai = swidget->private;
2714 swidget->widget->name);