From nobody Sun Feb 8 21:47:01 2026 Received: from sender-op-o19.zoho.eu (sender-op-o19.zoho.eu [136.143.169.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2849727A133 for ; Mon, 12 Jan 2026 23:21:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=136.143.169.19 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768260063; cv=fail; b=tDFjE/++FqNhczhx57v1kpAzkSQ4D+gt4kuxjg0knXs8Ui48chRj96HRU2y4pt/i85LxU/dHl4GYy5CeSnO5yLTh3W1dP0YoCLcV4krCf0kpV53IHYQ6StPe2GZy1cpujCCINRAnM4aqV4aW02+xTPleVODCWd7lNUs9MwcGuKU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768260063; c=relaxed/simple; bh=PCAKehK5DUOMZd9Bs/gTSisjiCfPa1eVvcAGKnLbpB8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=c6TjPq0RwPwy73nmckK0H2MeONQKG+F7lnmmAdjCrRLwpk8wSafBxA4H501VWUgOHy7X3Acrv/Bazyf6GGxQBtibePlulyUC4hg2zeWWvdN5jshMIvkDeILs4tYXwIPA2O6dXfgSsADrIGpJZllCN25G0t9V15L6WbEVM210/aQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redaril.me; spf=pass smtp.mailfrom=redaril.me; dkim=pass (1024-bit key) header.d=redaril.me header.i=development@redaril.me header.b=NWUhyFgn; arc=fail smtp.client-ip=136.143.169.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redaril.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redaril.me Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redaril.me header.i=development@redaril.me header.b="NWUhyFgn" ARC-Seal: i=1; a=rsa-sha256; t=1768260029; cv=none; d=zohomail.eu; s=zohoarc; b=araiHaMRmm4ZuBcH7YAZrBpzPlOqWDTwy97dM/lkk+eEsjZXy6djk3GnMdZvUZ0/CXnwEZfu2znKZsh1pKl2TB1VtidLPHX+464749hLXnN38Yy7AFwQHVgOCKDjVpO9GdrUGndRIKDdbRj/kmDU0LkbPHmPo+tq+CJprD9mA70= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1768260029; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:Message-Id:Reply-To:To; bh=0p2baUfPXG8dXJs3hoBkprKJUvk/AjdNX0qpZhHQNbE=; b=dC0DdN1oECfxGN39eKeFD9M/g+FQqT2VzJ2Us5XLnZk1LITYfkw2oqqMLMjlWFNOOLZoZSVNIMdGt2QD6w/tQcnQ88/lH7qqrzr7C12TbID3tU6LzjjMt1HXZ/80mRwbBBhoMhwj+55USup3I2+h5ZcOxHv96O3HF+4LNtI93Ac= ARC-Authentication-Results: i=1; mx.zohomail.eu; dkim=pass header.i=redaril.me; spf=pass smtp.mailfrom=development@redaril.me; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1768260029; s=zmail; d=redaril.me; i=development@redaril.me; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=0p2baUfPXG8dXJs3hoBkprKJUvk/AjdNX0qpZhHQNbE=; b=NWUhyFgn61d6mX3Xw+w+ngwsOdzbZzsREdLP2Mw0miRK/3sMj3aZthtXsjP8xY11 m5OeEaPxzdj48JHjQEF/5RYjKEQZd4l27m59SpWcpZXak6/r96AMd8Pz8DAW75lrzo3 n5f2YUE1lo3hOil9sGACAAKXuCaPHN6z3JatF3nQ= Received: by mx.zoho.eu with SMTPS id 1768260028871828.048558199409; Tue, 13 Jan 2026 00:20:28 +0100 (CET) From: Fabio Forni To: Cc: Fabio Forni , Mark Brown , Kuninori Morimoto , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC 3/3] ASoC: simple-card: Split alloc and init logics in probe function Date: Tue, 13 Jan 2026 00:12:24 +0100 Message-ID: <20260112231855.193030-4-development@redaril.me> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260112231855.193030-1-development@redaril.me> References: <20260112231855.193030-1-development@redaril.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" It wasn't clear to me when different simple_probe's gotos were to be used, plus some allocation errors and snd_soc* errors were printed as if they were a parsing error. This commit: 1. Splits the allocation logic and the initialization logic, respectively = in simple_probe and simple_probe_merge_components 2. Adds more error messages to improve the debugging experience 3. Reduces the cognitive load of gotos, as there is now only one label (I = concede that's subjective). This commit also documents simple_util_init_priv. Signed-off-by: Fabio Forni --- sound/soc/generic/simple-card-utils.c | 9 ++ sound/soc/generic/simple-card.c | 137 ++++++++++++++------------ 2 files changed, 81 insertions(+), 65 deletions(-) diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simp= le-card-utils.c index 355f7ec8943c..46a8ee04c6ef 100644 --- a/sound/soc/generic/simple-card-utils.c +++ b/sound/soc/generic/simple-card-utils.c @@ -888,6 +888,15 @@ static struct simple_util_dai dummy_util_dais =3D { .name =3D "dummy_util_dais", }; =20 +/** + * simple_util_init_priv - Initializes private data of a simple audio card. + * @priv: Private data to initialize. Must be pre-allocated. + * @li: Links of the card. Cannot be NULL. + * + * Returns: + * * %0 - OK. + * * %-ENOMEM - Could not allocate memory. + */ int simple_util_init_priv(struct simple_util_priv *priv, struct link_info *li) { diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-car= d.c index 298f8cc98130..b8004aa8f452 100644 --- a/sound/soc/generic/simple-card.c +++ b/sound/soc/generic/simple-card.c @@ -706,47 +706,26 @@ static int simple_soc_probe(struct snd_soc_card *card) return simple_ret(priv, ret); } =20 -static int simple_probe(struct platform_device *pdev) +static int simple_probe_merge_components(const struct device *dev, + struct simple_util_priv *priv, + struct link_info *li) { - struct simple_util_priv *priv; - struct device *dev =3D &pdev->dev; - struct device_node *np =3D dev->of_node; - struct snd_soc_card *card; + const struct device_node *np =3D dev->of_node; + struct snd_soc_card *card =3D simple_priv_to_card(priv); int ret; =20 - /* Allocate the private data and the DAI link array */ - priv =3D devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - card =3D simple_priv_to_card(priv); - card->owner =3D THIS_MODULE; - card->dev =3D dev; - card->probe =3D simple_soc_probe; - card->driver_name =3D "simple-card"; - - ret =3D -ENOMEM; - struct link_info *li __free(kfree) =3D kzalloc(sizeof(*li), GFP_KERNEL); - if (!li) - goto end; - - ret =3D simple_get_dais_count(priv, li); - if (ret < 0) - goto end; - - ret =3D -EINVAL; if (!li->link) - goto end; + return -EINVAL; =20 - ret =3D simple_util_init_priv(priv, li); + ret =3D simple_get_dais_count(priv, li); if (ret < 0) - goto end; + dev_err_probe(dev, ret, "failed to count DAIs"); =20 if (np && of_device_is_available(np)) { - ret =3D simple_parse_of(priv, li); if (ret < 0) - goto err; + dev_err_probe(dev, ret, + "components missing or uninitialized"); =20 } else { struct simple_util_info *cinfo; @@ -756,57 +735,85 @@ static int simple_probe(struct platform_device *pdev) struct snd_soc_dai_link *dai_link =3D priv->dai_link; struct simple_dai_props *dai_props =3D priv->dai_props; =20 - ret =3D -EINVAL; - cinfo =3D dev->platform_data; - if (!cinfo) { - dev_err(dev, "no info for asoc-simple-card\n"); - goto err; - } + if (!cinfo) + return dev_err_probe(dev, -EINVAL, + "no info for asoc-simple-card\n"); + + if (!cinfo->name || !cinfo->codec_dai.name || !cinfo->codec || + !cinfo->platform || !cinfo->cpu_dai.name) + return dev_err_probe( + dev, -EINVAL, + "insufficient simple_util_info settings\n"); + + cpus =3D dai_link->cpus; + cpus->dai_name =3D cinfo->cpu_dai.name; + + codecs =3D dai_link->codecs; + codecs->name =3D cinfo->codec; + codecs->dai_name =3D cinfo->codec_dai.name; + + platform =3D dai_link->platforms; + platform->name =3D cinfo->platform; + + card->name =3D (cinfo->card) ? cinfo->card : cinfo->name; + dai_link->name =3D cinfo->name; + dai_link->stream_name =3D cinfo->name; + dai_link->dai_fmt =3D cinfo->daifmt; + dai_link->init =3D simple_util_dai_init; + memcpy(dai_props->cpu_dai, &cinfo->cpu_dai, + sizeof(*dai_props->cpu_dai)); + memcpy(dai_props->codec_dai, &cinfo->codec_dai, + sizeof(*dai_props->codec_dai)); + } =20 - if (!cinfo->name || - !cinfo->codec_dai.name || - !cinfo->codec || - !cinfo->platform || - !cinfo->cpu_dai.name) { - dev_err(dev, "insufficient simple_util_info settings\n"); - goto err; - } + return 0; +} =20 - cpus =3D dai_link->cpus; - cpus->dai_name =3D cinfo->cpu_dai.name; +static int simple_probe(struct platform_device *pdev) +{ + struct simple_util_priv *priv; + struct device *dev =3D &pdev->dev; + struct snd_soc_card *card; + int ret; =20 - codecs =3D dai_link->codecs; - codecs->name =3D cinfo->codec; - codecs->dai_name =3D cinfo->codec_dai.name; + /* Allocate the private data and the DAI link array */ + priv =3D devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; =20 - platform =3D dai_link->platforms; - platform->name =3D cinfo->platform; + card =3D simple_priv_to_card(priv); + card->owner =3D THIS_MODULE; + card->dev =3D dev; + card->probe =3D simple_soc_probe; + card->driver_name =3D "simple-card"; =20 - card->name =3D (cinfo->card) ? cinfo->card : cinfo->name; - dai_link->name =3D cinfo->name; - dai_link->stream_name =3D cinfo->name; - dai_link->dai_fmt =3D cinfo->daifmt; - dai_link->init =3D simple_util_dai_init; - memcpy(dai_props->cpu_dai, &cinfo->cpu_dai, - sizeof(*dai_props->cpu_dai)); - memcpy(dai_props->codec_dai, &cinfo->codec_dai, - sizeof(*dai_props->codec_dai)); - } + struct link_info *li __free(kfree) =3D kzalloc(sizeof(*li), GFP_KERNEL); + if (!li) + return -ENOMEM; + + ret =3D simple_util_init_priv(priv, li); + if (ret < 0) + return ret; + + ret =3D simple_probe_merge_components(dev, priv, li); + if (ret < 0) + goto err; =20 snd_soc_card_set_drvdata(card, priv); =20 simple_util_debug_info(priv); =20 ret =3D devm_snd_soc_register_card(dev, card); - if (ret < 0) + if (ret < 0) { + dev_err_probe(dev, ret, "failed to register card"); goto err; + } =20 return 0; err: simple_util_clean_reference(card); -end: - return dev_err_probe(dev, ret, "components missing or uninitialized\n"); + return ret; } =20 static const struct of_device_id simple_of_match[] =3D { --=20 2.52.0