Commit eaf8df8f authored by Mark Brown's avatar Mark Brown

Merge series "ASoC: simple-card / audio-graph re-cleanup" from Kuninori...

Merge series "ASoC: simple-card / audio-graph re-cleanup" from Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>:

Hi Mark, Guillaume

I'm so sorry to bother you again and again.
These are v2 of simple-card / audio-graph re-cleanup.

KernelCI had reported that below patches broke kontron-sl28-var3-ads2
sound card probing.

	43439227 "ASoC: simple-card: add simple_link_init()"
	59c35c44 "ASoC: simple-card: add simple_parse_node()"

Main issue I'm understanding is name create timing.
We want to create dailink->name via dlc->dai_name.
But in CPU case, this dai_name might be removed by asoc_simple_canonicalize_cpu()
if it CPU was single DAI.

Thus, we need to
	A) get dlc->dai_name
	B) create dailink->name via dlc->dai_name
	C) call asoc_simple_canonicalize_cpu()

Above reverted patch did A->C->B.
My previous v1 patch did B->A->C.

I'm so sorry that I didn't deep test on v1.
I hope v2 patches has no issues on kontron-sl28-var3-ads2.

Link: https://lore.kernel.org/r/87cztzcq56.wl-kuninori.morimoto.gx@renesas.com
Link: https://lore.kernel.org/r/87h7k0i437.wl-kuninori.morimoto.gx@renesas.com
Link: https://lore.kernel.org/r/20210423175318.13990-1-broonie@kernel.org
Link: https://lore.kernel.org/r/3ca62063-41b4-c25b-a7bc-8a8160e7b684@collabora.com

Kuninori Morimoto (4):
  ASoC: simple-card: add simple_parse_node()
  ASoC: simple-card: add simple_link_init()
  ASoC: audio-graph: tidyup graph_dai_link_of_dpcm()
  ASoC: audio-graph: tidyup graph_parse_node()

 sound/soc/generic/audio-graph-card.c |  57 ++++-----
 sound/soc/generic/simple-card.c      | 168 +++++++++++++--------------
 2 files changed, 112 insertions(+), 113 deletions(-)

--
2.25.1
parents 0fad605f 582f3503
...@@ -209,7 +209,7 @@ static void graph_parse_mclk_fs(struct device_node *top, ...@@ -209,7 +209,7 @@ static void graph_parse_mclk_fs(struct device_node *top,
static int graph_parse_node(struct asoc_simple_priv *priv, static int graph_parse_node(struct asoc_simple_priv *priv,
struct device_node *ep, struct device_node *ep,
struct link_info *li, struct link_info *li,
int is_cpu) int *cpu)
{ {
struct device *dev = simple_priv_to_dev(priv); struct device *dev = simple_priv_to_dev(priv);
struct device_node *top = dev->of_node; struct device_node *top = dev->of_node;
...@@ -217,9 +217,9 @@ static int graph_parse_node(struct asoc_simple_priv *priv, ...@@ -217,9 +217,9 @@ static int graph_parse_node(struct asoc_simple_priv *priv,
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link); struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
struct snd_soc_dai_link_component *dlc; struct snd_soc_dai_link_component *dlc;
struct asoc_simple_dai *dai; struct asoc_simple_dai *dai;
int ret, single = 0; int ret;
if (is_cpu) { if (cpu) {
dlc = asoc_link_to_cpu(dai_link, 0); dlc = asoc_link_to_cpu(dai_link, 0);
dai = simple_props_to_dai_cpu(dai_props, 0); dai = simple_props_to_dai_cpu(dai_props, 0);
} else { } else {
...@@ -229,7 +229,7 @@ static int graph_parse_node(struct asoc_simple_priv *priv, ...@@ -229,7 +229,7 @@ static int graph_parse_node(struct asoc_simple_priv *priv,
graph_parse_mclk_fs(top, ep, dai_props); graph_parse_mclk_fs(top, ep, dai_props);
ret = asoc_simple_parse_dai(ep, dlc, &single); ret = asoc_simple_parse_dai(ep, dlc, cpu);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -241,9 +241,6 @@ static int graph_parse_node(struct asoc_simple_priv *priv, ...@@ -241,9 +241,6 @@ static int graph_parse_node(struct asoc_simple_priv *priv,
if (ret < 0) if (ret < 0)
return ret; return ret;
if (is_cpu)
asoc_simple_canonicalize_cpu(dlc, single);
return 0; return 0;
} }
...@@ -276,33 +273,29 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv, ...@@ -276,33 +273,29 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
struct link_info *li) struct link_info *li)
{ {
struct device *dev = simple_priv_to_dev(priv); struct device *dev = simple_priv_to_dev(priv);
struct snd_soc_card *card = simple_priv_to_card(priv);
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link); struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
struct device_node *top = dev->of_node; struct device_node *top = dev->of_node;
struct device_node *ep = li->cpu ? cpu_ep : codec_ep; struct device_node *ep = li->cpu ? cpu_ep : codec_ep;
struct device_node *port;
struct device_node *ports;
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
char dai_name[64]; char dai_name[64];
int ret; int ret;
port = of_get_parent(ep);
ports = of_get_parent(port);
dev_dbg(dev, "link_of DPCM (%pOF)\n", ep); dev_dbg(dev, "link_of DPCM (%pOF)\n", ep);
if (li->cpu) { if (li->cpu) {
struct snd_soc_card *card = simple_priv_to_card(priv);
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
int is_single_links = 0;
/* Codec is dummy */ /* Codec is dummy */
/* FE settings */ /* FE settings */
dai_link->dynamic = 1; dai_link->dynamic = 1;
dai_link->dpcm_merged_format = 1; dai_link->dpcm_merged_format = 1;
ret = graph_parse_node(priv, cpu_ep, li, 1); ret = graph_parse_node(priv, cpu_ep, li, &is_single_links);
if (ret) if (ret)
goto out_put_node; return ret;
snprintf(dai_name, sizeof(dai_name), snprintf(dai_name, sizeof(dai_name),
"fe.%pOFP.%s", cpus->of_node, cpus->dai_name); "fe.%pOFP.%s", cpus->of_node, cpus->dai_name);
...@@ -318,8 +311,13 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv, ...@@ -318,8 +311,13 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
*/ */
if (card->component_chaining && !soc_component_is_pcm(cpus)) if (card->component_chaining && !soc_component_is_pcm(cpus))
dai_link->no_pcm = 1; dai_link->no_pcm = 1;
asoc_simple_canonicalize_cpu(cpus, is_single_links);
} else { } else {
struct snd_soc_codec_conf *cconf; struct snd_soc_codec_conf *cconf = simple_props_to_codec_conf(dai_props, 0);
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
struct device_node *port;
struct device_node *ports;
/* CPU is dummy */ /* CPU is dummy */
...@@ -327,22 +325,25 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv, ...@@ -327,22 +325,25 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
dai_link->no_pcm = 1; dai_link->no_pcm = 1;
dai_link->be_hw_params_fixup = asoc_simple_be_hw_params_fixup; dai_link->be_hw_params_fixup = asoc_simple_be_hw_params_fixup;
cconf = simple_props_to_codec_conf(dai_props, 0); ret = graph_parse_node(priv, codec_ep, li, NULL);
ret = graph_parse_node(priv, codec_ep, li, 0);
if (ret < 0) if (ret < 0)
goto out_put_node; return ret;
snprintf(dai_name, sizeof(dai_name), snprintf(dai_name, sizeof(dai_name),
"be.%pOFP.%s", codecs->of_node, codecs->dai_name); "be.%pOFP.%s", codecs->of_node, codecs->dai_name);
/* check "prefix" from top node */ /* check "prefix" from top node */
port = of_get_parent(ep);
ports = of_get_parent(port);
snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node, snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node,
"prefix"); "prefix");
if (of_node_name_eq(ports, "ports")) if (of_node_name_eq(ports, "ports"))
snd_soc_of_parse_node_prefix(ports, cconf, codecs->of_node, "prefix"); snd_soc_of_parse_node_prefix(ports, cconf, codecs->of_node, "prefix");
snd_soc_of_parse_node_prefix(port, cconf, codecs->of_node, snd_soc_of_parse_node_prefix(port, cconf, codecs->of_node,
"prefix"); "prefix");
of_node_put(ports);
of_node_put(port);
} }
graph_parse_convert(dev, ep, &dai_props->adata); graph_parse_convert(dev, ep, &dai_props->adata);
...@@ -351,11 +352,8 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv, ...@@ -351,11 +352,8 @@ static int graph_dai_link_of_dpcm(struct asoc_simple_priv *priv,
ret = graph_link_init(priv, cpu_ep, codec_ep, li, dai_name); ret = graph_link_init(priv, cpu_ep, codec_ep, li, dai_name);
out_put_node:
li->link++; li->link++;
of_node_put(ports);
of_node_put(port);
return ret; return ret;
} }
...@@ -369,20 +367,23 @@ static int graph_dai_link_of(struct asoc_simple_priv *priv, ...@@ -369,20 +367,23 @@ static int graph_dai_link_of(struct asoc_simple_priv *priv,
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0); struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0); struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
char dai_name[64]; char dai_name[64];
int ret; int ret, is_single_links = 0;
dev_dbg(dev, "link_of (%pOF)\n", cpu_ep); dev_dbg(dev, "link_of (%pOF)\n", cpu_ep);
ret = graph_parse_node(priv, cpu_ep, li, 1); ret = graph_parse_node(priv, cpu_ep, li, &is_single_links);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = graph_parse_node(priv, codec_ep, li, 0); ret = graph_parse_node(priv, codec_ep, li, NULL);
if (ret < 0) if (ret < 0)
return ret; return ret;
snprintf(dai_name, sizeof(dai_name), snprintf(dai_name, sizeof(dai_name),
"%s-%s", cpus->dai_name, codecs->dai_name); "%s-%s", cpus->dai_name, codecs->dai_name);
asoc_simple_canonicalize_cpu(cpus, is_single_links);
ret = graph_link_init(priv, cpu_ep, codec_ep, li, dai_name); ret = graph_link_init(priv, cpu_ep, codec_ep, li, dai_name);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -93,12 +93,11 @@ static void simple_parse_convert(struct device *dev, ...@@ -93,12 +93,11 @@ static void simple_parse_convert(struct device *dev,
} }
static void simple_parse_mclk_fs(struct device_node *top, static void simple_parse_mclk_fs(struct device_node *top,
struct device_node *cpu, struct device_node *np,
struct device_node *codec,
struct simple_dai_props *props, struct simple_dai_props *props,
char *prefix) char *prefix)
{ {
struct device_node *node = of_get_parent(cpu); struct device_node *node = of_get_parent(np);
char prop[128]; char prop[128];
snprintf(prop, sizeof(prop), "%smclk-fs", PREFIX); snprintf(prop, sizeof(prop), "%smclk-fs", PREFIX);
...@@ -106,12 +105,71 @@ static void simple_parse_mclk_fs(struct device_node *top, ...@@ -106,12 +105,71 @@ static void simple_parse_mclk_fs(struct device_node *top,
snprintf(prop, sizeof(prop), "%smclk-fs", prefix); snprintf(prop, sizeof(prop), "%smclk-fs", prefix);
of_property_read_u32(node, prop, &props->mclk_fs); of_property_read_u32(node, prop, &props->mclk_fs);
of_property_read_u32(cpu, prop, &props->mclk_fs); of_property_read_u32(np, prop, &props->mclk_fs);
of_property_read_u32(codec, prop, &props->mclk_fs);
of_node_put(node); of_node_put(node);
} }
static int simple_parse_node(struct asoc_simple_priv *priv,
struct device_node *np,
struct link_info *li,
char *prefix,
int *cpu)
{
struct device *dev = simple_priv_to_dev(priv);
struct device_node *top = dev->of_node;
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
struct snd_soc_dai_link_component *dlc;
struct asoc_simple_dai *dai;
int ret;
if (cpu) {
dlc = asoc_link_to_cpu(dai_link, 0);
dai = simple_props_to_dai_cpu(dai_props, 0);
} else {
dlc = asoc_link_to_codec(dai_link, 0);
dai = simple_props_to_dai_codec(dai_props, 0);
}
simple_parse_mclk_fs(top, np, dai_props, prefix);
ret = asoc_simple_parse_dai(np, dlc, cpu);
if (ret)
return ret;
ret = asoc_simple_parse_clk(dev, np, dai, dlc);
if (ret)
return ret;
ret = asoc_simple_parse_tdm(np, dai);
if (ret)
return ret;
return 0;
}
static int simple_link_init(struct asoc_simple_priv *priv,
struct device_node *node,
struct device_node *codec,
struct link_info *li,
char *prefix, char *name)
{
struct device *dev = simple_priv_to_dev(priv);
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
int ret;
ret = asoc_simple_parse_daifmt(dev, node, codec,
prefix, &dai_link->dai_fmt);
if (ret < 0)
return 0;
dai_link->init = asoc_simple_dai_init;
dai_link->ops = &simple_ops;
return asoc_simple_set_dailink_name(dev, dai_link, name);
}
static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv, static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
struct device_node *np, struct device_node *np,
struct device_node *codec, struct device_node *codec,
...@@ -121,24 +179,21 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv, ...@@ -121,24 +179,21 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
struct device *dev = simple_priv_to_dev(priv); struct device *dev = simple_priv_to_dev(priv);
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link); struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
struct asoc_simple_dai *dai;
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
struct snd_soc_dai_link_component *platforms = asoc_link_to_platform(dai_link, 0);
struct device_node *top = dev->of_node; struct device_node *top = dev->of_node;
struct device_node *node = of_get_parent(np); struct device_node *node = of_get_parent(np);
char *prefix = ""; char *prefix = "";
char dai_name[64];
int ret; int ret;
dev_dbg(dev, "link_of DPCM (%pOF)\n", np); dev_dbg(dev, "link_of DPCM (%pOF)\n", np);
li->link++;
/* For single DAI link & old style of DT node */ /* For single DAI link & old style of DT node */
if (is_top) if (is_top)
prefix = PREFIX; prefix = PREFIX;
if (li->cpu) { if (li->cpu) {
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
struct snd_soc_dai_link_component *platforms = asoc_link_to_platform(dai_link, 0);
int is_single_links = 0; int is_single_links = 0;
/* Codec is dummy */ /* Codec is dummy */
...@@ -147,25 +202,16 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv, ...@@ -147,25 +202,16 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
dai_link->dynamic = 1; dai_link->dynamic = 1;
dai_link->dpcm_merged_format = 1; dai_link->dpcm_merged_format = 1;
dai = simple_props_to_dai_cpu(dai_props, 0); ret = simple_parse_node(priv, np, li, prefix, &is_single_links);
ret = asoc_simple_parse_dai(np, cpus, &is_single_links);
if (ret)
goto out_put_node;
ret = asoc_simple_parse_clk(dev, np, dai, cpus);
if (ret < 0) if (ret < 0)
goto out_put_node; goto out_put_node;
ret = asoc_simple_set_dailink_name(dev, dai_link, snprintf(dai_name, sizeof(dai_name), "fe.%s", cpus->dai_name);
"fe.%s",
cpus->dai_name);
if (ret < 0)
goto out_put_node;
asoc_simple_canonicalize_cpu(cpus, is_single_links); asoc_simple_canonicalize_cpu(cpus, is_single_links);
asoc_simple_canonicalize_platform(platforms, cpus); asoc_simple_canonicalize_platform(platforms, cpus);
} else { } else {
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
struct snd_soc_codec_conf *cconf; struct snd_soc_codec_conf *cconf;
/* CPU is dummy */ /* CPU is dummy */
...@@ -174,22 +220,13 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv, ...@@ -174,22 +220,13 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
dai_link->no_pcm = 1; dai_link->no_pcm = 1;
dai_link->be_hw_params_fixup = asoc_simple_be_hw_params_fixup; dai_link->be_hw_params_fixup = asoc_simple_be_hw_params_fixup;
dai = simple_props_to_dai_codec(dai_props, 0);
cconf = simple_props_to_codec_conf(dai_props, 0); cconf = simple_props_to_codec_conf(dai_props, 0);
ret = asoc_simple_parse_dai(np, codecs, NULL); ret = simple_parse_node(priv, np, li, prefix, NULL);
if (ret < 0) if (ret < 0)
goto out_put_node; goto out_put_node;
ret = asoc_simple_parse_clk(dev, np, dai, codecs); snprintf(dai_name, sizeof(dai_name), "be.%s", codecs->dai_name);
if (ret < 0)
goto out_put_node;
ret = asoc_simple_set_dailink_name(dev, dai_link,
"be.%s",
codecs->dai_name);
if (ret < 0)
goto out_put_node;
/* check "prefix" from top node */ /* check "prefix" from top node */
snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node, snd_soc_of_parse_node_prefix(top, cconf, codecs->of_node,
...@@ -201,23 +238,14 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv, ...@@ -201,23 +238,14 @@ static int simple_dai_link_of_dpcm(struct asoc_simple_priv *priv,
} }
simple_parse_convert(dev, np, &dai_props->adata); simple_parse_convert(dev, np, &dai_props->adata);
simple_parse_mclk_fs(top, np, codec, dai_props, prefix);
ret = asoc_simple_parse_tdm(np, dai);
if (ret)
goto out_put_node;
ret = asoc_simple_parse_daifmt(dev, node, codec,
prefix, &dai_link->dai_fmt);
if (ret < 0)
goto out_put_node;
snd_soc_dai_link_set_capabilities(dai_link); snd_soc_dai_link_set_capabilities(dai_link);
dai_link->ops = &simple_ops; ret = simple_link_init(priv, node, codec, li, prefix, dai_name);
dai_link->init = asoc_simple_dai_init;
out_put_node: out_put_node:
li->link++;
of_node_put(node); of_node_put(node);
return ret; return ret;
} }
...@@ -230,23 +258,19 @@ static int simple_dai_link_of(struct asoc_simple_priv *priv, ...@@ -230,23 +258,19 @@ static int simple_dai_link_of(struct asoc_simple_priv *priv,
{ {
struct device *dev = simple_priv_to_dev(priv); struct device *dev = simple_priv_to_dev(priv);
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
struct asoc_simple_dai *cpu_dai = simple_props_to_dai_cpu(dai_props, 0);
struct asoc_simple_dai *codec_dai = simple_props_to_dai_codec(dai_props, 0);
struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0); struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, 0);
struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0); struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, 0);
struct snd_soc_dai_link_component *platforms = asoc_link_to_platform(dai_link, 0); struct snd_soc_dai_link_component *platforms = asoc_link_to_platform(dai_link, 0);
struct device_node *top = dev->of_node;
struct device_node *cpu = NULL; struct device_node *cpu = NULL;
struct device_node *node = NULL; struct device_node *node = NULL;
struct device_node *plat = NULL; struct device_node *plat = NULL;
char dai_name[64];
char prop[128]; char prop[128];
char *prefix = ""; char *prefix = "";
int ret, single_cpu = 0; int ret, single_cpu = 0;
cpu = np; cpu = np;
node = of_get_parent(np); node = of_get_parent(np);
li->link++;
dev_dbg(dev, "link_of (%pOF)\n", node); dev_dbg(dev, "link_of (%pOF)\n", node);
...@@ -257,18 +281,11 @@ static int simple_dai_link_of(struct asoc_simple_priv *priv, ...@@ -257,18 +281,11 @@ static int simple_dai_link_of(struct asoc_simple_priv *priv,
snprintf(prop, sizeof(prop), "%splat", prefix); snprintf(prop, sizeof(prop), "%splat", prefix);
plat = of_get_child_by_name(node, prop); plat = of_get_child_by_name(node, prop);
ret = asoc_simple_parse_daifmt(dev, node, codec, ret = simple_parse_node(priv, cpu, li, prefix, &single_cpu);
prefix, &dai_link->dai_fmt);
if (ret < 0)
goto dai_link_of_err;
simple_parse_mclk_fs(top, cpu, codec, dai_props, prefix);
ret = asoc_simple_parse_dai(cpu, cpus, &single_cpu);
if (ret < 0) if (ret < 0)
goto dai_link_of_err; goto dai_link_of_err;
ret = asoc_simple_parse_dai(codec, codecs, NULL); ret = simple_parse_node(priv, codec, li, prefix, NULL);
if (ret < 0) if (ret < 0)
goto dai_link_of_err; goto dai_link_of_err;
...@@ -276,39 +293,20 @@ static int simple_dai_link_of(struct asoc_simple_priv *priv, ...@@ -276,39 +293,20 @@ static int simple_dai_link_of(struct asoc_simple_priv *priv,
if (ret < 0) if (ret < 0)
goto dai_link_of_err; goto dai_link_of_err;
ret = asoc_simple_parse_tdm(cpu, cpu_dai); snprintf(dai_name, sizeof(dai_name),
if (ret < 0) "%s-%s", cpus->dai_name, codecs->dai_name);
goto dai_link_of_err;
ret = asoc_simple_parse_tdm(codec, codec_dai);
if (ret < 0)
goto dai_link_of_err;
ret = asoc_simple_parse_clk(dev, cpu, cpu_dai, cpus);
if (ret < 0)
goto dai_link_of_err;
ret = asoc_simple_parse_clk(dev, codec, codec_dai, codecs);
if (ret < 0)
goto dai_link_of_err;
ret = asoc_simple_set_dailink_name(dev, dai_link,
"%s-%s",
cpus->dai_name,
codecs->dai_name);
if (ret < 0)
goto dai_link_of_err;
dai_link->ops = &simple_ops;
dai_link->init = asoc_simple_dai_init;
asoc_simple_canonicalize_cpu(cpus, single_cpu); asoc_simple_canonicalize_cpu(cpus, single_cpu);
asoc_simple_canonicalize_platform(platforms, cpus); asoc_simple_canonicalize_platform(platforms, cpus);
ret = simple_link_init(priv, node, codec, li, prefix, dai_name);
dai_link_of_err: dai_link_of_err:
of_node_put(plat); of_node_put(plat);
of_node_put(node); of_node_put(node);
li->link++;
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment