Commit e664de68 authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown

ASoC: simple_card_utils: support snd_soc_dai_link_component style for codec

Current ASoC is supporting snd_soc_dai_link_component for binding,
it is more useful than current legacy style.
Currently only codec is supporting it as multicodec (= codecs).
CPU will support multi style in the future.
We want to have it on Platform too in the future.

If all Codec/CPU/Platform are replaced into snd_soc_dai_link_component
style, we can remove legacy complex style.
This patch supports snd_soc_dai_link_component style
for simple_card_utils for codec.

[current]
struct snd_soc_dai_link {
	...
	*cpu_name;
	*cpu_of_node;
	*cpu_dai_name;

	*codec_name;
	*codec_of_node;
	*codec_dai_name;
	*codecs;
	num_codecs;

	*platform_name;
	*platform_of_node;
	...
}

[in the future]
struct snd_soc_dai_link {
	...
	*cpus
	num_cpus;

	*codecs;
	num_codecs;

	*platform;
	...
}
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent f853d6b3
...@@ -51,29 +51,35 @@ int asoc_simple_card_parse_card_name(struct snd_soc_card *card, ...@@ -51,29 +51,35 @@ int asoc_simple_card_parse_card_name(struct snd_soc_card *card,
#define asoc_simple_card_parse_clk_cpu(dev, node, dai_link, simple_dai) \ #define asoc_simple_card_parse_clk_cpu(dev, node, dai_link, simple_dai) \
asoc_simple_card_parse_clk(dev, node, dai_link->cpu_of_node, simple_dai, \ asoc_simple_card_parse_clk(dev, node, dai_link->cpu_of_node, simple_dai, \
dai_link->cpu_dai_name) dai_link->cpu_dai_name, NULL)
#define asoc_simple_card_parse_clk_codec(dev, node, dai_link, simple_dai) \ #define asoc_simple_card_parse_clk_codec(dev, node, dai_link, simple_dai) \
asoc_simple_card_parse_clk(dev, node, dai_link->codec_of_node, simple_dai,\ asoc_simple_card_parse_clk(dev, node, dai_link->codec_of_node, simple_dai,\
dai_link->codec_dai_name) dai_link->codec_dai_name, dai_link->codecs)
int asoc_simple_card_parse_clk(struct device *dev, int asoc_simple_card_parse_clk(struct device *dev,
struct device_node *node, struct device_node *node,
struct device_node *dai_of_node, struct device_node *dai_of_node,
struct asoc_simple_dai *simple_dai, struct asoc_simple_dai *simple_dai,
const char *name); const char *dai_name,
struct snd_soc_dai_link_component *dlc);
int asoc_simple_card_clk_enable(struct asoc_simple_dai *dai); int asoc_simple_card_clk_enable(struct asoc_simple_dai *dai);
void asoc_simple_card_clk_disable(struct asoc_simple_dai *dai); void asoc_simple_card_clk_disable(struct asoc_simple_dai *dai);
#define asoc_simple_card_parse_cpu(node, dai_link, \ #define asoc_simple_card_parse_cpu(node, dai_link, \
list_name, cells_name, is_single_link) \ list_name, cells_name, is_single_link) \
asoc_simple_card_parse_dai(node, &dai_link->cpu_of_node, \ asoc_simple_card_parse_dai(node, NULL, \
&dai_link->cpu_of_node, \
&dai_link->cpu_dai_name, list_name, cells_name, is_single_link) &dai_link->cpu_dai_name, list_name, cells_name, is_single_link)
#define asoc_simple_card_parse_codec(node, dai_link, list_name, cells_name) \ #define asoc_simple_card_parse_codec(node, dai_link, list_name, cells_name) \
asoc_simple_card_parse_dai(node, &dai_link->codec_of_node, \ asoc_simple_card_parse_dai(node, dai_link->codecs, \
&dai_link->codec_dai_name, list_name, cells_name, NULL) &dai_link->codec_of_node, \
&dai_link->codec_dai_name, \
list_name, cells_name, NULL)
#define asoc_simple_card_parse_platform(node, dai_link, list_name, cells_name) \ #define asoc_simple_card_parse_platform(node, dai_link, list_name, cells_name) \
asoc_simple_card_parse_dai(node, &dai_link->platform_of_node, \ asoc_simple_card_parse_dai(node, NULL, \
&dai_link->platform_of_node, \
NULL, list_name, cells_name, NULL) NULL, list_name, cells_name, NULL)
int asoc_simple_card_parse_dai(struct device_node *node, int asoc_simple_card_parse_dai(struct device_node *node,
struct snd_soc_dai_link_component *dlc,
struct device_node **endpoint_np, struct device_node **endpoint_np,
const char **dai_name, const char **dai_name,
const char *list_name, const char *list_name,
...@@ -81,12 +87,15 @@ int asoc_simple_card_parse_dai(struct device_node *node, ...@@ -81,12 +87,15 @@ int asoc_simple_card_parse_dai(struct device_node *node,
int *is_single_links); int *is_single_links);
#define asoc_simple_card_parse_graph_cpu(ep, dai_link) \ #define asoc_simple_card_parse_graph_cpu(ep, dai_link) \
asoc_simple_card_parse_graph_dai(ep, &dai_link->cpu_of_node, \ asoc_simple_card_parse_graph_dai(ep, NULL, \
&dai_link->cpu_of_node, \
&dai_link->cpu_dai_name) &dai_link->cpu_dai_name)
#define asoc_simple_card_parse_graph_codec(ep, dai_link) \ #define asoc_simple_card_parse_graph_codec(ep, dai_link) \
asoc_simple_card_parse_graph_dai(ep, &dai_link->codec_of_node, \ asoc_simple_card_parse_graph_dai(ep, dai_link->codecs, \
&dai_link->codec_of_node, \
&dai_link->codec_dai_name) &dai_link->codec_dai_name)
int asoc_simple_card_parse_graph_dai(struct device_node *ep, int asoc_simple_card_parse_graph_dai(struct device_node *ep,
struct snd_soc_dai_link_component *dlc,
struct device_node **endpoint_np, struct device_node **endpoint_np,
const char **dai_name); const char **dai_name);
......
...@@ -173,11 +173,23 @@ int asoc_simple_card_parse_clk(struct device *dev, ...@@ -173,11 +173,23 @@ int asoc_simple_card_parse_clk(struct device *dev,
struct device_node *node, struct device_node *node,
struct device_node *dai_of_node, struct device_node *dai_of_node,
struct asoc_simple_dai *simple_dai, struct asoc_simple_dai *simple_dai,
const char *name) const char *dai_name,
struct snd_soc_dai_link_component *dlc)
{ {
struct clk *clk; struct clk *clk;
u32 val; u32 val;
/*
* Use snd_soc_dai_link_component instead of legacy style.
* It is only for codec, but cpu will be supported in the future.
* see
* soc-core.c :: snd_soc_init_multicodec()
*/
if (dlc) {
dai_of_node = dlc->of_node;
dai_name = dlc->dai_name;
}
/* /*
* Parse dai->sysclk come from "clocks = <&xxx>" * Parse dai->sysclk come from "clocks = <&xxx>"
* (if system has common clock) * (if system has common clock)
...@@ -200,7 +212,7 @@ int asoc_simple_card_parse_clk(struct device *dev, ...@@ -200,7 +212,7 @@ int asoc_simple_card_parse_clk(struct device *dev,
if (of_property_read_bool(node, "system-clock-direction-out")) if (of_property_read_bool(node, "system-clock-direction-out"))
simple_dai->clk_direction = SND_SOC_CLOCK_OUT; simple_dai->clk_direction = SND_SOC_CLOCK_OUT;
dev_dbg(dev, "%s : sysclk = %d, direction %d\n", name, dev_dbg(dev, "%s : sysclk = %d, direction %d\n", dai_name,
simple_dai->sysclk, simple_dai->clk_direction); simple_dai->sysclk, simple_dai->clk_direction);
return 0; return 0;
...@@ -208,6 +220,7 @@ int asoc_simple_card_parse_clk(struct device *dev, ...@@ -208,6 +220,7 @@ int asoc_simple_card_parse_clk(struct device *dev,
EXPORT_SYMBOL_GPL(asoc_simple_card_parse_clk); EXPORT_SYMBOL_GPL(asoc_simple_card_parse_clk);
int asoc_simple_card_parse_dai(struct device_node *node, int asoc_simple_card_parse_dai(struct device_node *node,
struct snd_soc_dai_link_component *dlc,
struct device_node **dai_of_node, struct device_node **dai_of_node,
const char **dai_name, const char **dai_name,
const char *list_name, const char *list_name,
...@@ -220,6 +233,17 @@ int asoc_simple_card_parse_dai(struct device_node *node, ...@@ -220,6 +233,17 @@ int asoc_simple_card_parse_dai(struct device_node *node,
if (!node) if (!node)
return 0; return 0;
/*
* Use snd_soc_dai_link_component instead of legacy style.
* It is only for codec, but cpu will be supported in the future.
* see
* soc-core.c :: snd_soc_init_multicodec()
*/
if (dlc) {
dai_name = &dlc->dai_name;
dai_of_node = &dlc->of_node;
}
/* /*
* Get node via "sound-dai = <&phandle port>" * Get node via "sound-dai = <&phandle port>"
* it will be used as xxx_of_node on soc_bind_dai_link() * it will be used as xxx_of_node on soc_bind_dai_link()
...@@ -278,6 +302,7 @@ static int asoc_simple_card_get_dai_id(struct device_node *ep) ...@@ -278,6 +302,7 @@ static int asoc_simple_card_get_dai_id(struct device_node *ep)
} }
int asoc_simple_card_parse_graph_dai(struct device_node *ep, int asoc_simple_card_parse_graph_dai(struct device_node *ep,
struct snd_soc_dai_link_component *dlc,
struct device_node **dai_of_node, struct device_node **dai_of_node,
const char **dai_name) const char **dai_name)
{ {
...@@ -285,6 +310,17 @@ int asoc_simple_card_parse_graph_dai(struct device_node *ep, ...@@ -285,6 +310,17 @@ int asoc_simple_card_parse_graph_dai(struct device_node *ep,
struct of_phandle_args args; struct of_phandle_args args;
int ret; int ret;
/*
* Use snd_soc_dai_link_component instead of legacy style.
* It is only for codec, but cpu will be supported in the future.
* see
* soc-core.c :: snd_soc_init_multicodec()
*/
if (dlc) {
dai_name = &dlc->dai_name;
dai_of_node = &dlc->of_node;
}
if (!ep) if (!ep)
return 0; return 0;
if (!dai_name) if (!dai_name)
...@@ -374,6 +410,8 @@ int asoc_simple_card_clean_reference(struct snd_soc_card *card) ...@@ -374,6 +410,8 @@ int asoc_simple_card_clean_reference(struct snd_soc_card *card)
num_links++, dai_link++) { num_links++, dai_link++) {
of_node_put(dai_link->cpu_of_node); of_node_put(dai_link->cpu_of_node);
of_node_put(dai_link->codec_of_node); of_node_put(dai_link->codec_of_node);
if (dai_link->codecs)
of_node_put(dai_link->codecs->of_node);
} }
return 0; return 0;
} }
......
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