mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
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: Manoj Chourasia <mchourasia@nvidia.com> Reported-by: mika.westerberg@linux.intel.com Tested-by: mika.westerberg@linux.intel.com Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
550dbf4781
commit
0f5a24c660
1 changed files with 14 additions and 7 deletions
|
@ -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)
|
||||
{
|
||||
if (exists_bit) {
|
||||
hid_hw_close(hidraw->hid);
|
||||
hidraw->exist = 0;
|
||||
if (hidraw->open)
|
||||
if (hidraw->open) {
|
||||
hid_hw_close(hidraw->hid);
|
||||
wake_up_interruptible(&hidraw->wait);
|
||||
}
|
||||
} else {
|
||||
--hidraw->open;
|
||||
}
|
||||
|
||||
if (!hidraw->open && !hidraw->exist) {
|
||||
device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor));
|
||||
hidraw_table[hidraw->minor] = NULL;
|
||||
kfree(hidraw);
|
||||
if (!hidraw->open) {
|
||||
if (!hidraw->exist) {
|
||||
device_destroy(hidraw_class,
|
||||
MKDEV(hidraw_major, hidraw->minor));
|
||||
hidraw_table[hidraw->minor] = NULL;
|
||||
kfree(hidraw);
|
||||
} else {
|
||||
/* close device for last reader */
|
||||
hid_hw_power(hidraw->hid, PM_HINT_NORMAL);
|
||||
hid_hw_close(hidraw->hid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue