From nobody Thu Apr 2 15:37:29 2026 Received: from mail-dl1-f46.google.com (mail-dl1-f46.google.com [74.125.82.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0CD7F3793AA for ; Fri, 27 Mar 2026 17:16:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631806; cv=none; b=BSATQFUuC+J7bCz6dJQ6q1JgVFukf0hHTbbcqvuEtoMm1RtIzmZeOwKXOPKl6cZ1t4rjXuJ8at+ltBhsF7ZbZvttVe/XyaNc50oJsRws7I+Kn01TGb7xvhT5s+Cey2ASySHnywTZqN/Y0/roD5NZ/XQuPtkcKPuek+NxR5mlZo4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774631806; c=relaxed/simple; bh=/SykNSI47zNqLpYIqKSmqbedZuy0lIpaVsgRQ/cxV8o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=nc8Uvk8fyeFEBxiOkRo8uIMlseFPMeS5AWgOAFn7eUp41D9SGniRIbUv99vcDZ9pq3mQbESpOW73WZt/OW+raFp5B5ZDyIcKgjeSi736dqkjThtK2VmJmk9naHGC/x2HyDmHUOwg8PQRCMULvrqSZt2cQhpVmlJYKQ794Ze/cqU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PEBe1Bhj; arc=none smtp.client-ip=74.125.82.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PEBe1Bhj" Received: by mail-dl1-f46.google.com with SMTP id a92af1059eb24-12a74039dc6so1986305c88.0 for ; Fri, 27 Mar 2026 10:16:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774631803; x=1775236603; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=6/yUqbJr6CRtj4We34TBkFmWwvqhhU++Fms724gbhZA=; b=PEBe1Bhjnps+qS3b/zcEJ++iIVk+KDyzpSwPksI7oGeRtr5iCgK9MnhvHPlkkIb4P9 AlQazMNtglGRk9mtim2IEFbC8gO/h2NEAOY8dPJGf05qdAfTA87gQvCXQRQdqtJchmde e0AWpceB3m/ByOeMCvqxqvZBwtLmvoG8lZjhTrzy/qDzCW4h3i5Xt+SQD9FCSHD7TR45 zK+ZRpdANKr4ibRPUdWJSSwEuV9UbZLyXebChMc7fWraCZ+OjMcQqC7C09EvC8ALFGHZ gdHhdRqxSU/rW7RedATLyyoNQ7qeM2wlLat33ZlNs6A5VUTD+LPpKcOmMkASV6SQkJ9q UjKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774631803; x=1775236603; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=6/yUqbJr6CRtj4We34TBkFmWwvqhhU++Fms724gbhZA=; b=tZcPksIAk9BaelOe/IlAxxOBoJGCCtQb5y2bqxpZAtWXbUf1ik0y4bu6IysKyuN5E6 9klolOh6wZJ81hJ+ctkpskxbDjXR4SumXhnH7jiZ/RidMbHH14jlXDBFpL53FDCtzcP1 gjX4eLir/7Ddw3QNy7IuBNAsSyrYJznc4AjWlylKaj2y7IwzNCTmL2/Ttp7/ChXnAgmU B8aJtyFEkR7ENpTUigbAv9rd16+xswsBSQE0gpSKFTkrO4HL2hWnQGdZSfrC1BQLA1YP zOAEpVaWwq17n0c4y+2B5/IqDbZR2MZLgAAKQV+pRXLt38sraqKuun3ch1AFSy3fy30P T6tQ== X-Forwarded-Encrypted: i=1; AJvYcCXsv2AFSUmwV0bYxAUxipC27fEi5r76ntJYlYK7kMupVMFZl0Gl5ETahe0ug26u8s86aRolpnQOSKlO7ww=@vger.kernel.org X-Gm-Message-State: AOJu0Yxo/8AcIxQ6GBFb3AY6gtxtCUILlTBOibjmlvRTbgJYvC3aOlvz KEGEox6dTRHf26eLbVYJ6AwZvVQogviEYHJ9MYFnvx+1m0aB+12heImE X-Gm-Gg: ATEYQzwDgEKLXg+u4v8XYfPUFrX7mCN1N6oOGv4v6nsX9IYExYmiJ+40bNvHW2qBh3B UXOaa0zLD4CcDADJKSQAWk3O5BBBbvPsmaUQ9ZehQ8NyLeGQ314tTPK28onwj7dFC64LE7YO9tM yTwLKlgZXcHcfmhx0ORhlb339UdMsO/vysIPCWZIMNMsw+/bKnWWFmrRTUBbTOzYS9ntI97cz3D XJjaefMzUWxozt3qxIVA1I2Rfx0IcbzcyCjMedYv0jhjBlYqC/2E0TZy7moUdzG4GZyly2zJCwC etnOEzAxJs5kAD5R5GN17QHrx1kzywgqoVKKpl7gs0vwTpGxXx1OUIW8amY/ydvOb2sXWbZuQJK cuVQbj0LsLsSYCl9CYuL+2w23Xfl3iZRVYWyVF4Zr+/nBKXuZGN25ZaAYPwkcVFiK1JXxTlWmNm h8DCA1kCoNAAyYMObphukyYBJIcdMUQipMCY+dlkr3xFGzvwvqAq/HjcORgkz3g7ssIoaBxMsz X-Received: by 2002:a05:7022:684:b0:12a:72af:83d2 with SMTP id a92af1059eb24-12ab286bc34mr2063661c88.14.1774631802474; Fri, 27 Mar 2026 10:16:42 -0700 (PDT) Received: from [192.168.1.8] (177-4-161-78.user3p.v-tal.net.br. [177.4.161.78]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12aa78462fesm8591213c88.15.2026.03.27.10.16.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Mar 2026 10:16:41 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Fri, 27 Mar 2026 14:16:27 -0300 Subject: [PATCH v3] ASoC: generic: keep fallback dai_name stable across rebind Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260327-asoc-generic-fallback-dai-name-rebind-v3-1-c206e44f40c8@gmail.com> X-B4-Tracking: v=1; b=H4sIAAAAAAAC/5WOzY7CMAwGXwXljFF+IC2ceI/VHlzHLYY2RQlbL UJ9d1K4cNw9jvR5xg+VOQlndVg9VOJJsoyxgFuvFJ0wdgwSCiurrdfOesA8EnQcyxlBi33fIF0 goEDEgSFxIzGAd7VBQ7Wu2qCK65q4ld9X5+v7zfmnOTPdFvmyOEm+jen+emQyy+6/zcmAAaR9Q EdN8NofuwGl39A4qKU52U9r9VerLVbjfE27iraow6d1nucn4BHV70IBAAA= X-Change-ID: 20260326-asoc-generic-fallback-dai-name-rebind-6381a1c807fd To: Mark Brown , Kuninori Morimoto , Liam Girdwood , Jaroslav Kysela , Takashi Iwai Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.15.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=6570; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=/SykNSI47zNqLpYIqKSmqbedZuy0lIpaVsgRQ/cxV8o=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJnHdpefOZCxr5VRkTN/kcjmI0fyk+JXBq7SfiZVac/wv a5yadKkjlIWBjEuBlkxRZbVSYss93Q9uFoft8IDZg4rE8gQBi5OAZjI+22MDNMYnCef9LdWPPRw LmdB+nmL+MRrEsYrHOw39yQ8trVVucrI8Md8uown79epL2tlfecvnzPj5FtXxo2nsiqbeWbrWOw NZgAA X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 simple_parse_dai() and graph_util_parse_dai() first try to identify a DAI via dai_args. When that works the card can rebind without relying on dlc->dai_name. The fallback path still calls snd_soc_get_dlc(), which returns a borrowed dai_name pointer. If the CPU or codec component is unbound while the sound card stays registered, the generic card keeps that pointer and the next rebind may compare stale memory while matching the DAI. Stage the fallback result in a temporary dai_link_component and move only a card-owned copy of dai_name into the live link component. Use devm_kstrdup_const() so static names are reused and dynamic ones remain valid for the lifetime of the card device. Suggested-by: Kuninori Morimoto Acked-by: Kuninori Morimoto Signed-off-by: C=C3=A1ssio Gabriel --- Changes in v3: - Add Suggested-by tag. - No code changes. - Link to v2: https://patch.msgid.link/20260327-asoc-generic-fallback-dai-n= ame-rebind-v2-1-1368c57c4a0d@gmail.com Changes in v2: - Rework simple_parse_dai() and graph_util_parse_dai() to use if/else instead of a non-error goto. - Move the fallback snd_soc_get_dlc() handling into the else branch. - Link to v1: https://patch.msgid.link/20260326-asoc-generic-fallback-dai-n= ame-rebind-v1-1-ac9da3cbd606@gmail.com --- sound/soc/generic/simple-card-utils.c | 52 ++++++++++++++++---------------= ---- sound/soc/generic/simple-card.c | 46 ++++++++++++++----------------- 2 files changed, 44 insertions(+), 54 deletions(-) diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simp= le-card-utils.c index da6353594d61..e5cb602fd248 100644 --- a/sound/soc/generic/simple-card-utils.c +++ b/sound/soc/generic/simple-card-utils.c @@ -1128,7 +1128,9 @@ int graph_util_parse_dai(struct simple_util_priv *pri= v, struct device_node *ep, struct device *dev =3D simple_priv_to_dev(priv); struct device_node *node; struct of_phandle_args args =3D {}; + struct snd_soc_dai_link_component resolved_dlc =3D {}; struct snd_soc_dai *dai; + const char *fallback_dai_name; int ret; =20 if (!ep) @@ -1152,39 +1154,31 @@ int graph_util_parse_dai(struct simple_util_priv *p= riv, struct device_node *ep, dlc->of_node =3D node; dlc->dai_name =3D dai_name; dlc->dai_args =3D dai_args; + } else { + /* Get dai->name */ + args.np =3D node; + args.args[0] =3D graph_get_dai_id(ep); + args.args_count =3D (of_graph_get_endpoint_count(node) > 1); =20 - goto parse_dai_end; - } + ret =3D snd_soc_get_dlc(&args, &resolved_dlc); + if (ret < 0) + goto err; =20 - /* Get dai->name */ - args.np =3D node; - args.args[0] =3D graph_get_dai_id(ep); - args.args_count =3D (of_graph_get_endpoint_count(node) > 1); + /* Keep fallback dai_name valid across component rebind */ + fallback_dai_name =3D resolved_dlc.dai_name; + if (fallback_dai_name) { + fallback_dai_name =3D devm_kstrdup_const(dev, fallback_dai_name, + GFP_KERNEL); + ret =3D -ENOMEM; + if (!fallback_dai_name) + goto err; + } =20 - /* - * FIXME - * - * Here, dlc->dai_name is pointer to CPU/Codec DAI name. - * If user unbinded CPU or Codec driver, but not for Sound Card, - * dlc->dai_name is keeping unbinded CPU or Codec - * driver's pointer. - * - * If user re-bind CPU or Codec driver again, ALSA SoC will try - * to rebind Card via snd_soc_try_rebind_card(), but because of - * above reason, it might can't bind Sound Card. - * Because Sound Card is pointing to released dai_name pointer. - * - * To avoid this rebind Card issue, - * 1) It needs to alloc memory to keep dai_name eventhough - * CPU or Codec driver was unbinded, or - * 2) user need to rebind Sound Card everytime - * if he unbinded CPU or Codec. - */ - ret =3D snd_soc_get_dlc(&args, dlc); - if (ret < 0) - goto err; + dlc->of_node =3D resolved_dlc.of_node; + dlc->dai_name =3D fallback_dai_name; + dlc->dai_args =3D resolved_dlc.dai_args; + } =20 -parse_dai_end: if (is_single_link) *is_single_link =3D of_graph_get_endpoint_count(node) =3D=3D 1; ret =3D 0; diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-car= d.c index 9937a991846e..b24ba1330896 100644 --- a/sound/soc/generic/simple-card.c +++ b/sound/soc/generic/simple-card.c @@ -69,7 +69,9 @@ static int simple_parse_dai(struct simple_util_priv *priv, { struct device *dev =3D simple_priv_to_dev(priv); struct of_phandle_args args; + struct snd_soc_dai_link_component resolved_dlc =3D {}; struct snd_soc_dai *dai; + const char *fallback_dai_name; int ret; =20 if (!node) @@ -94,34 +96,28 @@ static int simple_parse_dai(struct simple_util_priv *pr= iv, dlc->dai_args =3D snd_soc_copy_dai_args(dev, &args); if (!dlc->dai_args) goto end; + } else { + ret =3D snd_soc_get_dlc(&args, &resolved_dlc); + if (ret < 0) + goto end; =20 - goto parse_dai_end; - } + /* Keep fallback dai_name valid across component rebind */ + fallback_dai_name =3D resolved_dlc.dai_name; + if (fallback_dai_name) { + fallback_dai_name =3D devm_kstrdup_const(dev, fallback_dai_name, + GFP_KERNEL); + ret =3D -ENOMEM; + if (!fallback_dai_name) { + of_node_put(resolved_dlc.of_node); + goto end; + } + } =20 - /* - * FIXME - * - * Here, dlc->dai_name is pointer to CPU/Codec DAI name. - * If user unbinded CPU or Codec driver, but not for Sound Card, - * dlc->dai_name is keeping unbinded CPU or Codec - * driver's pointer. - * - * If user re-bind CPU or Codec driver again, ALSA SoC will try - * to rebind Card via snd_soc_try_rebind_card(), but because of - * above reason, it might can't bind Sound Card. - * Because Sound Card is pointing to released dai_name pointer. - * - * To avoid this rebind Card issue, - * 1) It needs to alloc memory to keep dai_name eventhough - * CPU or Codec driver was unbinded, or - * 2) user need to rebind Sound Card everytime - * if he unbinded CPU or Codec. - */ - ret =3D snd_soc_get_dlc(&args, dlc); - if (ret < 0) - goto end; + dlc->of_node =3D resolved_dlc.of_node; + dlc->dai_name =3D fallback_dai_name; + dlc->dai_args =3D resolved_dlc.dai_args; + } =20 -parse_dai_end: if (is_single_link) *is_single_link =3D !args.args_count; ret =3D 0; --- base-commit: d084fd53a2fd5748d4317635b1c1a7dba7edf583 change-id: 20260326-asoc-generic-fallback-dai-name-rebind-6381a1c807fd Best regards, -- =20 C=C3=A1ssio Gabriel