From nobody Sat Jun 13 21:01:56 2026 Received: from mail-dl1-f44.google.com (mail-dl1-f44.google.com [74.125.82.44]) (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 138CD38734A for ; Tue, 5 May 2026 11:18:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777979929; cv=none; b=C9jz5aTB9jOvZFdUotQHUVGdgakjIJvl7c62glaAa2/nySAqMqG8nAYrfHoRfaipPmYWIqar5zRvQtKrnV1fK+A6HRjH5tNKvXqYWNlO+iw05typrnvxifNxUjqFW9Su/Qva6NEzRMB5aP8ENJwANx3OVcBDYdfQSmX57LptlgY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777979929; c=relaxed/simple; bh=a9fvkD4KH9FZe3Nqu5/OHzOriThojqtxcfZpjbFhSl8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eqKb5LoT9uLn9fJN13hWNvV4mPPJnQ0rljDNTnBMM//mTFwtqFHsAS/vfTHoEoC+uFBNhT6xAz/5pEYBwfQPxClf1hiu1+gXlvtZcDoDqTrrmGP+xDKZn0JOG082/PBU5Pt3MWT5uPTUcnRG1aCkLDl2A4PzFakn1W4tpC4Ib7s= 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=mzxbo2Lf; arc=none smtp.client-ip=74.125.82.44 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="mzxbo2Lf" Received: by mail-dl1-f44.google.com with SMTP id a92af1059eb24-12c45281a06so7931880c88.1 for ; Tue, 05 May 2026 04:18:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777979926; x=1778584726; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=5MSjy81zKyUdXTwr06hbW0c64AcMNVfJ6CrHzTpndtM=; b=mzxbo2LfjjWLSaGDL3GszxIdc+69Q5rQoW8ZojCfCnZQk3OAdgQIeon9fQQ8lA9TfK TXLAv/fSp+WjIdK4P8vj87MvC0Okr+ce28/NxPN7z29fVqtiykH13AB/QP68TAvKuK+T SaA74WPL2/6OAVc/HwEnL2lqB/PnVjrxrmekEvM8GRaOuWUZ9yzgNMA18OeCPgj9CDRZ Ba3i4qgkfEbUInZ0U4CieSXlmUUJeRmpvLRbftfPuAsYzdWPl8H/gKDzBYR3yPySCgtK FhdSxO2b0Wh9x+69Bx3l0NSNL6LnJv84O36tBENmJI57rCP3xgsxZewxxlbtaJv42nMo yJng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777979926; x=1778584726; h=cc:to:in-reply-to:references: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=5MSjy81zKyUdXTwr06hbW0c64AcMNVfJ6CrHzTpndtM=; b=PVXtAoHU7ciWT3Tkry4jFZeYLZfaEO8twqNh+Yw1MgRYNN/en7pGvPOfSJ0jmrIB31 o6B2JfKzkOVWUtddw4nGeysA/dd46juiDTkl6FfmBVv5fqIk2oaDVO0QrkmgLLGgzom7 CRcGR6SuxS8ElqML1gsG4VQNe5UoJglkgPdQjS0VPCoZ8TEjKMy5bU1rFRugW3lv3ObK I6jHqE7/1yHDg4697UElOuJ7pA1Oaps3DLyBLdlw0OjRhB+ZV880T/7MQaLOH6W0Zfj9 ws4nZK/huXEwo54RXFZHcKSau0sx8oHe5yOX8XAzHt4xqPw+EiA0geEGJ8LoF8IpqYqp QlcA== X-Forwarded-Encrypted: i=1; AFNElJ/Jtm4V0GQk2jQe4GqjokEFBcbJLQ7AQGVTGv6TRWWm82rbRRoZ62stEoIzX6Cx5J/hdUA1pl7Sq7kI4F0=@vger.kernel.org X-Gm-Message-State: AOJu0YwCJfMCz/o3aExdxtiwg0faBrk8vKk4HqB1LNztg+rrLRDQA6RW SFZhxQG3iKW/hNHppUQCirT1zmC/co8MrIZw05cz/dpU4ytylDRRDiDe X-Gm-Gg: AeBDievqv+7ylfy9q5Oue+iG5U4dS/hu/RoJbW8IYSwZ6IgfiB5GszYSMhuLWvITG8c fc2nPXtob13ZREr5iXZCHJkmM+jKrpo/psEodnxxy387z+90eCTCOg7L2PcKa/1hKZyO8hvt/7T jWPG4PF9MtAPQjzUef7ZqgUfR/tT2wJtnT393kc69V0M8VY3rONk3t5RvUNYBEKqJaCRcfZGya2 ALwc1yyCxeJ7RYGFVe408No7/atyqsXGj4mj0wLqONym5RYfQcxhPOaP+Ncava9IFF5KRdoJzZp BAs+plslj9ESPGa6l97BExFYTGvgFwzxNNis03Y2XqcuWYHL5i44I6KHszzs1PuGSITINqVcZXc KGhBI3APV86gOwbXmxuwSDnRx9iJ2BIu8SUG7xV9ENpHfbQjELStoMsadcCMCBGIWRI6VbUIO6h TUEIomW4oUIU/pixne2kmEiYQaFAQ7PFOuYwujtd211advkQLcScKoJzYuqiXrOhvRYkheSHk7X kmuayD10U3cVzvBsfhkYLI= X-Received: by 2002:a05:7022:2387:b0:130:6978:c96 with SMTP id a92af1059eb24-130b194cca5mr1148049c88.19.1777979925927; Tue, 05 May 2026 04:18:45 -0700 (PDT) Received: from [192.168.1.18] (177-4-161-87.user3p.v-tal.net.br. [177.4.161.87]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12df828849dsm17247290c88.5.2026.05.05.04.18.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 May 2026 04:18:45 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Tue, 05 May 2026 08:18:16 -0300 Subject: [PATCH v4 1/2] firmware_loader: Add cancel helper for async requests 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: <20260505-alsa-hda-tas2781-fw-callback-teardown-v4-1-e7c4bf930dc8@gmail.com> References: <20260505-alsa-hda-tas2781-fw-callback-teardown-v4-0-e7c4bf930dc8@gmail.com> In-Reply-To: <20260505-alsa-hda-tas2781-fw-callback-teardown-v4-0-e7c4bf930dc8@gmail.com> To: Luis Chamberlain , Russ Weight , Danilo Krummrich , Greg Kroah-Hartman , "Rafael J. Wysocki" , Takashi Iwai , Shenghao Ding , Kevin Lu , Baojun Xu , Jaroslav Kysela Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5767; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=a9fvkD4KH9FZe3Nqu5/OHzOriThojqtxcfZpjbFhSl8=; b=kA0DAAoW0F0/Glr/7oMByyZiAGn50g2gjQO7w5WWhszZoLfXBRF+JeE/Ai0Wa3ZNDfsXBJERj oh1BAAWCgAdFiEEq2KiObyK4NV/XqhI0F0/Glr/7oMFAmn50g0ACgkQ0F0/Glr/7oMSIgD/bmKi o2ek+IV6qnTy6EjSnksJ3C1lP8gXpxHHSSmDMY8BALp0JCs7AQo+7zUYSEhzV/UTffRlLFB2Rvn y5rkEZgAI X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 request_firmware_nowait() keeps the callback module pinned and holds a device reference until the firmware work completes. Callers still have no way to cancel or synchronize the queued callback before tearing down their driver-private state. Track scheduled async firmware work in an internal list and add request_firmware_nowait_cancel(). The helper cancels work matching the device, callback context and callback function. It cancels work that has not started yet and waits for an already-running callback to return. If the request has already completed, it is a no-op. Keep the existing request_firmware_nowait() lifetime model manual. A devres-managed variant can be layered on top separately if needed. Signed-off-by: C=C3=A1ssio Gabriel Acked-by: Danilo Krummrich Reviewed-by: Takashi Iwai --- drivers/base/firmware_loader/main.c | 68 +++++++++++++++++++++++++++++++++= +--- include/linux/firmware.h | 10 ++++++ 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_lo= ader/main.c index a11b30dda23b..78c5f05a2ec1 100644 --- a/drivers/base/firmware_loader/main.c +++ b/drivers/base/firmware_loader/main.c @@ -1132,6 +1132,7 @@ EXPORT_SYMBOL(release_firmware); /* Async support */ struct firmware_work { struct work_struct work; + struct list_head list; struct module *module; const char *name; struct device *device; @@ -1140,6 +1141,17 @@ struct firmware_work { u32 opt_flags; }; =20 +static LIST_HEAD(firmware_work_list); +static DEFINE_SPINLOCK(firmware_work_lock); + +static void firmware_work_free(struct firmware_work *fw_work) +{ + put_device(fw_work->device); /* taken in request_firmware_nowait() */ + module_put(fw_work->module); + kfree_const(fw_work->name); + kfree(fw_work); +} + static void request_firmware_work_func(struct work_struct *work) { struct firmware_work *fw_work; @@ -1150,11 +1162,15 @@ static void request_firmware_work_func(struct work_= struct *work) _request_firmware(&fw, fw_work->name, fw_work->device, NULL, 0, 0, fw_work->opt_flags); fw_work->cont(fw, fw_work->context); - put_device(fw_work->device); /* taken in request_firmware_nowait() */ =20 - module_put(fw_work->module); - kfree_const(fw_work->name); - kfree(fw_work); + spin_lock_irq(&firmware_work_lock); + if (!list_empty(&fw_work->list)) { + list_del_init(&fw_work->list); + spin_unlock_irq(&firmware_work_lock); + firmware_work_free(fw_work); + return; + } + spin_unlock_irq(&firmware_work_lock); } =20 =20 @@ -1164,6 +1180,7 @@ static int _request_firmware_nowait( void (*cont)(const struct firmware *fw, void *context), bool nowarn) { struct firmware_work *fw_work; + unsigned long flags; =20 fw_work =3D kzalloc_obj(struct firmware_work, gfp); if (!fw_work) @@ -1196,7 +1213,12 @@ static int _request_firmware_nowait( =20 get_device(fw_work->device); INIT_WORK(&fw_work->work, request_firmware_work_func); + + spin_lock_irqsave(&firmware_work_lock, flags); + list_add_tail(&fw_work->list, &firmware_work_list); schedule_work(&fw_work->work); + spin_unlock_irqrestore(&firmware_work_lock, flags); + return 0; } =20 @@ -1259,6 +1281,44 @@ int firmware_request_nowait_nowarn( } EXPORT_SYMBOL_GPL(firmware_request_nowait_nowarn); =20 +/** + * request_firmware_nowait_cancel() - cancel an async firmware request + * @device: device for which the firmware is being loaded + * @context: context passed to request_firmware_nowait() + * @cont: callback passed to request_firmware_nowait() + * + * Cancel a pending request_firmware_nowait() request for @device, @context + * and @cont. If the associated work has already started, this function wa= its + * until the callback has returned. If the callback has already completed,= this + * function does nothing. + * + * This function may sleep. + */ +void request_firmware_nowait_cancel(struct device *device, void *context, + void (*cont)(const struct firmware *fw, + void *context)) +{ + struct firmware_work *fw_work =3D NULL; + struct firmware_work *tmp; + + spin_lock_irq(&firmware_work_lock); + list_for_each_entry_reverse(tmp, &firmware_work_list, list) { + if (tmp->device =3D=3D device && tmp->context =3D=3D context && + tmp->cont =3D=3D cont) { + fw_work =3D tmp; + list_del_init(&fw_work->list); + break; + } + } + spin_unlock_irq(&firmware_work_lock); + + if (!fw_work) + return; + cancel_work_sync(&fw_work->work); + firmware_work_free(fw_work); +} +EXPORT_SYMBOL_GPL(request_firmware_nowait_cancel); + #ifdef CONFIG_FW_CACHE static ASYNC_DOMAIN_EXCLUSIVE(fw_cache_domain); =20 diff --git a/include/linux/firmware.h b/include/linux/firmware.h index aae1b85ffc10..0fa3b027f02f 100644 --- a/include/linux/firmware.h +++ b/include/linux/firmware.h @@ -110,6 +110,9 @@ int request_firmware_nowait( struct module *module, bool uevent, const char *name, struct device *device, gfp_t gfp, void *context, void (*cont)(const struct firmware *fw, void *context)); +void request_firmware_nowait_cancel(struct device *device, void *context, + void (*cont)(const struct firmware *fw, + void *context)); int request_firmware_direct(const struct firmware **fw, const char *name, struct device *device); int request_firmware_into_buf(const struct firmware **firmware_p, @@ -157,6 +160,13 @@ static inline int request_firmware_nowait( return -EINVAL; } =20 +static inline void request_firmware_nowait_cancel(struct device *device, + void *context, + void (*cont)(const struct firmware *fw, + void *context)) +{ +} + static inline void release_firmware(const struct firmware *fw) { } --=20 2.54.0 From nobody Sat Jun 13 21:01:56 2026 Received: from mail-dl1-f45.google.com (mail-dl1-f45.google.com [74.125.82.45]) (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 809F6386C08 for ; Tue, 5 May 2026 11:18:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777979932; cv=none; b=XlMGn9sf7oVaIYl4x96LPb7kaBqU/hlLc/Dj6nGp/0ZM8sqkr7xcib3DBET5GwqbmMrKZJDelFfPpKCQGbSlj2x1/ZKp1pPwaJUUc2pgrOHtkWYidAjhqewRSsw+p/wrVJFbDBWvXAGzx8XJUe9FvCwZ6u7K2yykcQUNRnu2cFw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777979932; c=relaxed/simple; bh=RfgrVvknme6vhAOFjjbtHTulvqGle3JEa4VWxijNxXc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fcHOZizclQ9VEjY4RCkpdBh2PeYsZaRX15iqGPtceaXN6fmm6OxxZf6K38xpKvizK/2r/xXvkYgoS6xnNyuMtczcaGX+FzxQqTsct16qTe4cCUZdQeLscFnvynOE4aywi9xpuYUfjFcpWg4z3Clc51syDezSEAkvX3/dQuVRDCw= 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=rC3oyAgU; arc=none smtp.client-ip=74.125.82.45 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="rC3oyAgU" Received: by mail-dl1-f45.google.com with SMTP id a92af1059eb24-1305908ae11so1693483c88.1 for ; Tue, 05 May 2026 04:18:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777979930; x=1778584730; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=XjBFmY6oME3TcUT9msMQ0JkYRg8U/8GzZccCOVqrKM4=; b=rC3oyAgUHIJkr355S3bBR/5MWnGJ5LgxDe2/oxws1oMVSpiH6KFtVO0jDzt+Ae6YDd 24RjyQj41hWY1aDniruNvqCvR4GZCitMGhKHkKXSrXCpYBAHJFi3xC/v9flEsmrXpsru ++eFOP/aabul9/LE0BiRdNHMygLh2+3X/Nh6ymOOLdo7SrYvbv1v9ywD0h4/vqPGTyVR udxKRMtyYYOXegmvi2rpvgICYa8dYcqoQb9Ta67i+ImCvPYGijsFehHcoBGKsmSEu19K Hm4HVmueku2R6DS0H3tzRmNX07AndA3uRMqb0JYUj6jB38NFj6mnnituZwGMhuzDKAv2 tQTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777979930; x=1778584730; h=cc:to:in-reply-to:references: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=XjBFmY6oME3TcUT9msMQ0JkYRg8U/8GzZccCOVqrKM4=; b=MzQ1gTQkDQyR0z0IUcv+bla5dMgOc/sH0D1udNLMCjchXNT02oBwWQkWcrEAIgt+q8 JbLUATQ0hwNAVra8HXcEfqMyKPlnnAf5RVXQ6XVaOzy/X0qzhBnY5NRRdslHXp8wqbp1 W2vJqTot2LN1Dgh8SQgu+zN4nb1KF7Gc/pce9IIU6ixPKGwS8+LPNdSuPAKrQ+zllKZg /BJHQZ9zELRy4KxJUowmypQV4BQR7sV8X+qk8EiWChSX/MrKEQjLYBZUGuM983ihLWn7 qsjwWe3uTa6YdAL02GDMkdaChG2Ee7ByoSG+5z8CvgukcFrmx34K3uJY0uSgAA1gzD2a K4ew== X-Forwarded-Encrypted: i=1; AFNElJ+FHII2WBLM//lkx6D1hOPUZAafn7L+Zpa8MJpMuh7BCSJ0TSP0+f7LMn2sQ8mdVyVQIkpBiiAEmvk1VrQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwaqV3iA7+0H/gKHoiyYFabTA0C3D/C5COnnPIOXw/ibnNkGLog UxEDN0ckbJeCJSdsO3LdFeBiEynanVdogiOHaruKbUl4bVspfHNIfCQH X-Gm-Gg: AeBDieuyEC2O7YbijM4pMJHT7AwA7Icw/vbUZCnWVMg6mCKhJcUiCtaiOTnSe9WxwdV u40pRqNBWR/LN2dwLMtd6N9YtM+hVBk8KgmKQlbBWbrH4kGMnVs/9gZ7LL87ndvLN5fP5UVaAog 1PE/iqfan9FburTZowftO5KZZo2I4SZ9ZI0Hsn8SEoCP0Uine9MLr8prF7fjh8GWoiRL85Wu8zI wfKB0bupogyZX/s3u3NkgIU3EJZXa9LdjtYzP5eG263xeGgIR386hTWRspnGaiPnssCVAiy5FlU oRwtKWDSrQZdnGfkA0LVXaL2CVkyfLIBfVnno5qwnvNEutmQZ0UKzwfJfvrVVjx3RM+TDTAtnyh fHx/kGIX/OSZNTG2ZD6wcdUlRI/nwGky4CKexYjTlb9jeK6A2oEPFX7Qe9EK8YVf/PHE8LES2TP dkrgtvmbK65cloYCjigMZz96+H1a8CV+GRiumTt4BglcTbBCauJvYkqchbFMW8/tIaYCoLC6pbJ OcMSALgpgNa X-Received: by 2002:a05:7022:6998:b0:128:dbbf:fd35 with SMTP id a92af1059eb24-130b1b6785emr1279909c88.28.1777979930401; Tue, 05 May 2026 04:18:50 -0700 (PDT) Received: from [192.168.1.18] (177-4-161-87.user3p.v-tal.net.br. [177.4.161.87]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12df828849dsm17247290c88.5.2026.05.05.04.18.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 May 2026 04:18:49 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Tue, 05 May 2026 08:18:17 -0300 Subject: [PATCH v4 2/2] ALSA: hda/tas2781: Cancel async firmware request at unbind 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: <20260505-alsa-hda-tas2781-fw-callback-teardown-v4-2-e7c4bf930dc8@gmail.com> References: <20260505-alsa-hda-tas2781-fw-callback-teardown-v4-0-e7c4bf930dc8@gmail.com> In-Reply-To: <20260505-alsa-hda-tas2781-fw-callback-teardown-v4-0-e7c4bf930dc8@gmail.com> To: Luis Chamberlain , Russ Weight , Danilo Krummrich , Greg Kroah-Hartman , "Rafael J. Wysocki" , Takashi Iwai , Shenghao Ding , Kevin Lu , Baojun Xu , Jaroslav Kysela Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= , stable@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2250; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=RfgrVvknme6vhAOFjjbtHTulvqGle3JEa4VWxijNxXc=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJk/L/Fa1/D3LvgQOr/TvCNz0psnhmaM62cdmaLwrrxMX yM3IjC7o5SFQYyLQVZMkWV10iLLPV0PrtbHrfCAmcPKBDKEgYtTACZy6RrDP4OES5/L2+dM+bT3 HpNKnyHbv7oSpryvepclv2+/N6fZXIqRYftsHvU1UVN+MH+9d7brqpuE5A6vpVcbvrQt2bD1vue k/8wA X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 TAS2781 HDA I2C and SPI queue RCA firmware loading from component bind with request_firmware_nowait(). The firmware loader keeps the callback module pinned and holds a device reference, but the callback still uses driver-private HDA state. Component unbind removes controls and DSP state immediately. Later device removal tears down the TAS2781 private data, including codec_lock. If the async firmware callback runs after unbind has started, it can operate on state that is being torn down. Cancel or synchronize the async firmware request before removing controls and DSP state. A queued callback is cancelled, and an already-running callback is allowed to finish before unbind continues. Fixes: 5be27f1e3ec9 ("ALSA: hda/tas2781: Add tas2781 HDA driver") Fixes: bb5f86ea50ff ("ALSA: hda/tas2781: Add tas2781 hda SPI driver") Cc: stable@vger.kernel.org Signed-off-by: C=C3=A1ssio Gabriel Acked-by: Danilo Krummrich Reviewed-by: Takashi Iwai --- sound/hda/codecs/side-codecs/tas2781_hda_i2c.c | 3 +++ sound/hda/codecs/side-codecs/tas2781_hda_spi.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c b/sound/hda/cod= ecs/side-codecs/tas2781_hda_i2c.c index 67240ce184e1..dd1b0cc63ad6 100644 --- a/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c +++ b/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c @@ -588,6 +588,9 @@ static void tas2781_hda_unbind(struct device *dev, comp->playback_hook =3D NULL; } =20 + request_firmware_nowait_cancel(tas_hda->priv->dev, tas_hda->priv, + tasdev_fw_ready); + tas2781_hda_remove_controls(tas_hda); =20 tasdevice_config_info_remove(tas_hda->priv); diff --git a/sound/hda/codecs/side-codecs/tas2781_hda_spi.c b/sound/hda/cod= ecs/side-codecs/tas2781_hda_spi.c index 0e4f3553f273..d243baff95a7 100644 --- a/sound/hda/codecs/side-codecs/tas2781_hda_spi.c +++ b/sound/hda/codecs/side-codecs/tas2781_hda_spi.c @@ -750,6 +750,9 @@ static void tas2781_hda_unbind(struct device *dev, stru= ct device *master, comp->playback_hook =3D NULL; } =20 + request_firmware_nowait_cancel(tas_priv->dev, tas_priv, + tasdev_fw_ready); + tas2781_hda_remove_controls(tas_hda); =20 tasdevice_config_info_remove(tas_priv); --=20 2.54.0