mirror of https://github.com/OpenIPC/firmware.git
42 lines
1.1 KiB
Diff
42 lines
1.1 KiB
Diff
diff -drupN a/drivers/hid/uhid.c b/drivers/hid/uhid.c
|
|
--- a/drivers/hid/uhid.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/drivers/hid/uhid.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -28,6 +28,8 @@
|
|
#define UHID_NAME "uhid"
|
|
#define UHID_BUFSIZE 32
|
|
|
|
+static DEFINE_MUTEX(uhid_open_mutex);
|
|
+
|
|
struct uhid_device {
|
|
struct mutex devlock;
|
|
bool running;
|
|
@@ -142,15 +144,26 @@ static void uhid_hid_stop(struct hid_dev
|
|
static int uhid_hid_open(struct hid_device *hid)
|
|
{
|
|
struct uhid_device *uhid = hid->driver_data;
|
|
+ int retval = 0;
|
|
|
|
- return uhid_queue_event(uhid, UHID_OPEN);
|
|
+ mutex_lock(&uhid_open_mutex);
|
|
+ if (!hid->open++) {
|
|
+ retval = uhid_queue_event(uhid, UHID_OPEN);
|
|
+ if (retval)
|
|
+ hid->open--;
|
|
+ }
|
|
+ mutex_unlock(&uhid_open_mutex);
|
|
+ return retval;
|
|
}
|
|
|
|
static void uhid_hid_close(struct hid_device *hid)
|
|
{
|
|
struct uhid_device *uhid = hid->driver_data;
|
|
|
|
- uhid_queue_event(uhid, UHID_CLOSE);
|
|
+ mutex_lock(&uhid_open_mutex);
|
|
+ if (!--hid->open)
|
|
+ uhid_queue_event(uhid, UHID_CLOSE);
|
|
+ mutex_unlock(&uhid_open_mutex);
|
|
}
|
|
|
|
static int uhid_hid_parse(struct hid_device *hid)
|