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"
34 struct snd_sof_widget *swidget = w->dobj.private; in widget_to_sdev()
35 struct snd_soc_component *component = swidget->scomp; in widget_to_sdev()
43 struct snd_sof_widget *swidget = w->dobj.private; in hda_dai_config()
54 if (tplg_ops && tplg_ops->dai_config) { in hda_dai_config()
55 ret = tplg_ops->dai_config(sdev, swidget, flags, data); in hda_dai_config()
57 dev_err(sdev->dev, "DAI config with flags %x failed for widget %s\n", in hda_dai_config()
58 flags, w->name); in hda_dai_config()
71 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream); in dai_to_sdev()
79 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream); in hda_dai_get_ops()
80 struct snd_sof_widget *swidget = w->dobj.private; in hda_dai_get_ops()
90 if (sdev->dspless_mode_selected) in hda_dai_get_ops()
93 sdai = swidget->private; in hda_dai_get_ops()
96 if (!sdai->platform_private) { in hda_dai_get_ops()
103 if (!ops || !ops->get_hext_stream) in hda_dai_get_ops()
106 sdai->platform_private = ops; in hda_dai_get_ops()
109 return sdai->platform_private; in hda_dai_get_ops()
122 dev_err(cpu_dai->dev, "DAI widget ops not set\n"); in hda_link_dma_cleanup()
123 return -EINVAL; in hda_link_dma_cleanup()
128 hlink = ops->get_hlink(sdev, substream); in hda_link_dma_cleanup()
130 return -EINVAL; in hda_link_dma_cleanup()
132 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in hda_link_dma_cleanup()
133 stream_tag = hdac_stream(hext_stream)->stream_tag; in hda_link_dma_cleanup()
137 if (ops->release_hext_stream) in hda_link_dma_cleanup()
138 ops->release_hext_stream(sdev, cpu_dai, substream); in hda_link_dma_cleanup()
140 hext_stream->link_prepared = 0; in hda_link_dma_cleanup()
144 hda_stream->host_reserved = 0; in hda_link_dma_cleanup()
160 dev_err(cpu_dai->dev, "DAI widget ops not set\n"); in hda_link_dma_hw_params()
161 return -EINVAL; in hda_link_dma_hw_params()
166 hlink = ops->get_hlink(sdev, substream); in hda_link_dma_hw_params()
168 return -EINVAL; in hda_link_dma_hw_params()
170 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); in hda_link_dma_hw_params()
173 if (ops->assign_hext_stream) in hda_link_dma_hw_params()
174 hext_stream = ops->assign_hext_stream(sdev, cpu_dai, substream); in hda_link_dma_hw_params()
178 return -EBUSY; in hda_link_dma_hw_params()
180 hstream = &hext_stream->hstream; in hda_link_dma_hw_params()
181 stream_tag = hstream->stream_tag; in hda_link_dma_hw_params()
183 if (hext_stream->hstream.direction == SNDRV_PCM_STREAM_PLAYBACK) in hda_link_dma_hw_params()
187 if (ops->codec_dai_set_stream) in hda_link_dma_hw_params()
188 ops->codec_dai_set_stream(sdev, substream, hstream); in hda_link_dma_hw_params()
190 if (ops->reset_hext_stream) in hda_link_dma_hw_params()
191 ops->reset_hext_stream(sdev, hext_stream); in hda_link_dma_hw_params()
193 if (ops->calc_stream_format && ops->setup_hext_stream) { in hda_link_dma_hw_params()
194 unsigned int format_val = ops->calc_stream_format(sdev, substream, params); in hda_link_dma_hw_params()
196 ops->setup_hext_stream(sdev, hext_stream, format_val); in hda_link_dma_hw_params()
199 hext_stream->link_prepared = 1; in hda_link_dma_hw_params()
212 dev_err(cpu_dai->dev, "DAI widget ops not set\n"); in hda_dai_hw_free()
213 return -EINVAL; in hda_dai_hw_free()
216 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); in hda_dai_hw_free()
227 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(dai, substream->stream); in hda_dai_hw_params()
236 dev_err(sdev->dev, "DAI widget ops not set\n"); in hda_dai_hw_params()
237 return -EINVAL; in hda_dai_hw_params()
240 hext_stream = ops->get_hext_stream(sdev, dai, substream); in hda_dai_hw_params()
241 if (hext_stream && hext_stream->link_prepared) in hda_dai_hw_params()
248 hext_stream = ops->get_hext_stream(sdev, dai, substream); in hda_dai_hw_params()
251 data.dai_data = hdac_stream(hext_stream)->stream_tag - 1; in hda_dai_hw_params()
257 * In contrast to IPC3, the dai trigger in IPC4 mixes pipeline state changes
258 * (over IPC channel) and DMA state change (direct host register changes).
269 dev_err(dai->dev, "DAI widget ops not set\n"); in hda_dai_trigger()
270 return -EINVAL; in hda_dai_trigger()
273 dev_dbg(dai->dev, "cmd=%d dai %s direction %d\n", cmd, in hda_dai_trigger()
274 dai->name, substream->stream); in hda_dai_trigger()
278 hext_stream = ops->get_hext_stream(sdev, dai, substream); in hda_dai_trigger()
280 return -EINVAL; in hda_dai_trigger()
282 if (ops->pre_trigger) { in hda_dai_trigger()
283 ret = ops->pre_trigger(sdev, dai, substream, cmd); in hda_dai_trigger()
288 if (ops->trigger) { in hda_dai_trigger()
289 ret = ops->trigger(sdev, dai, substream, cmd); in hda_dai_trigger()
294 if (ops->post_trigger) { in hda_dai_trigger()
295 ret = ops->post_trigger(sdev, dai, substream, cmd); in hda_dai_trigger()
304 dev_err(sdev->dev, "%s: failed to clean up link DMA\n", __func__); in hda_dai_trigger()
320 int stream = substream->stream; in hda_dai_prepare()
322 return hda_dai_hw_params(substream, &rtd->dpcm[stream].hw_params, dai); in hda_dai_prepare()
336 struct snd_sof_widget *swidget = w->dobj.private; in widget_to_copier()
337 struct snd_sof_dai *sdai = swidget->private; in widget_to_copier()
338 struct sof_ipc4_copier *ipc4_copier = (struct sof_ipc4_copier *)sdai->private; in widget_to_copier()
347 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream); in non_hda_dai_hw_params()
360 dev_err(cpu_dai->dev, "DAI widget ops not set\n"); in non_hda_dai_hw_params()
361 return -EINVAL; in non_hda_dai_hw_params()
367 dev_err(cpu_dai->dev, "%s: hda_dai_hw_params failed: %d\n", __func__, ret); in non_hda_dai_hw_params()
373 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); in non_hda_dai_hw_params()
376 dev_err(cpu_dai->dev, "%s: no hext_stream found\n", __func__); in non_hda_dai_hw_params()
377 return -ENODEV; in non_hda_dai_hw_params()
380 hstream = &hext_stream->hstream; in non_hda_dai_hw_params()
381 stream_id = hstream->stream_tag; in non_hda_dai_hw_params()
384 dev_err(cpu_dai->dev, "%s: no stream_id allocated\n", __func__); in non_hda_dai_hw_params()
385 return -ENODEV; in non_hda_dai_hw_params()
391 dma_config_tlv = &ipc4_copier->dma_config_tlv; in non_hda_dai_hw_params()
392 dma_config_tlv->type = SOF_IPC4_GTW_DMA_CONFIG_ID; in non_hda_dai_hw_params()
394 dma_config_tlv->length = sizeof(dma_config_tlv->dma_config); in non_hda_dai_hw_params()
396 dma_config = &dma_config_tlv->dma_config; in non_hda_dai_hw_params()
398 dma_config->dma_method = SOF_IPC4_DMA_METHOD_HDA; in non_hda_dai_hw_params()
399 dma_config->pre_allocated_by_host = 1; in non_hda_dai_hw_params()
400 dma_config->dma_channel_id = stream_id - 1; in non_hda_dai_hw_params()
401 dma_config->stream_id = stream_id; in non_hda_dai_hw_params()
402 dma_config->dma_stream_channel_map.device_count = 0; /* mapping not used */ in non_hda_dai_hw_params()
403 dma_config->dma_priv_config_size = 0; in non_hda_dai_hw_params()
412 int stream = substream->stream; in non_hda_dai_prepare()
414 return non_hda_dai_hw_params(substream, &rtd->dpcm[stream].hw_params, cpu_dai); in non_hda_dai_prepare()
436 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream); in sdw_hda_dai_hw_params()
444 dev_err(cpu_dai->dev, "%s: non_hda_dai_hw_params failed %d\n", __func__, ret); in sdw_hda_dai_hw_params()
450 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); in sdw_hda_dai_hw_params()
453 return -ENODEV; in sdw_hda_dai_hw_params()
456 ret = hdac_bus_eml_sdw_map_stream_ch(sof_to_bus(sdev), link_id, cpu_dai->id, in sdw_hda_dai_hw_params()
457 GENMASK(params_channels(params) - 1, 0), in sdw_hda_dai_hw_params()
458 hdac_stream(hext_stream)->stream_tag, in sdw_hda_dai_hw_params()
459 substream->stream); in sdw_hda_dai_hw_params()
461 dev_err(cpu_dai->dev, "%s: hdac_bus_eml_sdw_map_stream_ch failed %d\n", in sdw_hda_dai_hw_params()
473 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream); in sdw_hda_dai_hw_free()
479 dev_err(cpu_dai->dev, "%s: non_hda_dai_hw_free failed %d\n", __func__, ret); in sdw_hda_dai_hw_free()
486 ret = hdac_bus_eml_sdw_map_stream_ch(sof_to_bus(sdev), link_id, cpu_dai->id, in sdw_hda_dai_hw_free()
487 0, 0, substream->stream); in sdw_hda_dai_hw_free()
489 dev_err(cpu_dai->dev, "%s: hdac_bus_eml_sdw_map_stream_ch failed %d\n", in sdw_hda_dai_hw_free()
511 list_for_each_entry(s, &bus->stream_list, list) { in hda_dai_suspend()
521 if (hext_stream->link_substream) { in hda_dai_suspend()
529 rtd = asoc_substream_to_rtd(hext_stream->link_substream); in hda_dai_suspend()
531 w = snd_soc_dai_get_widget(cpu_dai, hdac_stream(hext_stream)->direction); in hda_dai_suspend()
532 swidget = w->dobj.private; in hda_dai_suspend()
534 sdai = swidget->private; in hda_dai_suspend()
535 ops = sdai->platform_private; in hda_dai_suspend()
538 if (ops->post_trigger) { in hda_dai_suspend()
539 ret = ops->post_trigger(sdev, cpu_dai, in hda_dai_suspend()
540 hext_stream->link_substream, in hda_dai_suspend()
546 ret = hda_link_dma_cleanup(hext_stream->link_substream, in hda_dai_suspend()
562 chip = get_chip_info(sdev->pdata); in ssp_set_dai_drv_ops()
564 if (chip->hw_ip_version >= SOF_INTEL_ACE_2_0) { in ssp_set_dai_drv_ops()
565 for (i = 0; i < ops->num_drv; i++) { in ssp_set_dai_drv_ops()
566 if (strstr(ops->drv[i].name, "SSP")) in ssp_set_dai_drv_ops()
567 ops->drv[i].ops = &ssp_dai_ops; in ssp_set_dai_drv_ops()
577 chip = get_chip_info(sdev->pdata); in dmic_set_dai_drv_ops()
579 if (chip->hw_ip_version >= SOF_INTEL_ACE_2_0) { in dmic_set_dai_drv_ops()
580 for (i = 0; i < ops->num_drv; i++) { in dmic_set_dai_drv_ops()
581 if (strstr(ops->drv[i].name, "DMIC")) in dmic_set_dai_drv_ops()
582 ops->drv[i].ops = &dmic_dai_ops; in dmic_set_dai_drv_ops()
598 for (i = 0; i < ops->num_drv; i++) { in hda_set_dai_drv_ops()
600 if (strstr(ops->drv[i].name, "iDisp") || in hda_set_dai_drv_ops()
601 strstr(ops->drv[i].name, "Analog") || in hda_set_dai_drv_ops()
602 strstr(ops->drv[i].name, "Digital")) in hda_set_dai_drv_ops()
603 ops->drv[i].ops = &hda_dai_ops; in hda_set_dai_drv_ops()
610 if (sdev->pdata->ipc_type == SOF_INTEL_IPC4 && !hda_use_tplg_nhlt) { in hda_set_dai_drv_ops()
611 struct sof_ipc4_fw_data *ipc4_data = sdev->private; in hda_set_dai_drv_ops()
613 ipc4_data->nhlt = intel_nhlt_init(sdev->dev); in hda_set_dai_drv_ops()
619 if (sdev->pdata->ipc_type == SOF_INTEL_IPC4) { in hda_ops_free()
620 struct sof_ipc4_fw_data *ipc4_data = sdev->private; in hda_ops_free()
623 intel_nhlt_free(ipc4_data->nhlt); in hda_ops_free()
701 .name = "DMIC01 Pin",
783 * does not throw the TRIGGER_SUSPEND. This leaves the DAIs in an unbalanced state. in hda_dsp_dais_suspend()