[PATCH 17/18] HID: logitech-hidpp: manage send_mutex with devm_mutex_init()

From: Dmitry Torokhov

Date: Mon Nov 09 2026 - 01:18:14 EST


Manually initializing and destroying the HID++ command mutex in probe
and remove destroys the mutex before devres tears down managed child
resources such as the delayed input device and battery power supply.
Switching to devm_mutex_init() eliminates manual teardown boilerplate
while keeping the mutex valid throughout child device teardown.

Initialize the command mutex with devm_mutex_init() during probe,
returning early on allocation failure, and drop manual mutex
destruction from the error path and device removal handler.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>
---
drivers/hid/hid-logitech-hidpp.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index d0ec973a4b49..7ff7b7d8e2d2 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -4732,9 +4732,12 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)

INIT_WORK(&hidpp->work, hidpp_connect_event);
INIT_WORK(&hidpp->reset_hi_res_work, hidpp_reset_hi_res_handler);
- mutex_init(&hidpp->send_mutex);
init_waitqueue_head(&hidpp->wait);

+ ret = devm_mutex_init(&hdev->dev, &hidpp->send_mutex);
+ if (ret)
+ return ret;
+
/* indicates we are handling the battery properties in the kernel */
ret = sysfs_create_group(&hdev->dev.kobj, &ps_attribute_group);
if (ret)
@@ -4810,7 +4813,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
hid_hw_stop(hdev);
hid_hw_start_fail:
sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
- mutex_destroy(&hidpp->send_mutex);
return ret;
}

@@ -4827,7 +4829,6 @@ static void hidpp_remove(struct hid_device *hdev)
disable_work_sync(&hidpp->reset_hi_res_work);

hid_hw_stop(hdev);
- mutex_destroy(&hidpp->send_mutex);
}

#define LDJ_DEVICE(product) \
--
2.56.0.506.g506a7eabc5-goog