All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ASoC:simple-card: Add multi-CODEC support
@ 2014-09-10 11:28 Jean-Francois Moine
  0 siblings, 0 replies; 5+ messages in thread
From: Jean-Francois Moine @ 2014-09-10 11:28 UTC (permalink / raw)
  To: Mark Brown
  Cc: alsa-devel, Xiubo Li, Jyri Sarha, Benoit Cousson,
	Kuninori Morimoto

This patch adds multi-CODEC support to the simple-card.

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
---
 .../devicetree/bindings/sound/simple-card.txt      | 28 +++++++--------
 sound/soc/generic/simple-card.c                    | 41 +++++++++++++++++++++-
 2 files changed, 52 insertions(+), 17 deletions(-)

diff --git a/Documentation/devicetree/bindings/sound/simple-card.txt b/Documentation/devicetree/bindings/sound/simple-card.txt
index c2e9841..c217687 100644
--- a/Documentation/devicetree/bindings/sound/simple-card.txt
+++ b/Documentation/devicetree/bindings/sound/simple-card.txt
@@ -37,6 +37,8 @@ Required dai-link subnodes:
 
 - cpu					: CPU   sub-node
 - codec					: CODEC sub-node
+					  In case of multi-CODECs, there may
+					  be many of such sub-nodes.
 
 Optional dai-link subnode properties:
 
@@ -115,37 +117,31 @@ sh_fsi2: sh_fsi2@ec230000 {
 	interrupts = <0 146 0x4>;
 };
 
-Example 2 - many DAI links:
+Example 2 - many DAI links and multi-CODECs:
 
 sound {
 	compatible = "simple-audio-card";
 	simple-audio-card,name = "Cubox Audio";
 
-	simple-audio-card,dai-link@0 {		/* I2S - HDMI */
+	simple-audio-card,dai-link@0 {		/* S/PDIF - HDMI & S/PDIF */
 		format = "i2s";
 		cpu {
-			sound-dai = <&audio1 0>;
-		};
-		codec {
-			sound-dai = <&tda998x 0>;
-		};
-	};
-
-	simple-audio-card,dai-link@1 {		/* S/PDIF - HDMI */
-		cpu {
 			sound-dai = <&audio1 1>;
 		};
-		codec {
-			sound-dai = <&tda998x 1>;
+		codec@0 {
+			sound-dai = <&hdmi 0>;
+		};
+		codec@1 {
+			sound-dai = <&spdif_codec>;
 		};
 	};
 
-	simple-audio-card,dai-link@2 {		/* S/PDIF - S/PDIF */
+	simple-audio-card,dai-link@1 {		/* I2S - HDMI */
 		cpu {
-			sound-dai = <&audio1 1>;
+			sound-dai = <&audio1 0>;
 		};
 		codec {
-			sound-dai = <&spdif_codec>;
+			sound-dai = <&hdmi 1>;
 		};
 	};
 };
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index 4053152..bf0ce08 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -179,11 +179,12 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
 	struct device_node *np = NULL;
 	struct device_node *bitclkmaster = NULL;
 	struct device_node *framemaster = NULL;
+	struct snd_soc_dai_link_component *component;
 	unsigned int daifmt;
 	char *name;
 	char prop[128];
 	char *prefix = "";
-	int ret, cpu_args;
+	int ret, cpu_args, num_codec_dais;
 
 	/* For single DAI link & old style of DT node */
 	if (is_top_level_node)
@@ -225,7 +226,16 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
 	}
 
 	of_node_put(np);
+
+	/* count the number of codec DAIs */
 	snprintf(prop, sizeof(prop), "%scodec", prefix);
+	num_codec_dais = 0;
+	for_each_child_of_node(node, np) {
+		if (strcmp(np->name, prop) == 0)
+			num_codec_dais++;
+	}
+
+	/* treat the first DAI */
 	np = of_get_child_by_name(node, prop);
 	if (!np) {
 		ret = -EINVAL;
@@ -307,6 +317,35 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
 	if (!cpu_args)
 		dai_link->cpu_dai_name = NULL;
 
+	/* handle multi-codec DAIs */
+	if (num_codec_dais == 1)
+		goto out;
+	dai_link->codecs = component =
+			   devm_kzalloc(dev,
+					sizeof *component * num_codec_dais,
+					GFP_KERNEL);
+	dai_link->num_codecs = num_codec_dais;
+	component->of_node = dai_link->codec_of_node;
+	dai_link->codec_of_node = NULL;
+	component->dai_name = dai_link->codec_dai_name;
+	dai_link->codec_dai_name = NULL;
+	for (;;) {
+		np = of_get_next_child(node, np);
+		if (!np)
+			break;
+		component++;
+		component->of_node = of_parse_phandle(np, "sound-dai", 0);
+		if (!component->of_node) {
+			ret = -ENODEV;
+			dev_err(dev, "Bad sound-dai\n");
+			goto dai_link_of_err;
+		}
+		ret = snd_soc_of_get_dai_name(np, &component->dai_name);
+		if (ret < 0)
+			goto dai_link_of_err;
+	}
+
+out:
 dai_link_of_err:
 	if (np)
 		of_node_put(np);
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] ASoC:simple-card: Add multi-CODEC support
       [not found] <54103671.c36bb40a.2743.ffff969aSMTPIN_ADDED_MISSING@mx.google.com>
@ 2014-09-10 11:43 ` Benoit Cousson
  2014-09-10 16:06   ` Jean-Francois Moine
  0 siblings, 1 reply; 5+ messages in thread
From: Benoit Cousson @ 2014-09-10 11:43 UTC (permalink / raw)
  To: Jean-Francois Moine, Mark Brown
  Cc: alsa-devel, Xiubo Li, Kuninori Morimoto, Jyri Sarha

Hi Jean-Francois,

On 10/09/2014 13:28, Jean-Francois Moine wrote:
> This patch adds multi-CODEC support to the simple-card.
>
> Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
> ---
>   .../devicetree/bindings/sound/simple-card.txt      | 28 +++++++--------
>   sound/soc/generic/simple-card.c                    | 41 +++++++++++++++++++++-
>   2 files changed, 52 insertions(+), 17 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/sound/simple-card.txt b/Documentation/devicetree/bindings/sound/simple-card.txt
> index c2e9841..c217687 100644
> --- a/Documentation/devicetree/bindings/sound/simple-card.txt
> +++ b/Documentation/devicetree/bindings/sound/simple-card.txt
> @@ -37,6 +37,8 @@ Required dai-link subnodes:
>
>   - cpu					: CPU   sub-node
>   - codec					: CODEC sub-node
> +					  In case of multi-CODECs, there may
> +					  be many of such sub-nodes.
>
>   Optional dai-link subnode properties:
>
> @@ -115,37 +117,31 @@ sh_fsi2: sh_fsi2@ec230000 {
>   	interrupts = <0 146 0x4>;
>   };
>
> -Example 2 - many DAI links:
> +Example 2 - many DAI links and multi-CODECs:
>
>   sound {
>   	compatible = "simple-audio-card";
>   	simple-audio-card,name = "Cubox Audio";
>
> -	simple-audio-card,dai-link@0 {		/* I2S - HDMI */
> +	simple-audio-card,dai-link@0 {		/* S/PDIF - HDMI & S/PDIF */
>   		format = "i2s";
>   		cpu {
> -			sound-dai = <&audio1 0>;
> -		};
> -		codec {
> -			sound-dai = <&tda998x 0>;
> -		};
> -	};
> -
> -	simple-audio-card,dai-link@1 {		/* S/PDIF - HDMI */
> -		cpu {
>   			sound-dai = <&audio1 1>;
>   		};
> -		codec {
> -			sound-dai = <&tda998x 1>;
> +		codec@0 {
> +			sound-dai = <&hdmi 0>;
> +		};
> +		codec@1 {
> +			sound-dai = <&spdif_codec>;
>   		};

I don't have strong opinion on that, but in my case, I was considering 
using a simple list instead of several nodes.
I don't like having to add fake address just to ensure uniqueness.

Something like that:

  sound-dais = <&spdif_codec 1>, <&hdmi 0>;

That being said, it will require changing the name with a plural form, 
and ensuring we have the same number of parameters for each codec.

That was just my .2 cents.

Regards,
Benoit



>   	};
>
> -	simple-audio-card,dai-link@2 {		/* S/PDIF - S/PDIF */
> +	simple-audio-card,dai-link@1 {		/* I2S - HDMI */
>   		cpu {
> -			sound-dai = <&audio1 1>;
> +			sound-dai = <&audio1 0>;
>   		};
>   		codec {
> -			sound-dai = <&spdif_codec>;
> +			sound-dai = <&hdmi 1>;
>   		};
>   	};
>   };
> diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
> index 4053152..bf0ce08 100644
> --- a/sound/soc/generic/simple-card.c
> +++ b/sound/soc/generic/simple-card.c
> @@ -179,11 +179,12 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
>   	struct device_node *np = NULL;
>   	struct device_node *bitclkmaster = NULL;
>   	struct device_node *framemaster = NULL;
> +	struct snd_soc_dai_link_component *component;
>   	unsigned int daifmt;
>   	char *name;
>   	char prop[128];
>   	char *prefix = "";
> -	int ret, cpu_args;
> +	int ret, cpu_args, num_codec_dais;
>
>   	/* For single DAI link & old style of DT node */
>   	if (is_top_level_node)
> @@ -225,7 +226,16 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
>   	}
>
>   	of_node_put(np);
> +
> +	/* count the number of codec DAIs */
>   	snprintf(prop, sizeof(prop), "%scodec", prefix);
> +	num_codec_dais = 0;
> +	for_each_child_of_node(node, np) {
> +		if (strcmp(np->name, prop) == 0)
> +			num_codec_dais++;
> +	}
> +
> +	/* treat the first DAI */
>   	np = of_get_child_by_name(node, prop);
>   	if (!np) {
>   		ret = -EINVAL;
> @@ -307,6 +317,35 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
>   	if (!cpu_args)
>   		dai_link->cpu_dai_name = NULL;
>
> +	/* handle multi-codec DAIs */
> +	if (num_codec_dais == 1)
> +		goto out;
> +	dai_link->codecs = component =
> +			   devm_kzalloc(dev,
> +					sizeof *component * num_codec_dais,
> +					GFP_KERNEL);
> +	dai_link->num_codecs = num_codec_dais;
> +	component->of_node = dai_link->codec_of_node;
> +	dai_link->codec_of_node = NULL;
> +	component->dai_name = dai_link->codec_dai_name;
> +	dai_link->codec_dai_name = NULL;
> +	for (;;) {
> +		np = of_get_next_child(node, np);
> +		if (!np)
> +			break;
> +		component++;
> +		component->of_node = of_parse_phandle(np, "sound-dai", 0);
> +		if (!component->of_node) {
> +			ret = -ENODEV;
> +			dev_err(dev, "Bad sound-dai\n");
> +			goto dai_link_of_err;
> +		}
> +		ret = snd_soc_of_get_dai_name(np, &component->dai_name);
> +		if (ret < 0)
> +			goto dai_link_of_err;
> +	}
> +
> +out:
>   dai_link_of_err:
>   	if (np)
>   		of_node_put(np);
>


-- 
Benoît Cousson
BayLibre
Embedded Linux Technology Lab
www.baylibre.com

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] ASoC:simple-card: Add multi-CODEC support
  2014-09-10 11:43 ` [PATCH] ASoC:simple-card: Add multi-CODEC support Benoit Cousson
@ 2014-09-10 16:06   ` Jean-Francois Moine
  2014-09-10 16:27     ` Benoit Cousson
  0 siblings, 1 reply; 5+ messages in thread
From: Jean-Francois Moine @ 2014-09-10 16:06 UTC (permalink / raw)
  To: Benoit Cousson
  Cc: Xiubo Li, alsa-devel, Mark Brown, Kuninori Morimoto, Jyri Sarha

On Wed, 10 Sep 2014 13:43:06 +0200
Benoit Cousson <bcousson@baylibre.com> wrote:

> > +		codec@0 {
> > +			sound-dai = <&hdmi 0>;
> > +		};
> > +		codec@1 {
> > +			sound-dai = <&spdif_codec>;
> >   		};  
> 
> I don't have strong opinion on that, but in my case, I was considering 
> using a simple list instead of several nodes.
> I don't like having to add fake address just to ensure uniqueness.
> 
> Something like that:
> 
>   sound-dais = <&spdif_codec 1>, <&hdmi 0>;

You are right, this would be simpler (I did not see that there could be
phandle's with different cell sizes in a list).

> That being said, it will require changing the name with a plural form, 
> and ensuring we have the same number of parameters for each codec.

But I don't think that changing the name could be useful: the treatment
is exactly the same and, as a result, all CODEC DAIs go to the DAI
list of the DAI link.

-- 
Ken ar c'hentañ	|	      ** Breizh ha Linux atav! **
Jef		|		http://moinejf.free.fr/
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] ASoC:simple-card: Add multi-CODEC support
  2014-09-10 16:06   ` Jean-Francois Moine
@ 2014-09-10 16:27     ` Benoit Cousson
  2014-09-10 17:25       ` Jean-Francois Moine
  0 siblings, 1 reply; 5+ messages in thread
From: Benoit Cousson @ 2014-09-10 16:27 UTC (permalink / raw)
  To: Jean-Francois Moine
  Cc: Xiubo Li, alsa-devel, Mark Brown, Kuninori Morimoto, Jyri Sarha

On 10/09/2014 18:06, Jean-Francois Moine wrote:
> On Wed, 10 Sep 2014 13:43:06 +0200
> Benoit Cousson <bcousson@baylibre.com> wrote:
>
>>> +		codec@0 {
>>> +			sound-dai = <&hdmi 0>;
>>> +		};
>>> +		codec@1 {
>>> +			sound-dai = <&spdif_codec>;
>>>    		};
>>
>> I don't have strong opinion on that, but in my case, I was considering
>> using a simple list instead of several nodes.
>> I don't like having to add fake address just to ensure uniqueness.
>>
>> Something like that:
>>
>>    sound-dais = <&spdif_codec 1>, <&hdmi 0>;
>
> You are right, this would be simpler (I did not see that there could be
> phandle's with different cell sizes in a list).

In fact you cannot, that why I added the same number of parameters for 
both.

For DT, it is just a list of elements, it could be encoded like that:
<&spdif_codec 1 &hdmi 0>;

At the end it will be a list of u32 inside the dtb.

BTW, what is that extra parameter after the phandle? I cannot find any 
reference of that inside the Documentation.

If we need to have a random number of parameters after the code-dai 
phandle, we couldn't use that list.

>> That being said, it will require changing the name with a plural form,
>> and ensuring we have the same number of parameters for each codec.
>
> But I don't think that changing the name could be useful: the treatment
> is exactly the same and, as a result, all CODEC DAIs go to the DAI
> list of the DAI link.

Yeah, maybe not that useful, but that was just to be aligned with 
similar cases in DT bindings. Like gpios, interrupts...


Regards,
Benoit


-- 
Benoît Cousson
BayLibre
Embedded Linux Technology Lab
www.baylibre.com
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] ASoC:simple-card: Add multi-CODEC support
  2014-09-10 16:27     ` Benoit Cousson
@ 2014-09-10 17:25       ` Jean-Francois Moine
  0 siblings, 0 replies; 5+ messages in thread
From: Jean-Francois Moine @ 2014-09-10 17:25 UTC (permalink / raw)
  To: Benoit Cousson
  Cc: Xiubo Li, alsa-devel, Mark Brown, Kuninori Morimoto, Jyri Sarha

On Wed, 10 Sep 2014 18:27:26 +0200
Benoit Cousson <bcousson@baylibre.com> wrote:

> >> I don't have strong opinion on that, but in my case, I was considering
> >> using a simple list instead of several nodes.
> >> I don't like having to add fake address just to ensure uniqueness.
> >>
> >> Something like that:
> >>
> >>    sound-dais = <&spdif_codec 1>, <&hdmi 0>;  
> >
> > You are right, this would be simpler (I did not see that there could be
> > phandle's with different cell sizes in a list).  
> 
> In fact you cannot, that why I added the same number of parameters for 
> both.
> 
> For DT, it is just a list of elements, it could be encoded like that:
> <&spdif_codec 1 &hdmi 0>;
> 
> At the end it will be a list of u32 inside the dtb.

Yes, but __of_parse_phandle_with_args() handles the number of cells of the phandle.

> BTW, what is that extra parameter after the phandle? I cannot find any 
> reference of that inside the Documentation.

It is the DAI number inside the CODEC. The TDA998x CODEC has two DAIs,
S/PDIF and I2S.

> If we need to have a random number of parameters after the code-dai 
> phandle, we couldn't use that list.
> 
> >> That being said, it will require changing the name with a plural form,
> >> and ensuring we have the same number of parameters for each codec.  
> >
> > But I don't think that changing the name could be useful: the treatment
> > is exactly the same and, as a result, all CODEC DAIs go to the DAI
> > list of the DAI link.  
> 
> Yeah, maybe not that useful, but that was just to be aligned with 
> similar cases in DT bindings. Like gpios, interrupts...

Not easy! "sound-dai" is used for both the CPU and CODEC DAIs.
Adding "sound-dais" for just the CODEC DAIs would complexify the
simple-card logic...

-- 
Ken ar c'hentañ	|	      ** Breizh ha Linux atav! **
Jef		|		http://moinejf.free.fr/
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-09-10 17:23 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <54103671.c36bb40a.2743.ffff969aSMTPIN_ADDED_MISSING@mx.google.com>
2014-09-10 11:43 ` [PATCH] ASoC:simple-card: Add multi-CODEC support Benoit Cousson
2014-09-10 16:06   ` Jean-Francois Moine
2014-09-10 16:27     ` Benoit Cousson
2014-09-10 17:25       ` Jean-Francois Moine
2014-09-10 11:28 Jean-Francois Moine

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.