[PATCH 03/10] HID: hid-lenovo-go-s: Prevent deadlock if device removed during setup

From: Derek J. Clark

Date: Mon Sep 14 2026 - 18:53:27 EST


hid_gos_cfg_remove() calls a mutex before canceling delayed work. That
delayed work function calls mcu_property_out(), which holds the same mutex.
Prevent deadlock my removing the mutex prior to stopping the work.
Additionally, since cancel_delayed_work has the potential to re-arm,
switch to disable_delayed_work.

Fixes: a23f3497bf208c59ad ("HID: hid-lenovo-go-s: Add Lenovo Legion Go S Series HID Driver")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Derek J. Clark <derekjohn.clark@xxxxxxxxx>
---
drivers/hid/hid-lenovo-go-s.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/hid/hid-lenovo-go-s.c b/drivers/hid/hid-lenovo-go-s.c
index 36505d8402ff..8b16fc7d151e 100644
--- a/drivers/hid/hid-lenovo-go-s.c
+++ b/drivers/hid/hid-lenovo-go-s.c
@@ -1442,8 +1442,7 @@ static int hid_gos_cfg_probe(struct hid_device *hdev,

static void hid_gos_cfg_remove(struct hid_device *hdev)
{
- guard(mutex)(&drvdata.cfg_mutex);
- cancel_delayed_work_sync(&drvdata.gos_cfg_setup);
+ disable_delayed_work_sync(&drvdata.gos_cfg_setup);
sysfs_remove_groups(&hdev->dev.kobj, top_level_attr_groups);
hid_hw_close(hdev);
hid_hw_stop(hdev);
--
2.55.0