From patchwork Sun Oct 27 21:24:45 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Reichel X-Patchwork-Id: 3099911 Return-Path: X-Original-To: patchwork-linux-omap@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 7FA469F431 for ; Sun, 27 Oct 2013 21:26:00 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 96B2D20322 for ; Sun, 27 Oct 2013 21:25:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 97C062032D for ; Sun, 27 Oct 2013 21:25:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754993Ab3J0VZO (ORCPT ); Sun, 27 Oct 2013 17:25:14 -0400 Received: from ring0.de ([91.143.88.219]:60028 "EHLO smtp.ring0.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754971Ab3J0VZJ (ORCPT ); Sun, 27 Oct 2013 17:25:09 -0400 Received: from comu.ring0.de (unknown [127.0.0.1]) by smtp.ring0.de (Postfix) with ESMTP id 40A9E2C58EE6; Sun, 27 Oct 2013 22:25:08 +0100 (CET) Received: (from spamd@localhost) by comu.ring0.de (8.13.8/8.13.8/Submit) id r9RLP60O028468; Sun, 27 Oct 2013 22:25:06 +0100 X-Authentication-Warning: comu.ring0.de: spamd set sender to sre@ring0.de using -f X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 From: Sebastian Reichel To: Sebastian Reichel , Peter Ujfalusi Cc: Rob Herring , Pawel Moll , Mark Rutland , Stephen Warren , Ian Campbell , Rob Landley , Tony Lindgren , Russell King , Jaroslav Kysela , Takashi Iwai , Liam Girdwood , Mark Brown , Jarkko Nikula , Grant Likely , Linus Walleij , devicetree@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-omap@vger.kernel.org, alsa-devel@alsa-project.org, Sebastian Reichel Subject: [RFC 3/4] ASoC: Allow Aux Codecs to be specified using DT Date: Sun, 27 Oct 2013 22:24:45 +0100 Message-Id: <1382909086-10493-4-git-send-email-sre@debian.org> X-Mailer: git-send-email 1.8.4.rc3 In-Reply-To: <1382909086-10493-1-git-send-email-sre@debian.org> References: <1382909086-10493-1-git-send-email-sre@debian.org> Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 --- 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)