Commit 0f5a24c6 authored by Manoj Chourasia's avatar Manoj Chourasia Committed by Jiri Kosina

HID: hidraw: close underlying device at removal of last reader

Even though device exist bit is set the underlying
HW device should be closed when the last reader
of the device is closed i.e. open count drops to zero.
Signed-off-by: default avatarManoj Chourasia <mchourasia@nvidia.com>
Reported-by: mika.westerberg@linux.intel.com
Tested-by: mika.westerberg@linux.intel.com
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 550dbf47
...@@ -308,18 +308,25 @@ static int hidraw_fasync(int fd, struct file *file, int on) ...@@ -308,18 +308,25 @@ static int hidraw_fasync(int fd, struct file *file, int on)
static void drop_ref(struct hidraw *hidraw, int exists_bit) static void drop_ref(struct hidraw *hidraw, int exists_bit)
{ {
if (exists_bit) { if (exists_bit) {
hid_hw_close(hidraw->hid);
hidraw->exist = 0; hidraw->exist = 0;
if (hidraw->open) if (hidraw->open) {
hid_hw_close(hidraw->hid);
wake_up_interruptible(&hidraw->wait); wake_up_interruptible(&hidraw->wait);
}
} else { } else {
--hidraw->open; --hidraw->open;
} }
if (!hidraw->open) {
if (!hidraw->open && !hidraw->exist) { if (!hidraw->exist) {
device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); device_destroy(hidraw_class,
MKDEV(hidraw_major, hidraw->minor));
hidraw_table[hidraw->minor] = NULL; hidraw_table[hidraw->minor] = NULL;
kfree(hidraw); kfree(hidraw);
} else {
/* close device for last reader */
hid_hw_power(hidraw->hid, PM_HINT_NORMAL);
hid_hw_close(hidraw->hid);
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment