Unverified Commit 90de551c authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown
Browse files

ASoC: simple-card-utils.c: enable multi Component support



If CPU/Codec driver keeps its DAI node, we can directly identify actual
DAI by using snd_soc_get_dai_via_args().
This means we can use multi Component.

This patch enables multi Component support on Audio Graph Card/Card2.

Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/87a5w4o949.wl-kuninori.morimoto.gx@renesas.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent bbde4a30
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -192,9 +192,8 @@ int asoc_simple_remove(struct platform_device *pdev);

int asoc_graph_card_probe(struct snd_soc_card *card);
int asoc_graph_is_ports0(struct device_node *port);
int asoc_graph_parse_dai(struct device_node *ep,
			 struct snd_soc_dai_link_component *dlc,
			 int *is_single_link);
int asoc_graph_parse_dai(struct device *dev, struct device_node *ep,
			 struct snd_soc_dai_link_component *dlc, int *is_single_link);

#ifdef DEBUG
static inline void asoc_simple_debug_dai(struct asoc_simple_priv *priv,
+1 −1
Original line number Diff line number Diff line
@@ -126,7 +126,7 @@ static int graph_parse_node(struct asoc_simple_priv *priv,

	graph_parse_mclk_fs(top, ep, dai_props);

	ret = asoc_graph_parse_dai(ep, dlc, cpu);
	ret = asoc_graph_parse_dai(dev, ep, dlc, cpu);
	if (ret < 0)
		return ret;

+1 −1
Original line number Diff line number Diff line
@@ -407,7 +407,7 @@ static int __graph_parse_node(struct asoc_simple_priv *priv,

	graph_parse_mclk_fs(ep, dai_props);

	ret = asoc_graph_parse_dai(ep, dlc, &is_single_links);
	ret = asoc_graph_parse_dai(dev, ep, dlc, &is_single_links);
	if (ret < 0)
		return ret;

+18 −3
Original line number Diff line number Diff line
@@ -1066,12 +1066,12 @@ static int graph_get_dai_id(struct device_node *ep)
	return id;
}

int asoc_graph_parse_dai(struct device_node *ep,
			 struct snd_soc_dai_link_component *dlc,
			 int *is_single_link)
int asoc_graph_parse_dai(struct device *dev, struct device_node *ep,
			 struct snd_soc_dai_link_component *dlc, int *is_single_link)
{
	struct device_node *node;
	struct of_phandle_args args = {};
	struct snd_soc_dai *dai;
	int ret;

	if (!ep)
@@ -1079,6 +1079,20 @@ int asoc_graph_parse_dai(struct device_node *ep,

	node = of_graph_get_port_parent(ep);

	/*
	 * Try to find from DAI node
	 */
	args.np = ep;
	dai = snd_soc_get_dai_via_args(&args);
	if (dai) {
		dlc->dai_name = snd_soc_dai_name_get(dai);
		dlc->dai_args = snd_soc_copy_dai_args(dev, &args);
		if (!dlc->dai_args)
			return -ENOMEM;

		goto parse_dai_end;
	}

	/* Get dai->name */
	args.np		= node;
	args.args[0]	= graph_get_dai_id(ep);
@@ -1109,6 +1123,7 @@ int asoc_graph_parse_dai(struct device_node *ep,
		return ret;
	}

parse_dai_end:
	if (is_single_link)
		*is_single_link = of_graph_get_endpoint_count(node) == 1;