[alsa-devel] [PATCH v4 6/9] ASoC: add snd_soc_get_dai_id()

Rob Herring robh+dt at kernel.org
Mon Mar 20 21:20:29 CET 2017


On Mon, Mar 13, 2017 at 12:53 AM, Kuninori Morimoto
<kuninori.morimoto.gx at renesas.com> wrote:
>
> From: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
>
> ALSA SoC needs to know connected DAI ID for probing.
> On OF-graph case, basically we can check DT port location.
>
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
> ---
> v3 -> v4
>
>  - no change
>
>  include/sound/soc.h  |  1 +
>  sound/soc/soc-core.c | 23 +++++++++++++++++++++++
>  2 files changed, 24 insertions(+)
>
> diff --git a/include/sound/soc.h b/include/sound/soc.h
> index cdfb55f..ab4639e 100644
> --- a/include/sound/soc.h
> +++ b/include/sound/soc.h
> @@ -1664,6 +1664,7 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
>                                      const char *prefix,
>                                      struct device_node **bitclkmaster,
>                                      struct device_node **framemaster);
> +int snd_soc_get_dai_id(struct device_node *ep);
>  int snd_soc_get_dai_name(struct of_phandle_args *args,
>                          const char **dai_name);
>  int snd_soc_of_get_dai_name(struct device_node *of_node,
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index 175ade0..c91010d 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -34,6 +34,7 @@
>  #include <linux/ctype.h>
>  #include <linux/slab.h>
>  #include <linux/of.h>
> +#include <linux/of_graph.h>
>  #include <linux/dmi.h>
>  #include <sound/core.h>
>  #include <sound/jack.h>
> @@ -4040,6 +4041,28 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
>  }
>  EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt);
>
> +int snd_soc_get_dai_id(struct device_node *ep)

Shouldn't the DAI id be the index of the "dais" property?

> +{
> +       struct device_node *node;
> +       struct device_node *endpoint;
> +       int i, id;
> +
> +       node = of_graph_get_port_parent(ep);
> +
> +       i = 0;
> +       id = -1;
> +       for_each_endpoint_of_node(node, endpoint) {
> +               if (endpoint == ep)
> +                       id = i;

I don't see how this works when you have 1 DAI controller with
multiple endpoints versus multiple DAI controllers with a single
endpoint each. All the IDs will be 0 in the latter case.

> +               i++;
> +       }
> +       if (id < 0)
> +               return -ENODEV;
> +
> +       return id;
> +}
> +EXPORT_SYMBOL_GPL(snd_soc_get_dai_id);
> +
>  int snd_soc_get_dai_name(struct of_phandle_args *args,
>                                 const char **dai_name)
>  {
> --
> 1.9.1
>


More information about the Alsa-devel mailing list