diff mbox

[RFC,3/4] ASoC: Allow Aux Codecs to be specified using DT

Message ID 1382909086-10493-4-git-send-email-sre@debian.org (mailing list archive)
State New, archived
Headers show

Commit Message

Sebastian Reichel Oct. 27, 2013, 9:24 p.m. UTC
This patch adds support for specifying auxiliary codecs and
codec configuration via device tree phandles.

This change adds new fields to snd_soc_aux_dev and snd_soc_codec_conf
and adds support for the changes to SoC core methods.

Signed-off-by: Sebastian Reichel <sre@debian.org>
---
 include/sound/soc.h  | 13 +++++++++-
 sound/soc/soc-core.c | 68 ++++++++++++++++++++++++++++++++++++----------------
 2 files changed, 59 insertions(+), 22 deletions(-)

Comments

Mark Brown Oct. 28, 2013, 4:37 p.m. UTC | #1
On Sun, Oct 27, 2013 at 10:24:45PM +0100, Sebastian Reichel wrote:
> This patch adds support for specifying auxiliary codecs and
> codec configuration via device tree phandles.

This doesn't apply against current git, please check and resend.
Please also consider your CC list more carefully, there's an awful lot
of people on this...
Sebastian Reichel Oct. 28, 2013, 5:53 p.m. UTC | #2
On Mon, Oct 28, 2013 at 09:37:21AM -0700, Mark Brown wrote:
> On Sun, Oct 27, 2013 at 10:24:45PM +0100, Sebastian Reichel wrote:
> > This patch adds support for specifying auxiliary codecs and
> > codec configuration via device tree phandles.
> 
> This doesn't apply against current git, please check and resend.

Can you give me a git url to rebase against? I used current git
master from torvalds.

> Please also consider your CC list more carefully, there's an awful lot
> of people on this...

I added exactly those recipients, that were returned by
./scripts/get_maintainer.pl for the patchset.

The list of involved people is quite long, because the patchset
touches devicetree, documentation, boardcode, asoc and the specific
driver.

-- Sebastian
Mark Brown Oct. 28, 2013, 7:49 p.m. UTC | #3
On Mon, Oct 28, 2013 at 06:53:42PM +0100, Sebastian Reichel wrote:
> On Mon, Oct 28, 2013 at 09:37:21AM -0700, Mark Brown wrote:

> > This doesn't apply against current git, please check and resend.

> Can you give me a git url to rebase against? I used current git
> master from torvalds.

From MAINTAINERS:

SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
M:      Liam Girdwood <lgirdwood@gmail.com>
M:      Mark Brown <broonie@kernel.org>
T:      git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
L:      alsa-devel@alsa-project.org (moderated for non-subscribers)
W:      http://alsa-project.org/main/index.php/ASoC
S:      Supported
F:      Documentation/sound/alsa/soc/
F:      sound/soc/
F:      include/sound/soc*

> > Please also consider your CC list more carefully, there's an awful lot
> > of people on this...

> I added exactly those recipients, that were returned by
> ./scripts/get_maintainer.pl for the patchset.

> The list of involved people is quite long, because the patchset
> touches devicetree, documentation, boardcode, asoc and the specific
> driver.

You shouldn't be using the output of get_maintainers directly, you
should understand why everyone it's including is in the list and if they
really should be.  This is especially important if you are sending a
series that covers many subsystems, or nested subsystems.
Pavel Machek Nov. 6, 2013, 2:25 p.m. UTC | #4
Hi!

> This patch adds support for specifying auxiliary codecs and
> codec configuration via device tree phandles.
> 
> This change adds new fields to snd_soc_aux_dev and snd_soc_codec_conf
> and adds support for the changes to SoC core methods.
> 
> Signed-off-by: Sebastian Reichel <sre@debian.org>
> ---
>  include/sound/soc.h  | 13 +++++++++-
>  sound/soc/soc-core.c | 68 ++++++++++++++++++++++++++++++++++++----------------
>  2 files changed, 59 insertions(+), 22 deletions(-)

> @@ -1527,15 +1529,23 @@ static void soc_unregister_ac97_dai_link(struct snd_soc_codec *codec)
>  static int soc_check_aux_dev(struct snd_soc_card *card, int num)
>  {
>  	struct snd_soc_aux_dev *aux_dev = &card->aux_dev[num];
> +	const char *codecname = aux_dev->codec_name;
>  	struct snd_soc_codec *codec;
>  
>  	/* find CODEC from registered CODECs*/
>  	list_for_each_entry(codec, &codec_list, list) {
> -		if (!strcmp(codec->name, aux_dev->codec_name))
> +		if (aux_dev->codec_of_node &&
> +				codec->dev->of_node == aux_dev->codec_of_node)
> +			return 0;
> +		if (aux_dev->codec_name &&
> +				!strcmp(codec->name, aux_dev->codec_name))
>  			return 0;

You can use codecname here.

> -		if (!strcmp(codec->name, aux_dev->codec_name)) {
> -			if (codec->probed) {
> -				dev_err(codec->dev,
> -					"ASoC: codec already probed");
> -				ret = -EBUSY;
> -				goto out;
> -			}
> -			goto found;
> +		if (aux_dev->codec_of_node &&
> +				codec->dev->of_node != aux_dev->codec_of_node)
> +			continue;
> +		if (aux_dev->codec_name &&
> +				strcmp(codec->name, aux_dev->codec_name))
> +			continue;

So in (error) case of ! aux_dev->codec_of_node && ! aux_dev->codec_name 
we match first possible codec?

Given code similarity between this and the one above, should there be
helper function that does the comparison (or even walks the list)?

> @@ -1644,12 +1663,19 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
>  		/* check to see if we need to override the compress_type */
>  		for (i = 0; i < card->num_configs; ++i) {
>  			codec_conf = &card->codec_conf[i];
> -			if (!strcmp(codec->name, codec_conf->dev_name)) {
> -				compress_type = codec_conf->compress_type;
> -				if (compress_type && compress_type
> -				    != codec->compress_type)
> -					break;
> -			}
> +
> +			if (codec_conf->of_node &&
> +				codec->dev->of_node != codec_conf->of_node)
> +				continue;
> +
> +			if (codec_conf->dev_name &&
> +				strcmp(codec->name, codec_conf->dev_name))
> +				continue;
> +

..third copy of codec matching.

Thanks for doing all the good work,
									Pavel
diff mbox

Patch

diff --git a/include/sound/soc.h b/include/sound/soc.h
index d22cb0a..00b25a8 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -937,7 +937,12 @@  struct snd_soc_dai_link {
 };
 
 struct snd_soc_codec_conf {
+	/*
+	 * specify device either by device name, or by
+	 * DT/OF node, but not both.
+	 */
 	const char *dev_name;
+	const struct device_node *of_node;
 
 	/*
 	 * optional map of kcontrol, widget and path name prefixes that are
@@ -954,7 +959,13 @@  struct snd_soc_codec_conf {
 
 struct snd_soc_aux_dev {
 	const char *name;		/* Codec name */
-	const char *codec_name;		/* for multi-codec */
+
+	/*
+	 * specify multi-codec either by device name, or by
+	 * DT/OF node, but not both.
+	 */
+	const char *codec_name;
+	const struct device_node *codec_of_node;
 
 	/* codec/machine specific init - e.g. add machine controls */
 	int (*init)(struct snd_soc_dapm_context *dapm);
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 1a38be0..392f479 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -1085,10 +1085,12 @@  static void soc_set_name_prefix(struct snd_soc_card *card,
 
 	for (i = 0; i < card->num_configs; i++) {
 		struct snd_soc_codec_conf *map = &card->codec_conf[i];
-		if (map->dev_name && !strcmp(codec->name, map->dev_name)) {
-			codec->name_prefix = map->name_prefix;
-			break;
-		}
+		if (map->of_node && codec->dev->of_node != map->of_node)
+			continue;
+		if (map->dev_name && strcmp(codec->name, map->dev_name))
+			continue;
+		codec->name_prefix = map->name_prefix;
+		break;
 	}
 }
 
@@ -1527,15 +1529,23 @@  static void soc_unregister_ac97_dai_link(struct snd_soc_codec *codec)
 static int soc_check_aux_dev(struct snd_soc_card *card, int num)
 {
 	struct snd_soc_aux_dev *aux_dev = &card->aux_dev[num];
+	const char *codecname = aux_dev->codec_name;
 	struct snd_soc_codec *codec;
 
 	/* find CODEC from registered CODECs*/
 	list_for_each_entry(codec, &codec_list, list) {
-		if (!strcmp(codec->name, aux_dev->codec_name))
+		if (aux_dev->codec_of_node &&
+				codec->dev->of_node == aux_dev->codec_of_node)
+			return 0;
+		if (aux_dev->codec_name &&
+				!strcmp(codec->name, aux_dev->codec_name))
 			return 0;
 	}
 
-	dev_err(card->dev, "ASoC: %s not registered\n", aux_dev->codec_name);
+	if (aux_dev->codec_of_node)
+		codecname = of_node_full_name(aux_dev->codec_of_node);
+
+	dev_err(card->dev, "ASoC: %s not registered\n", codecname);
 
 	return -EPROBE_DEFER;
 }
@@ -1544,22 +1554,31 @@  static int soc_probe_aux_dev(struct snd_soc_card *card, int num)
 {
 	struct snd_soc_aux_dev *aux_dev = &card->aux_dev[num];
 	struct snd_soc_codec *codec;
+	const char *codecname = aux_dev->codec_name;
 	int ret = -ENODEV;
 
 	/* find CODEC from registered CODECs*/
 	list_for_each_entry(codec, &codec_list, list) {
-		if (!strcmp(codec->name, aux_dev->codec_name)) {
-			if (codec->probed) {
-				dev_err(codec->dev,
-					"ASoC: codec already probed");
-				ret = -EBUSY;
-				goto out;
-			}
-			goto found;
+		if (aux_dev->codec_of_node &&
+				codec->dev->of_node != aux_dev->codec_of_node)
+			continue;
+		if (aux_dev->codec_name &&
+				strcmp(codec->name, aux_dev->codec_name))
+			continue;
+
+		if (codec->probed) {
+			dev_err(codec->dev, "ASoC: codec already probed");
+			ret = -EBUSY;
+			goto out;
 		}
+		goto found;
 	}
+
+	if (aux_dev->codec_of_node)
+		codecname = of_node_full_name(aux_dev->codec_of_node);
+
 	/* codec not found */
-	dev_err(card->dev, "ASoC: codec %s not found", aux_dev->codec_name);
+	dev_err(card->dev, "ASoC: codec %s not found", codecname);
 	return -EPROBE_DEFER;
 
 found:
@@ -1644,12 +1663,19 @@  static int snd_soc_instantiate_card(struct snd_soc_card *card)
 		/* check to see if we need to override the compress_type */
 		for (i = 0; i < card->num_configs; ++i) {
 			codec_conf = &card->codec_conf[i];
-			if (!strcmp(codec->name, codec_conf->dev_name)) {
-				compress_type = codec_conf->compress_type;
-				if (compress_type && compress_type
-				    != codec->compress_type)
-					break;
-			}
+
+			if (codec_conf->of_node &&
+				codec->dev->of_node != codec_conf->of_node)
+				continue;
+
+			if (codec_conf->dev_name &&
+				strcmp(codec->name, codec_conf->dev_name))
+				continue;
+
+			compress_type = codec_conf->compress_type;
+			if (compress_type && compress_type
+			    != codec->compress_type)
+				break;
 		}
 		ret = snd_soc_init_codec_cache(codec, compress_type);
 		if (ret < 0)