From patchwork Thu Nov 7 12:26:55 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Machek X-Patchwork-Id: 3152321 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id E10EBBEEB2 for ; Thu, 7 Nov 2013 12:27:36 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C04FF204DE for ; Thu, 7 Nov 2013 12:27:35 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6867220253 for ; Thu, 7 Nov 2013 12:27:34 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1VeOgH-0002qn-OY; Thu, 07 Nov 2013 12:27:25 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1VeOgF-0005nO-9X; Thu, 07 Nov 2013 12:27:23 +0000 Received: from atrey.karlin.mff.cuni.cz ([195.113.26.193]) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1VeOgC-0005m3-8z for linux-arm-kernel@lists.infradead.org; Thu, 07 Nov 2013 12:27:21 +0000 Received: by atrey.karlin.mff.cuni.cz (Postfix, from userid 512) id B8DE881666; Thu, 7 Nov 2013 13:26:57 +0100 (CET) Date: Thu, 7 Nov 2013 13:26:55 +0100 From: Pavel Machek To: Sebastian Reichel Subject: Re: [RFC 3/4] ASoC: Allow Aux Codecs to be specified using DT Message-ID: <20131107122655.GA7110@amd.pavel.ucw.cz> References: <1382909086-10493-1-git-send-email-sre@debian.org> <1382909086-10493-4-git-send-email-sre@debian.org> <20131106142559.GC15551@amd.pavel.ucw.cz> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20131106142559.GC15551@amd.pavel.ucw.cz> User-Agent: Mutt/1.5.20 (2009-06-14) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20131107_072720_568564_3C8B8AB4 X-CRM114-Status: GOOD ( 17.99 ) X-Spam-Score: -1.9 (-) Cc: Mark Rutland , alsa-devel@alsa-project.org, linux-doc@vger.kernel.org, Tony Lindgren , Linus Walleij , Liam Girdwood , Peter Ujfalusi , linux-omap@vger.kernel.org, Russell King , Sebastian Reichel , Ian Campbell , Takashi Iwai , Grant Likely , devicetree@vger.kernel.org, Pawel Moll , Stephen Warren , Rob Herring , Mark Brown , Jaroslav Kysela , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Rob Landley , Jarkko Nikula X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hi! > 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)? Something like this? soc_probe_aux_dev now looks better... (Only compile tested). Signed-off-by: Pavel Machek diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 392f479..3097e17 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -1526,69 +1526,65 @@ static void soc_unregister_ac97_dai_link(struct snd_soc_codec *codec) } #endif -static int soc_check_aux_dev(struct snd_soc_card *card, int num) +struct snd_soc_codec *soc_find_matching_codec(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*/ + /* find CODEC from registered CODECs */ list_for_each_entry(codec, &codec_list, list) { - 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; + 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; + return codec; } + return NULL; +} +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 = soc_find_matching_codec(card, num); + + if (codec) + return 0; 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; } + 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; + struct snd_soc_codec *codec = soc_find_matching_codec(card, num); - /* find CODEC from registered CODECs*/ - list_for_each_entry(codec, &codec_list, list) { - 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) { + if (aux_dev->codec_of_node) + codecname = of_node_full_name(aux_dev->codec_of_node); - if (codec->probed) { - dev_err(codec->dev, "ASoC: codec already probed"); - ret = -EBUSY; - goto out; - } - goto found; + /* codec not found */ + dev_err(card->dev, "ASoC: codec %s not found", codecname); + return -EPROBE_DEFER; } - 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", codecname); - return -EPROBE_DEFER; + if (codec->probed) { + dev_err(codec->dev, "ASoC: codec already probed"); + return -EBUSY; + } -found: ret = soc_probe_codec(card, codec); if (ret < 0) return ret; ret = soc_post_component_init(card, codec, num, 1); - -out: return ret; }