Lines Matching +full:fe +full:- +full:dai +full:- +full:link

1 // SPDX-License-Identifier: GPL-2.0
8 // based on ${LINUX}/sound/soc/generic/simple-card.c
46 struct snd_soc_dapm_context *dapm = w->dapm;
47 struct simple_util_priv *priv = snd_soc_card_get_drvdata(dapm->card);
51 gpiod_set_value_cansleep(priv->pa_gpio, 1);
54 gpiod_set_value_cansleep(priv->pa_gpio, 0);
57 return -EINVAL;
77 struct snd_soc_dai *dai = snd_soc_find_dai_with_mutex(dlc);
79 if (dai && (dai->component->driver->pcm_construct ||
80 (dai->driver->ops && dai->driver->ops->pcm_new)))
90 struct device_node *top = dev->of_node;
107 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
108 struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
110 struct simple_util_dai *dai;
115 dai = simple_props_to_dai_cpu(dai_props, 0);
118 dai = simple_props_to_dai_codec(dai_props, 0);
125 ret = simple_util_parse_tdm(ep, dai);
129 ret = simple_util_parse_clk(dev, ep, dai, dlc);
141 struct device_node *top = dev->of_node;
142 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
143 struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
154 NULL, &dai_link->dai_fmt);
164 of_property_read_u32(top, "mclk-fs", &dai_props->mclk_fs);
165 of_property_read_u32(ports_cpu, "mclk-fs", &dai_props->mclk_fs);
166 of_property_read_u32(ports_codec, "mclk-fs", &dai_props->mclk_fs);
167 of_property_read_u32(port_cpu, "mclk-fs", &dai_props->mclk_fs);
168 of_property_read_u32(port_codec, "mclk-fs", &dai_props->mclk_fs);
169 of_property_read_u32(ep_cpu, "mclk-fs", &dai_props->mclk_fs);
170 of_property_read_u32(ep_codec, "mclk-fs", &dai_props->mclk_fs);
180 dai_link->playback_only = playback_only;
181 dai_link->capture_only = capture_only;
183 dai_link->trigger_start = trigger_start;
184 dai_link->trigger_stop = trigger_stop;
186 dai_link->init = simple_util_dai_init;
187 dai_link->ops = &graph_ops;
188 if (priv->ops)
189 dai_link->ops = priv->ops;
202 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
203 struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
204 struct device_node *top = dev->of_node;
205 struct device_node *ep = li->cpu ? cpu_ep : codec_ep;
211 if (li->cpu) {
219 /* FE settings */
220 dai_link->dynamic = 1;
221 dai_link->dpcm_merged_format = 1;
228 "fe.%pOFP.%s", cpus->of_node, cpus->dai_name);
230 * In BE<->BE connections it is not required to create
231 * PCM devices at CPU end of the dai link and thus 'no_pcm'
236 * For example: FE <-> BE1 <-> BE2 <-> ... <-> BEn where
239 if (card->component_chaining && !soc_component_is_pcm(cpus)) {
240 dai_link->no_pcm = 1;
241 dai_link->be_hw_params_fixup = simple_util_be_hw_params_fixup;
253 dai_link->no_pcm = 1;
254 dai_link->be_hw_params_fixup = simple_util_be_hw_params_fixup;
261 "be.%pOFP.%s", codecs->of_node, codecs->dai_name);
267 snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node, "prefix");
268 snd_soc_of_parse_node_prefix(ports, cconf, codecs->of_node, "prefix");
269 snd_soc_of_parse_node_prefix(port, cconf, codecs->of_node, "prefix");
272 graph_parse_convert(dev, ep, &dai_props->adata);
276 li->link++;
287 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
305 "%s-%s", cpus->dai_name, codecs->dai_name);
314 li->link++;
323 if (priv->force_dpcm)
326 if (!priv->dpcm_selectable)
332 * or has convert-xxx property
354 struct device_node *node = dev->of_node;
370 /* get convert-xxx property */
375 /* check if link requires DPCM parsing */
383 if (li->cpu ||
388 if (li->cpu)
418 * as "CPU-Codec".
421 * all CPUs are detected as "CPU-dummy", and
422 * all Codecs are detected as "dummy-Codec".
423 * To avoid random sub-device numbering,
424 * detect "dummy-Codec" in last;
426 for (li->cpu = 1; li->cpu >= 0; li->cpu--) {
441 int ret = -EINVAL;
443 if (li->link >= SNDRV_MAX_LINKS)
449 * simple-card.c :: simple_count_noml()
451 li->num[li->link].cpus = 1;
452 li->num[li->link].platforms = 1;
454 li->num[li->link].codecs = 1;
456 li->link += 1; /* 1xCPU-Codec */
470 int ret = -EINVAL;
472 if (li->link >= SNDRV_MAX_LINKS)
475 if (li->cpu) {
479 * simple-card.c :: simple_count_noml()
481 li->num[li->link].cpus = 1;
482 li->num[li->link].platforms = 1;
484 li->link++; /* 1xCPU-dummy */
486 li->num[li->link].codecs = 1;
488 li->link++; /* 1xdummy-Codec */
502 * CPU-Codec / CPU-dummy / dummy-Codec
505 * same number for "dummy-Codec"
508 * CPU0 --- Codec0 link : 5
509 * CPU1 --- Codec1 dais : 7
510 * CPU2 -/ ccnf : 1
511 * CPU3 --- Codec2
513 * => 5 links = 2xCPU-Codec + 2xCPU-dummy + 1xdummy-Codec
515 * => 1 ccnf = 1xdummy-Codec
518 * CPU0 --- Codec0 link : 5
519 * CPU1 --- Codec1 dais : 6
520 * CPU2 -/ ccnf : 1
521 * CPU3 -/
523 * => 5 links = 1xCPU-Codec + 3xCPU-dummy + 1xdummy-Codec
525 * => 1 ccnf = 1xdummy-Codec
528 * CPU0 --- Codec0 link : 6
529 * CPU1 -/ dais : 6
530 * CPU2 --- Codec1 ccnf : 2
531 * CPU3 -/
533 * => 6 links = 0xCPU-Codec + 4xCPU-dummy + 2xdummy-Codec
535 * => 2 ccnf = 2xdummy-Codec
538 * CPU0 --- Codec0 (convert-rate) link : 3
539 * CPU1 --- Codec1 dais : 4
542 * => 3 links = 1xCPU-Codec + 1xCPU-dummy + 1xdummy-Codec
544 * => 1 ccnf = 1xdummy-Codec
554 int ret = -ENOMEM;
560 card->owner = THIS_MODULE;
561 card->dev = dev;
567 ret = -EINVAL;
568 if (!li->link)
575 priv->pa_gpio = devm_gpiod_get_optional(dev, "pa", GPIOD_OUT_LOW);
576 if (IS_ERR(priv->pa_gpio)) {
577 ret = PTR_ERR(priv->pa_gpio);
620 struct device *dev = &pdev->dev;
623 /* Allocate the private data and the DAI link array */
626 return -ENOMEM;
629 card->dapm_widgets = graph_dapm_widgets;
630 card->num_dapm_widgets = ARRAY_SIZE(graph_dapm_widgets);
631 card->probe = graph_util_card_probe;
634 priv->dpcm_selectable = 1;
640 { .compatible = "audio-graph-card", },
641 { .compatible = "audio-graph-scu-card",
649 .name = "asoc-audio-graph-card",
658 MODULE_ALIAS("platform:asoc-audio-graph-card");