diff options
Diffstat (limited to 'drivers/hid/hidraw.c')
| -rw-r--r-- | drivers/hid/hidraw.c | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 8918dd12bb69..6a6dd5cd7833 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c @@ -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); +		}  	}  }  | 
