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: 3152311 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 DE5709F461 for ; Thu, 7 Nov 2013 12:27:33 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BCB8F20253 for ; Thu, 7 Nov 2013 12:27:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8D82720160 for ; Thu, 7 Nov 2013 12:27:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752207Ab3KGM1A (ORCPT ); Thu, 7 Nov 2013 07:27:00 -0500 Received: from atrey.karlin.mff.cuni.cz ([195.113.26.193]:47130 "EHLO atrey.karlin.mff.cuni.cz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750964Ab3KGM06 (ORCPT ); Thu, 7 Nov 2013 07:26:58 -0500 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 Cc: Sebastian Reichel , Peter Ujfalusi , 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 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) Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, 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; }