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 <pa...@ucw.cz> 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; } -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/