Commit 1d768989 authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown

ASoC: soc-core: allow no Platform on dai_link

dai_link is used to selecting Component (= CPU/Codec/Platform) and
DAI (= CPU/Codec). And selected CPU/Codec/Platform components are
*listed* on Card.

Many drivers don't need special Platform component, but was
mandatory at legacy style ALSA SoC.
Thus, there is this kind of settings on many drivers.

	dai_link->platform_of_node = dai_link->cpu_of_node;

In this case, soc_bind_dai_link() will pick-up "CPU component" as
"Platform component", and try to add it to snd_soc_pcm_runtime.
But it will be ignored, because it is already added when CPU bindings.

Historically, this kind of "CPU component" is used/selected as
"Platform" on many ALSA SoC drivers.
OTOH, Dummy Platform will be selected automatically by ALSA SoC if
driver doesn't have Platform settings.

These indicates that there are 2 type of Platforms exist at current
ALSA SoC if driver doesn't need special Platform.

	1) use Dummy Platform as Platform component
	2) use CPU component  as Platform component

ALSA SoC will call Dummy Platform callback function if it is using
Dummy Platform, but it is completely pointless. Because it is the
sound card which doesn't need special Platform.

Thus, the behavior we request to ALSA SoC is selecting 2) automatically
instead of 1) if sound card doesn't need special Platform.
And, 2) means "do nothing" as above explain.

These were needed at legacy style dai_link, but is no longer needed
at modern style dai_link anymore.

This patch allows "no Platform" settings on dai_link, and will do
nothing for it if there was no platform settings. This is same as 2).

By this patch, all drivers which is selecting "CPU component" as
"Platform" can remove such settings.
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent df9091e9
...@@ -926,7 +926,7 @@ struct snd_soc_dai_link { ...@@ -926,7 +926,7 @@ struct snd_soc_dai_link {
/* /*
* You MAY specify the link's platform/PCM/DMA driver, either by * You MAY specify the link's platform/PCM/DMA driver, either by
* device name, or by DT/OF node, but not both. Some forms of link * device name, or by DT/OF node, but not both. Some forms of link
* do not need a platform. * do not need a platform. In such case, platforms are not mandatory.
*/ */
struct snd_soc_dai_link_component *platforms; struct snd_soc_dai_link_component *platforms;
unsigned int num_platforms; unsigned int num_platforms;
......
...@@ -788,6 +788,9 @@ static int snd_soc_is_matching_component( ...@@ -788,6 +788,9 @@ static int snd_soc_is_matching_component(
{ {
struct device_node *component_of_node; struct device_node *component_of_node;
if (!dlc)
return 0;
component_of_node = soc_component_to_node(component); component_of_node = soc_component_to_node(component);
if (dlc->of_node && component_of_node != dlc->of_node) if (dlc->of_node && component_of_node != dlc->of_node)
...@@ -1053,20 +1056,12 @@ static void soc_remove_dai_links(struct snd_soc_card *card) ...@@ -1053,20 +1056,12 @@ static void soc_remove_dai_links(struct snd_soc_card *card)
} }
} }
static struct snd_soc_dai_link_component dummy_link = COMP_DUMMY();
static int soc_init_dai_link(struct snd_soc_card *card, static int soc_init_dai_link(struct snd_soc_card *card,
struct snd_soc_dai_link *link) struct snd_soc_dai_link *link)
{ {
int i; int i;
struct snd_soc_dai_link_component *codec; struct snd_soc_dai_link_component *codec;
/* default Platform */
if (!link->platforms || !link->num_platforms) {
link->platforms = &dummy_link;
link->num_platforms = 1;
}
for_each_link_codecs(link, i, codec) { for_each_link_codecs(link, i, codec) {
/* /*
* Codec must be specified by 1 of name or OF node, * Codec must be specified by 1 of name or OF node,
...@@ -1086,7 +1081,16 @@ static int soc_init_dai_link(struct snd_soc_card *card, ...@@ -1086,7 +1081,16 @@ static int soc_init_dai_link(struct snd_soc_card *card,
} }
} }
/* FIXME */ /*
* Platform may be specified by either name or OF node,
* or no Platform.
*
* FIXME
*
* We need multi-platform support
*/
if (link->num_platforms > 0) {
if (link->num_platforms > 1) { if (link->num_platforms > 1) {
dev_err(card->dev, dev_err(card->dev,
"ASoC: multi platform is not yet supported %s\n", "ASoC: multi platform is not yet supported %s\n",
...@@ -1094,10 +1098,6 @@ static int soc_init_dai_link(struct snd_soc_card *card, ...@@ -1094,10 +1098,6 @@ static int soc_init_dai_link(struct snd_soc_card *card,
return -EINVAL; return -EINVAL;
} }
/*
* Platform may be specified by either name or OF node, but
* can be left unspecified, and a dummy platform will be used.
*/
if (link->platforms->name && link->platforms->of_node) { if (link->platforms->name && link->platforms->of_node) {
dev_err(card->dev, dev_err(card->dev,
"ASoC: Both platform name/of_node are set for %s\n", "ASoC: Both platform name/of_node are set for %s\n",
...@@ -1106,12 +1106,14 @@ static int soc_init_dai_link(struct snd_soc_card *card, ...@@ -1106,12 +1106,14 @@ static int soc_init_dai_link(struct snd_soc_card *card,
} }
/* /*
* Defer card registartion if platform dai component is not added to * Defer card registartion if platform dai component is not
* component list. * added to component list.
*/ */
if ((link->platforms->of_node || link->platforms->name) && if ((link->platforms->of_node || link->platforms->name) &&
!soc_find_component(link->platforms->of_node, link->platforms->name)) !soc_find_component(link->platforms->of_node,
link->platforms->name))
return -EPROBE_DEFER; return -EPROBE_DEFER;
}
/* FIXME */ /* FIXME */
if (link->num_cpus > 1) { if (link->num_cpus > 1) {
......
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