mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									f853d6b3ba
								
							
						
					
					
						commit
						e664de680b
					
				
					 2 changed files with 58 additions and 11 deletions
				
			
		| 
						 | 
					@ -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,
 | 
				
			||||||
				  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,
 | 
				
			||||||
			       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,
 | 
				
			||||||
	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,
 | 
				
			||||||
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,
 | 
				
			||||||
	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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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,
 | 
				
			||||||
	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)
 | 
				
			||||||
	     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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue