From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794371900; b=qAUx96hRkoER8sRrUHanC/GSm1QGXNRQAaVDZyfo3hH0Zj2DN28z/lbm/kQn98gZeapl bjmVfYUORPceyz4iQRHua8RMG4qoGQO0zkvYWaGVBmOP+mLibksNw2ewUxFD12ZP6zo9X 8joouH+8iPfxEIpngl8TM5qHGglOHFGqo/kqbtXfRz55gbfpQV3mtD1sq92A4Z2313hYg uTo+SjC3yUl7K/+noKaSTx4BRB0tgB+YSniROlZtsTAeP56O3EBYt5xGYoyz9EjOUpbjc sTEdscnVVznHff8NxSGri7qDJP0H8DYgRvlSlczRgcrUfphvS+uN6f5ShC4dGdETF2w== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794371900; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding; bh=9Kkz5UMUQGDd/hlpe7qHe040t9wcf6pQZt9Ox3K+0YI=; b=l1hOpL1CHMmKWQtaXBMW4mnu5qL1Jlcy0yYdgUpHir2zhIK+SGcJy4d2rN27tiayYJvl Go/vITxpAcKqAimvG8TCgMv+VPdNNUSU89OsGqx/ipr4kvwkSW27ICQMnPK5ubS/VaYiK Gvl+KAfqDi3AN540UDvJ2OxgFCuakMcKy7TovdBb0fFrMP97vVCwmC536SevLONNo9lOZ 4yFqJOWwIQTdFX3MBr+uxjIfjU/6XDdj/oJbfeyPTHWrCaBusnh5cpA85uEejwCUrdjgP HPFgXBezYcD1pFSHfSkJkz6+JyZr1wxSVIDEIUIGlKQbf83oM0aLJqK2SFYEp6zklMg== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=FM8J8K4q; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DEFB0606A320 for ; Wed, 11 Nov 2026 04:38:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=FM8J8K4q Received: by smtp.kernel.org (Postfix) with ESMTPSA id 17CC71F0089F; Wed, 11 Nov 2026 04:38:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794371900; bh=9Kkz5UMUQGDd/hlpe7qHe040t9wcf6pQZt9Ox3K+0YI=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=FM8J8K4qrA7tqupqPvWXft6Ii0dms4LbeHdmiw3hDiiD9En9Ftk1f2nLH3pbpST5J 4+fegrCqg0c68AWkSqdq5Jcigf7Ddun2INpE1KspN4E18e/+Fn9C6eCjjO7ABbMrA0 kGfLp9vD8ebCQFBWryQvw8PYRxPD7P7QFkzvOzxWm0NAmA6e2aX6nXAXXOdEcQVA/n xQL08hYaaPJJ5Sg85L8c8aeK6bLKJyqoTv3/t3j63iStDyK4GDnSAzL1nIpuOpOU6B bNoeKIMdExCJURQfdaNJzoxcgKqjjs2Y61NkV99RSOO4FgTp9Ybjr0H2AALg8oPb/L AKfLDFTmMTPBA== From: Sasha Levin To: stable@vger.kernel.org Cc: Peter Ujfalusi , Mark Brown , Sasha Levin Subject: [PATCH 6.12.y 1/2] ASoC: hdac_hda: Allocate the private data at codec driver bind Date: Tue, 10 Nov 2026 23:38:18 -0500 Message-ID: <20261111043626.1123671-1-sashal@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261107052707-failed-6.12-08a44bde821d@kernel.org> References: <20261107052707-failed-6.12-08a44bde821d@kernel.org> X-Mailing-List: stable@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Peter Ujfalusi [ Upstream commit 7d357eae973a1e1933f81f55aa1b3b4e3064570f ] The SOF HDA code allocates struct hdac_hda_priv and stores it as drvdata of the codec device before the codec driver is bound. The driver core clears drvdata on unbind, so after unbinding the codec driver via sysfs a subsequent bind dereferences a NULL pointer in hdac_hda_dev_probe(). All information in the private data can be derived from the codec device itself, so allocate and set it up in hdac_hda_dev_probe() as a device managed resource, which is released on unbind. Remove the allocation from SOF, keeping the check for iDisp codecs without display audio component. Fixes: 3fd63658caed ("ASoC: Intel: Drop hdac_ext usage for codec device creation") Signed-off-by: Peter Ujfalusi Link: https://patch.msgid.link/20261027083840.28813-2-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown Stable-dep-of: 08a44bde821d ("ASoC: hdac_hda: Restore the codec device type on unbind") Signed-off-by: Sasha Levin --- sound/soc/codecs/hdac_hda.c | 13 ++++++++++++- sound/soc/sof/intel/hda-codec.c | 23 ++++------------------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c index 25a145cb8a510..26c2cc1d6a18c 100644 --- a/sound/soc/codecs/hdac_hda.c +++ b/sound/soc/codecs/hdac_hda.c @@ -637,10 +637,21 @@ static const struct snd_soc_component_driver hdac_hda_hdmi_codec = { static int hdac_hda_dev_probe(struct hdac_device *hdev) { - struct hdac_hda_priv *hda_pvt = dev_get_drvdata(&hdev->dev); + struct hdac_hda_priv *hda_pvt; struct hdac_ext_link *hlink; int ret; + hda_pvt = devm_kzalloc(&hdev->dev, sizeof(*hda_pvt), GFP_KERNEL); + if (!hda_pvt) + return -ENOMEM; + + hda_pvt->codec = dev_to_hda_codec(&hdev->dev); + hda_pvt->dev_index = hdev->addr; + /* Intel iDisp (HDMI/DP) codec */ + if (((hdev->vendor_id >> 16) & 0xFFFF) == 0x8086) + hda_pvt->need_display_power = true; + dev_set_drvdata(&hdev->dev, hda_pvt); + /* hold the ref while we probe */ hlink = snd_hdac_ext_bus_get_hlink_by_name(hdev->bus, dev_name(&hdev->dev)); if (!hlink) { diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c index c0c58b4297155..57998d3d8d15b 100644 --- a/sound/soc/sof/intel/hda-codec.c +++ b/sound/soc/sof/intel/hda-codec.c @@ -15,8 +15,6 @@ #include "hda.h" #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC) -#include "../../codecs/hdac_hda.h" - #define CODEC_PROBE_RETRIES 3 #define IDISP_VID_INTEL 0x80860000 @@ -148,7 +146,6 @@ static struct hda_codec *hda_codec_device_init(struct hdac_bus *bus, int addr, i /* probe individual codec */ static int hda_codec_probe(struct snd_sof_dev *sdev, int address) { - struct hdac_hda_priv *hda_priv; struct hda_bus *hbus = sof_to_hbus(sdev); struct hda_codec *codec; u32 hda_cmd = (address << 28) | (AC_NODE_ROOT << 20) | @@ -168,27 +165,15 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address) dev_dbg(sdev->dev, "HDA codec #%d probed OK: response: %x\n", address, resp); - hda_priv = devm_kzalloc(sdev->dev, sizeof(*hda_priv), GFP_KERNEL); - if (!hda_priv) - return -ENOMEM; - codec = hda_codec_device_init(&hbus->core, address, HDA_DEV_LEGACY); ret = PTR_ERR_OR_ZERO(codec); if (ret < 0) return ret; - hda_priv->codec = codec; - hda_priv->dev_index = address; - dev_set_drvdata(&codec->core.dev, hda_priv); - - if ((resp & 0xFFFF0000) == IDISP_VID_INTEL) { - if (!hbus->core.audio_component) { - dev_dbg(sdev->dev, - "iDisp hw present but no driver\n"); - ret = -ENOENT; - goto out; - } - hda_priv->need_display_power = true; + if ((resp & 0xFFFF0000) == IDISP_VID_INTEL && !hbus->core.audio_component) { + dev_dbg(sdev->dev, "iDisp hw present but no driver\n"); + ret = -ENOENT; + goto out; } if (is_generic_config(hbus)) -- 2.53.0