Lines Matching +full:dmic01 +full:- +full:state

1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
13 #include <sound/hda-mlink.h>
15 #include <sound/intel-nhlt.h>
18 #include "../ipc4-priv.h"
19 #include "../ipc4-topology.h"
20 #include "../sof-priv.h"
21 #include "../sof-audio.h"
35 struct snd_sof_widget *swidget = w->dobj.private; in hda_dai_config()
46 if (tplg_ops && tplg_ops->dai_config) { in hda_dai_config()
47 ret = tplg_ops->dai_config(sdev, swidget, flags, data); in hda_dai_config()
49 dev_err(sdev->dev, "DAI config with flags %x failed for widget %s\n", in hda_dai_config()
50 flags, w->name); in hda_dai_config()
64 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream); in dai_to_sdev()
72 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream); in hda_dai_get_ops()
73 struct snd_sof_widget *swidget = w->dobj.private; in hda_dai_get_ops()
80 dev_err(sdev->dev, "%s: swidget is NULL\n", __func__); in hda_dai_get_ops()
84 if (sdev->dspless_mode_selected) in hda_dai_get_ops()
87 sdai = swidget->private; in hda_dai_get_ops()
90 if (!sdai->platform_private) { in hda_dai_get_ops()
97 if (!ops || !ops->get_hext_stream) in hda_dai_get_ops()
100 sdai->platform_private = ops; in hda_dai_get_ops()
103 return sdai->platform_private; in hda_dai_get_ops()
118 dev_err(cpu_dai->dev, "DAI widget ops not set\n"); in hda_link_dma_cleanup()
119 return -EINVAL; in hda_link_dma_cleanup()
124 hlink = ops->get_hlink(sdev, substream); in hda_link_dma_cleanup()
126 return -EINVAL; in hda_link_dma_cleanup()
128 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in hda_link_dma_cleanup()
129 stream_tag = hdac_stream(hext_stream)->stream_tag; in hda_link_dma_cleanup()
140 hext_stream->link_prepared = 0; in hda_link_dma_cleanup()
144 if (ops->release_hext_stream) in hda_link_dma_cleanup()
145 ops->release_hext_stream(sdev, cpu_dai, substream); in hda_link_dma_cleanup()
147 hext_stream->link_prepared = 0; in hda_link_dma_cleanup()
151 hda_stream->host_reserved = 0; in hda_link_dma_cleanup()
167 dev_err(cpu_dai->dev, "DAI widget ops not set\n"); in hda_link_dma_hw_params()
168 return -EINVAL; in hda_link_dma_hw_params()
173 hlink = ops->get_hlink(sdev, substream); in hda_link_dma_hw_params()
175 return -EINVAL; in hda_link_dma_hw_params()
177 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); in hda_link_dma_hw_params()
180 if (ops->assign_hext_stream) in hda_link_dma_hw_params()
181 hext_stream = ops->assign_hext_stream(sdev, cpu_dai, substream); in hda_link_dma_hw_params()
185 return -EBUSY; in hda_link_dma_hw_params()
187 hstream = &hext_stream->hstream; in hda_link_dma_hw_params()
188 stream_tag = hstream->stream_tag; in hda_link_dma_hw_params()
190 if (hext_stream->hstream.direction == SNDRV_PCM_STREAM_PLAYBACK) in hda_link_dma_hw_params()
194 if (ops->codec_dai_set_stream) in hda_link_dma_hw_params()
195 ops->codec_dai_set_stream(sdev, substream, hstream); in hda_link_dma_hw_params()
197 if (ops->reset_hext_stream) in hda_link_dma_hw_params()
198 ops->reset_hext_stream(sdev, hext_stream); in hda_link_dma_hw_params()
200 if (ops->calc_stream_format && ops->setup_hext_stream) { in hda_link_dma_hw_params()
201 unsigned int format_val = ops->calc_stream_format(sdev, substream, params); in hda_link_dma_hw_params()
203 ops->setup_hext_stream(sdev, hext_stream, format_val); in hda_link_dma_hw_params()
206 hext_stream->link_prepared = 1; in hda_link_dma_hw_params()
219 dev_err(cpu_dai->dev, "DAI widget ops not set\n"); in hda_dai_hw_free()
220 return -EINVAL; in hda_dai_hw_free()
223 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); in hda_dai_hw_free()
236 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(dai, substream->stream); in hda_dai_hw_params_data()
243 dev_err(sdev->dev, "DAI widget ops not set\n"); in hda_dai_hw_params_data()
244 return -EINVAL; in hda_dai_hw_params_data()
247 hext_stream = ops->get_hext_stream(sdev, dai, substream); in hda_dai_hw_params_data()
248 if (hext_stream && hext_stream->link_prepared) in hda_dai_hw_params_data()
255 hext_stream = ops->get_hext_stream(sdev, dai, substream); in hda_dai_hw_params_data()
258 data->dai_data = hdac_stream(hext_stream)->stream_tag - 1; in hda_dai_hw_params_data()
274 * In contrast to IPC3, the dai trigger in IPC4 mixes pipeline state changes
275 * (over IPC channel) and DMA state change (direct host register changes).
286 dev_err(dai->dev, "DAI widget ops not set\n"); in hda_dai_trigger()
287 return -EINVAL; in hda_dai_trigger()
290 dev_dbg(dai->dev, "cmd=%d dai %s direction %d\n", cmd, in hda_dai_trigger()
291 dai->name, substream->stream); in hda_dai_trigger()
295 hext_stream = ops->get_hext_stream(sdev, dai, substream); in hda_dai_trigger()
297 return -EINVAL; in hda_dai_trigger()
299 if (ops->pre_trigger) { in hda_dai_trigger()
300 ret = ops->pre_trigger(sdev, dai, substream, cmd); in hda_dai_trigger()
305 if (ops->trigger) { in hda_dai_trigger()
306 ret = ops->trigger(sdev, dai, substream, cmd); in hda_dai_trigger()
311 if (ops->post_trigger) { in hda_dai_trigger()
312 ret = ops->post_trigger(sdev, dai, substream, cmd); in hda_dai_trigger()
323 dev_err(sdev->dev, "%s: failed to clean up link DMA\n", __func__); in hda_dai_trigger()
339 int stream = substream->stream; in hda_dai_prepare()
341 return hda_dai_hw_params(substream, &rtd->dpcm[stream].hw_params, dai); in hda_dai_prepare()
355 struct snd_sof_widget *swidget = w->dobj.private; in widget_to_copier()
356 struct snd_sof_dai *sdai = swidget->private; in widget_to_copier()
357 struct sof_ipc4_copier *ipc4_copier = (struct sof_ipc4_copier *)sdai->private; in widget_to_copier()
368 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream); in non_hda_dai_hw_params_data()
384 dev_err(cpu_dai->dev, "DAI widget ops not set\n"); in non_hda_dai_hw_params_data()
385 return -EINVAL; in non_hda_dai_hw_params_data()
389 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); in non_hda_dai_hw_params_data()
392 if (hext_stream && hext_stream->link_prepared) in non_hda_dai_hw_params_data()
398 dev_err(cpu_dai->dev, "%s: hda_dai_hw_params_data failed: %d\n", __func__, ret); in non_hda_dai_hw_params_data()
402 if (sdev->dspless_mode_selected) in non_hda_dai_hw_params_data()
406 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); in non_hda_dai_hw_params_data()
409 dev_err(cpu_dai->dev, "%s: no hext_stream found\n", __func__); in non_hda_dai_hw_params_data()
410 return -ENODEV; in non_hda_dai_hw_params_data()
413 hstream = &hext_stream->hstream; in non_hda_dai_hw_params_data()
414 stream_id = hstream->stream_tag; in non_hda_dai_hw_params_data()
417 dev_err(cpu_dai->dev, "%s: no stream_id allocated\n", __func__); in non_hda_dai_hw_params_data()
418 return -ENODEV; in non_hda_dai_hw_params_data()
429 dma_config_tlv = &ipc4_copier->dma_config_tlv[cpu_dai_id]; in non_hda_dai_hw_params_data()
430 dma_config_tlv->type = SOF_IPC4_GTW_DMA_CONFIG_ID; in non_hda_dai_hw_params_data()
432 dma_config_tlv->length = sizeof(dma_config_tlv->dma_config); in non_hda_dai_hw_params_data()
434 dma_config = &dma_config_tlv->dma_config; in non_hda_dai_hw_params_data()
436 dma_config->dma_method = SOF_IPC4_DMA_METHOD_HDA; in non_hda_dai_hw_params_data()
437 dma_config->pre_allocated_by_host = 1; in non_hda_dai_hw_params_data()
438 dma_config->dma_channel_id = stream_id - 1; in non_hda_dai_hw_params_data()
439 dma_config->stream_id = stream_id; in non_hda_dai_hw_params_data()
444 dma_config->dma_stream_channel_map.device_count = 1; in non_hda_dai_hw_params_data()
445 dma_config->dma_priv_config_size = 0; in non_hda_dai_hw_params_data()
464 int stream = substream->stream; in non_hda_dai_prepare()
466 return non_hda_dai_hw_params(substream, &rtd->dpcm[stream].hw_params, cpu_dai); in non_hda_dai_prepare()
489 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream); in sdw_hda_dai_hw_params()
507 dev_err(cpu_dai->dev, "%s widget not found, check amp link num in the topology\n", in sdw_hda_dai_hw_params()
508 cpu_dai->name); in sdw_hda_dai_hw_params()
509 return -EINVAL; in sdw_hda_dai_hw_params()
514 dev_err(cpu_dai->dev, "DAI widget ops not set\n"); in sdw_hda_dai_hw_params()
515 return -EINVAL; in sdw_hda_dai_hw_params()
519 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); in sdw_hda_dai_hw_params()
522 if (hext_stream && hext_stream->link_prepared) in sdw_hda_dai_hw_params()
529 ret = hdac_bus_eml_sdw_map_stream_ch(sof_to_bus(sdev), link_id, cpu_dai->id, in sdw_hda_dai_hw_params()
530 0, 0, substream->stream); in sdw_hda_dai_hw_params()
532 dev_err(cpu_dai->dev, "%s: hdac_bus_eml_sdw_map_stream_ch failed %d\n", in sdw_hda_dai_hw_params()
537 data.dai_index = (link_id << 8) | cpu_dai->id; in sdw_hda_dai_hw_params()
541 dev_err(cpu_dai->dev, "%s: non_hda_dai_hw_params failed %d\n", __func__, ret); in sdw_hda_dai_hw_params()
545 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); in sdw_hda_dai_hw_params()
547 return -ENODEV; in sdw_hda_dai_hw_params()
552 * by reconstructing the split done in soc-pcm.c in sdw_hda_dai_hw_params()
562 return -ENODEV; in sdw_hda_dai_hw_params()
564 ch_mask = GENMASK(params_channels(params) - 1, 0); in sdw_hda_dai_hw_params()
566 ret = hdac_bus_eml_sdw_map_stream_ch(sof_to_bus(sdev), link_id, cpu_dai->id, in sdw_hda_dai_hw_params()
568 hdac_stream(hext_stream)->stream_tag, in sdw_hda_dai_hw_params()
569 substream->stream); in sdw_hda_dai_hw_params()
571 dev_err(cpu_dai->dev, "%s: hdac_bus_eml_sdw_map_stream_ch failed %d\n", in sdw_hda_dai_hw_params()
576 if (sdev->dspless_mode_selected) in sdw_hda_dai_hw_params()
580 dma_config_tlv = &ipc4_copier->dma_config_tlv[cpu_dai_id]; in sdw_hda_dai_hw_params()
581 dma_config = &dma_config_tlv->dma_config; in sdw_hda_dai_hw_params()
582 dma_config->dma_stream_channel_map.mapping[0].device = data.dai_index; in sdw_hda_dai_hw_params()
583 dma_config->dma_stream_channel_map.mapping[0].channel_mask = ch_mask; in sdw_hda_dai_hw_params()
590 w = snd_soc_dai_get_widget(dai, substream->stream); in sdw_hda_dai_hw_params()
592 dev_err(cpu_dai->dev, in sdw_hda_dai_hw_params()
594 dai->name); in sdw_hda_dai_hw_params()
595 return -EINVAL; in sdw_hda_dai_hw_params()
598 memcpy(&ipc4_copier->dma_config_tlv[cpu_dai_id], dma_config_tlv, in sdw_hda_dai_hw_params()
609 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream); in sdw_hda_dai_hw_free()
615 dev_err(cpu_dai->dev, "%s: non_hda_dai_hw_free failed %d\n", __func__, ret); in sdw_hda_dai_hw_free()
622 ret = hdac_bus_eml_sdw_map_stream_ch(sof_to_bus(sdev), link_id, cpu_dai->id, in sdw_hda_dai_hw_free()
623 0, 0, substream->stream); in sdw_hda_dai_hw_free()
625 dev_err(cpu_dai->dev, "%s: hdac_bus_eml_sdw_map_stream_ch failed %d\n", in sdw_hda_dai_hw_free()
649 list_for_each_entry(s, &bus->stream_list, list) { in hda_dai_suspend()
659 if (hext_stream->link_substream) { in hda_dai_suspend()
667 rtd = snd_soc_substream_to_rtd(hext_stream->link_substream); in hda_dai_suspend()
669 w = snd_soc_dai_get_widget(cpu_dai, hdac_stream(hext_stream)->direction); in hda_dai_suspend()
670 swidget = w->dobj.private; in hda_dai_suspend()
672 sdai = swidget->private; in hda_dai_suspend()
673 ops = sdai->platform_private; in hda_dai_suspend()
675 if (rtd->dpcm[hext_stream->link_substream->stream].state != in hda_dai_suspend()
680 if (ops->post_trigger) { in hda_dai_suspend()
681 ret = ops->post_trigger(sdev, cpu_dai, in hda_dai_suspend()
682 hext_stream->link_substream, in hda_dai_suspend()
688 ret = hda_link_dma_cleanup(hext_stream->link_substream, in hda_dai_suspend()
703 chip = get_chip_info(sdev->pdata); in ssp_set_dai_drv_ops()
705 if (chip->hw_ip_version >= SOF_INTEL_ACE_2_0) { in ssp_set_dai_drv_ops()
706 for (i = 0; i < ops->num_drv; i++) { in ssp_set_dai_drv_ops()
707 if (strstr(ops->drv[i].name, "SSP")) in ssp_set_dai_drv_ops()
708 ops->drv[i].ops = &ssp_dai_ops; in ssp_set_dai_drv_ops()
718 chip = get_chip_info(sdev->pdata); in dmic_set_dai_drv_ops()
720 if (chip->hw_ip_version >= SOF_INTEL_ACE_2_0) { in dmic_set_dai_drv_ops()
721 for (i = 0; i < ops->num_drv; i++) { in dmic_set_dai_drv_ops()
722 if (strstr(ops->drv[i].name, "DMIC")) in dmic_set_dai_drv_ops()
723 ops->drv[i].ops = &dmic_dai_ops; in dmic_set_dai_drv_ops()
739 for (i = 0; i < ops->num_drv; i++) { in hda_set_dai_drv_ops()
741 if (strstr(ops->drv[i].name, "iDisp") || in hda_set_dai_drv_ops()
742 strstr(ops->drv[i].name, "Analog") || in hda_set_dai_drv_ops()
743 strstr(ops->drv[i].name, "Digital")) in hda_set_dai_drv_ops()
744 ops->drv[i].ops = &hda_dai_ops; in hda_set_dai_drv_ops()
751 if (sdev->pdata->ipc_type == SOF_IPC_TYPE_4 && !hda_use_tplg_nhlt) { in hda_set_dai_drv_ops()
752 struct sof_ipc4_fw_data *ipc4_data = sdev->private; in hda_set_dai_drv_ops()
754 ipc4_data->nhlt = intel_nhlt_init(sdev->dev); in hda_set_dai_drv_ops()
761 if (sdev->pdata->ipc_type == SOF_IPC_TYPE_4) { in hda_ops_free()
762 struct sof_ipc4_fw_data *ipc4_data = sdev->private; in hda_ops_free()
765 intel_nhlt_free(ipc4_data->nhlt); in hda_ops_free()
767 kfree(sdev->private); in hda_ops_free()
768 sdev->private = NULL; in hda_ops_free()
846 .name = "DMIC01 Pin",
929 * does not throw the TRIGGER_SUSPEND. This leaves the DAIs in an unbalanced state. in hda_dsp_dais_suspend()