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@xxxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html