From nobody Sun Jun 14 07:48:16 2026 Received: from mail-dl1-f41.google.com (mail-dl1-f41.google.com [74.125.82.41]) (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 5C0743876A0 for ; Fri, 1 May 2026 10:26:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777631172; cv=none; b=fFFx1GLjj0bmnKo2antNqGBSQpjasRAk1LjEeAhOGxlR3th3BxZtruNx3aMdeYZpJCzBQ8GGb/gM0N1rDVHbLUVNtTixKNQUghJy9UaiabZRxZhK8uvWX7oq838mg+Fyam/hJ0KJ3S/hLp9j5mzn8vD8q7J4USxJgJIRR1qJmvU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777631172; c=relaxed/simple; bh=lkrOfQejoOQtc0UD8vdaZKSDo8iZxAifYR7cbfqlCuw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lTwwHhU3GUraoPYXD7Y+AtV9TolILL7AdMHpo8dzNY6ofdIEKQaW6xlh4o2TBZ3C6eJWvDvF2qL6h3WeXojUlbnyyvsSLgiaueHB3sVzSBrJXE128yzZJv3T462blKaum97hiezx7X22fohIcP3lgX2WR9or+jHF9eFunTW8gCs= 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=HLnIADKZ; arc=none smtp.client-ip=74.125.82.41 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="HLnIADKZ" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-12c1a170a50so2334986c88.0 for ; Fri, 01 May 2026 03:26:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777631170; x=1778235970; 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=J/VNZZNNKrMdoG7xQ2QOv9i/OiKP564yp95Gw5x5J8s=; b=HLnIADKZQACeiT0YMxFER4T92tT55NJV/TbZBhaUg4xIBJWwOgoV2MMwi6ioHgPVBt F9KSWH72I1WjP+rHdmuI8hlw0hVClXwb+/8b+kX4Po3CNHsBc3lQ5vYkE2o4F6ALcY63 CooPi65olw9WK+DydU4EpzF7/GGnppTyS4DGlIkKmOXeCurxcOn8avgpitQio6sHjZ2s /YCR7SFiU0TLSFqEROa8IJR6rYIUN3Nr31LZy9ZtayjRQfndSHJWcPDYjyIPNWIMGF1x RbuSH57tLgNdfwk8F5g7+vDue82czEexjmkAumbpz2geN4MDHqco2ebaJrwrqm99ykVm DNpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777631170; x=1778235970; 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=J/VNZZNNKrMdoG7xQ2QOv9i/OiKP564yp95Gw5x5J8s=; b=BVOFXscFoXftNWhhJvLzVJROhQEP76z+rGMrdwFddUSaLTmnkQtIF4WYWpw9n6NtCD B6hfReU86lYPff+9eG4/kgyEEU8A7mEUtioNXCs8NzWL2BpnwVG7yGwSdiX2vG9tuvx9 smuGCqmKoLZDSvSTgAaCWNTWDtbke+lLFeybwIZLGP5n6RJSTZ55zb9miOBvXw0tu0tR gC+8girsD0YdwwFOhyrMto7Xt7HzbpOQxB59XuLoRWs1LxJ+p7rqyAMsw9nrq5VTSJhF lU1/6MI1gaPpNwHFx4iyeEWQYrwEz8Om8zHQYI5MFaFvoKPTzsAHb3INJZzRbQv1dz1u 67nw== X-Forwarded-Encrypted: i=1; AFNElJ/2l03xTzGJVCs2kAe8XM8PyrHNvBrGwUwvWWJrJeP4cQwZLRd3OOzWSoyNhwUZExXnnNxQLW1f5WRa0Xg=@vger.kernel.org X-Gm-Message-State: AOJu0YyZmmYw5mVyfcKJU/pDp2XbiVoaYl2KrKsyB7zrj+xt7DILgvDk BQBnYiyq089qVySvSndIRgZjQFKvudKyTzh97GSSfj3vKNXiuyQc1YF+ X-Gm-Gg: AeBDietK2KTdCUjk6fgsbJc9j2uAPh7/j8aMgki+26mP75K+s3UZHxhPX4x2kGQTQyD fFdgw/kbWg8a1QRd9xHSi+7r6dae1X2yFLfBWmPGv7mcPtVwfLqiJmkk1zHKejVwSQYEHuqHGG0 7xfj8om7ugrb7rISxJ2pXRhvN2IbSefv7h0/W3lbc4p7HMEhtov7n1QzuaWc44KRGhtrXqxEpP1 d7Q8Cn38PuiVWd/sF1jOjUk4MDp5uAy79gj40ELNFcVwdZI56qCEvAeVTHJptZNKczpi6feXXzk VGYEF5DydMbBhiG4Z0fQ6XfzRSG6vjRMTl8xYMA8zfKeEr/8QQrvGnHHZFb4LWTPvPrtiAQu5ch 5/1jSlZ5arGIoNKJUokzvFrUt3gOv5F1GJlyqrNh+3tOARxmGDWGcMOkaM6yYIo5hMuFR+oWLGn e201jwWyuF9BFX0yPHIW97PGWKvx3JidYUjkXp9ymiGS25NooGoCZwh0wayOq1hXij6o2iAHlzp tqr5ldEt07S X-Received: by 2002:a05:7022:e17:b0:12d:de3f:f3e6 with SMTP id a92af1059eb24-12dead2545cmr2631963c88.38.1777631170377; Fri, 01 May 2026 03:26:10 -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-12df84250f1sm2621191c88.11.2026.05.01.03.26.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 01 May 2026 03:26:09 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Fri, 01 May 2026 07:22:12 -0300 Subject: [PATCH v3 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: <20260501-alsa-hda-tas2781-fw-callback-teardown-v3-1-8d9f873b97bd@gmail.com> References: <20260501-alsa-hda-tas2781-fw-callback-teardown-v3-0-8d9f873b97bd@gmail.com> In-Reply-To: <20260501-alsa-hda-tas2781-fw-callback-teardown-v3-0-8d9f873b97bd@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=5907; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=lkrOfQejoOQtc0UD8vdaZKSDo8iZxAifYR7cbfqlCuw=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJlf6nfYvvoa+8m4+mtj7bnFuRx7vvbsOivC+fha84yFv zwMjBxvdJSyMIhxMciKKbKsTlpkuafrwdX6uBUeMHNYmUCGMHBxCsBErlxn+J9icWenHFPilZQD LrLL3Y+yvVOdkfojzejiDvEZ5U7f+qsYGVadePffOn1mzPMPSfkn65nOX0/bkTtR3mStV1efqaH QdxYA 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 --- drivers/base/firmware_loader/main.c | 71 +++++++++++++++++++++++++++++++++= +--- include/linux/firmware.h | 10 ++++++ 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_lo= ader/main.c index a11b30dda23b..bd890f103b2f 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,21 +1141,37 @@ 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); +} + static void request_firmware_work_func(struct work_struct *work) { struct firmware_work *fw_work; const struct firmware *fw; + unsigned long flags; =20 fw_work =3D container_of(work, struct firmware_work, work); =20 _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_irqsave(&firmware_work_lock, flags); + if (!list_empty(&fw_work->list)) { + list_del_init(&fw_work->list); + spin_unlock_irqrestore(&firmware_work_lock, flags); + firmware_work_free(fw_work); + kfree(fw_work); + return; + } + spin_unlock_irqrestore(&firmware_work_lock, flags); } =20 =20 @@ -1164,6 +1181,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 +1214,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 +1282,46 @@ 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; + unsigned long flags; + + spin_lock_irqsave(&firmware_work_lock, flags); + 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_irqrestore(&firmware_work_lock, flags); + + if (!fw_work) + return; + cancel_work_sync(&fw_work->work); + firmware_work_free(fw_work); + kfree(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 Sun Jun 14 07:48:16 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 55ED938759B for ; Fri, 1 May 2026 10:26:16 +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=1777631177; cv=none; b=Ml2RgS0IyPLq4RQFaf0gQlkqlmpVJC1Q3KW30hJf7FdJTV4B5cxociyeiuajaTS8PKv47t2ppi39LPZJlOC2PXJIf04lRkursl0So9hJZaIejK5RXFzWRy3jPLYWbgwfyNZuSdsi6KyK4V1ZYrsqieSBAlRj/pPBKspMAYkif3k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777631177; c=relaxed/simple; bh=RfgrVvknme6vhAOFjjbtHTulvqGle3JEa4VWxijNxXc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nJ49UBUzaBvHWBnY/sAe9e1jL1bZhuZwHwcPd9M6Psjgn3Iq/Q+PYW7UJwJZVsBw44jUs/e64DwmnTIsZm3rp3kl/TL7evfV3VLbxN8GsXZyqdIjqt4Ank6FaPhSleE9w3nmcYmHxT/fm7jQqaqMw0gOVqcmQqJN8CIgo4Y6g7E= 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=GSbWxuCB; 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="GSbWxuCB" Received: by mail-dl1-f45.google.com with SMTP id a92af1059eb24-12713e56abdso1278411c88.1 for ; Fri, 01 May 2026 03:26:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777631175; x=1778235975; 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=GSbWxuCBXPTkIyZx83x4CzYLnThWPFB7/IsNQ1foABe1Lj1gkqvMghqWYz4H7MZ7K/ VI93VynO2oM9kM/SaUclaUZGFfJfApWYKCGgTyQ82buPiYfeSM5wQlEWm5vid8KR0skO 0BXVoAwgvS1YxjhV2o2IKibpLKl8qQoJ/qXTOjn2QpDsvADyXSJ9YgWQvdUCSZctLr/r Ymbmo5xYTfFgyjmH8PicSG4MafHBZ3Ngyi0/2e5ilfc+jX7BkZBqMWg20i/kaKl2E59u 24RGQStwdrj4/d0v2f6lktq+R2O/32/chz0j2SfPkQGs0tt1hcyAZ6roGdCEis1SXbpz TdWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777631175; x=1778235975; 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=tDhfH4AgDAo3Y8KUKCCp0W5mK5otCtggvhfulZ/CZcRNj2YeQi8W2q3wERift2f3GP 276I9xSgnONz95sh6gvEMGWUwgMzEDRtY01SQyWevtdoMvcE2L9TJdKemUYhBhj4iiDm +tVcbEd735+zCTMpJqfSRaJVEuRFL7ht9fYexmyOUUXrehmYdqCgFFI53VWn0z7bnqiI OLFgXuVTsPS4aY2KOL0YQGdsiwfrlMZ919YAvCeouF1mN3fDCaqIv0rVcRcB7C2Hprdb BAB/jI7KBGfrtn/VVM57hQPgj81P6/buLGTb6n5tdIiR7bEnNxa1uZiGgE8g/oaxIrB9 UQEQ== X-Forwarded-Encrypted: i=1; AFNElJ/YawCT9T+dYhwjbTxa8FRsM3uJzWfWQeMs6SsvVkI50u5r41jgsnHda8q6iaqBWRbzPsnSo8ggFVpN4nQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzBOp3IqgUVMZEHE++/uR9XN46CxFvsx0U17IGvmqrsp/X2Z7qt yiPZlwYMWmRUO2Qd5eRAr2qcySrVnxl9HkfzkJJh0z6euAdDGwBDkXMX X-Gm-Gg: AeBDietJdVIba+d2mJMlo+mUPkD83/KKIRQVooL8KTscyb0jqMyXQXtNiChJiS9yLRS SjVaNr8nj2np2p28Hn27Tx/INPgN6eWa5sL7LzbxA9vVccUeXgT0KhJMku7ugTtwhouOwiNQyiG OQmG1DAfDgGG/D4RZC6MY3o1i53jdHFaV6K8dl86blr2lhY+pW2z9evb2g5LBm5uLSK5cxR61vz Q/9nIZrPMqKKpX+RGp9Tz65cH1G+SknWRX7dUkriFuRNd5XPbASR3P4qojCmVY13LTLJ5MtMgKA u3oSp0h7P87dKsvS1cZdy9vs87IEojRmmqckg9mIWc6DviGfgsWF0Mo/rM0KlEXD34L2DiczLxI C6YTSdl4dh0TO9fg/zhn4AHNI/HtlXEkgQ3sqqatlFM5PFiv9YxkdZpfzwTfsJXdgRkDR6V9z+3 dMQqRbzCh/Wwh7X7G83/fqFLc92azShp7kUTpD88ZtluVoat4e9TMs25tulHsEtcbPk5CT857QX g/qYTzhqI+/ X-Received: by 2002:a05:7022:6087:b0:12c:1288:ce63 with SMTP id a92af1059eb24-12decc27261mr2509922c88.13.1777631175407; Fri, 01 May 2026 03:26:15 -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-12df84250f1sm2621191c88.11.2026.05.01.03.26.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 01 May 2026 03:26:14 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Fri, 01 May 2026 07:22:13 -0300 Subject: [PATCH v3 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: <20260501-alsa-hda-tas2781-fw-callback-teardown-v3-2-8d9f873b97bd@gmail.com> References: <20260501-alsa-hda-tas2781-fw-callback-teardown-v3-0-8d9f873b97bd@gmail.com> In-Reply-To: <20260501-alsa-hda-tas2781-fw-callback-teardown-v3-0-8d9f873b97bd@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/u2bG02pJDJlf6nfs3t1hdLxfZ6JxjNJv/rtrFIIOtf2V/Sp10pM78 K/Kq/1SHaUsDGJcDLJiiiyrkxZZ7ul6cLU+boUHzBxWJpAhDFycAjCR7nWMDOtPtfhGXW7b8W45 g+ofHaHW5GzGRwGF346GejO8bLs525nhr/zerSd9wth0XgTE2HGFKTgf2i5qoZSVuugqp+erhKU VbAA= 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 --- 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