lkml.org 
[lkml]   [2013]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[RFC 3/4] ASoC: Allow Aux Codecs to be specified using DT
Date
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(-)

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)
--
1.8.4.rc3


\
 
 \ /
  Last update: 2013-10-27 22:41    [W:0.130 / U:3.848 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site