You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'autosuspend' into for-next
Conflicts: drivers/hid/hid-core.c
This commit is contained in:
@@ -1819,6 +1819,22 @@ void hid_unregister_driver(struct hid_driver *hdrv)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hid_unregister_driver);
|
||||
|
||||
int hid_check_keys_pressed(struct hid_device *hid)
|
||||
{
|
||||
struct hid_input *hidinput;
|
||||
int i;
|
||||
|
||||
list_for_each_entry(hidinput, &hid->inputs, list) {
|
||||
for (i = 0; i < BITS_TO_LONGS(KEY_MAX); i++)
|
||||
if (hidinput->input->key[i])
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(hid_check_keys_pressed);
|
||||
|
||||
static int __init hid_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
+14
-3
@@ -181,9 +181,17 @@ static int hidraw_open(struct inode *inode, struct file *file)
|
||||
|
||||
dev = hidraw_table[minor];
|
||||
if (!dev->open++) {
|
||||
if (dev->hid->ll_driver->power) {
|
||||
err = dev->hid->ll_driver->power(dev->hid, PM_HINT_FULLON);
|
||||
if (err < 0)
|
||||
goto out_unlock;
|
||||
}
|
||||
err = dev->hid->ll_driver->open(dev->hid);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
if (dev->hid->ll_driver->power)
|
||||
dev->hid->ll_driver->power(dev->hid, PM_HINT_NORMAL);
|
||||
dev->open--;
|
||||
}
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
@@ -209,10 +217,13 @@ static int hidraw_release(struct inode * inode, struct file * file)
|
||||
list_del(&list->node);
|
||||
dev = hidraw_table[minor];
|
||||
if (!--dev->open) {
|
||||
if (list->hidraw->exist)
|
||||
if (list->hidraw->exist) {
|
||||
if (dev->hid->ll_driver->power)
|
||||
dev->hid->ll_driver->power(dev->hid, PM_HINT_NORMAL);
|
||||
dev->hid->ll_driver->close(dev->hid);
|
||||
else
|
||||
} else {
|
||||
kfree(list->hidraw);
|
||||
}
|
||||
}
|
||||
|
||||
kfree(list);
|
||||
|
||||
+370
-108
File diff suppressed because it is too large
Load Diff
@@ -246,10 +246,12 @@ static int hiddev_release(struct inode * inode, struct file * file)
|
||||
spin_unlock_irqrestore(&list->hiddev->list_lock, flags);
|
||||
|
||||
if (!--list->hiddev->open) {
|
||||
if (list->hiddev->exist)
|
||||
if (list->hiddev->exist) {
|
||||
usbhid_close(list->hiddev->hid);
|
||||
else
|
||||
usbhid_put_power(list->hiddev->hid);
|
||||
} else {
|
||||
kfree(list->hiddev);
|
||||
}
|
||||
}
|
||||
|
||||
kfree(list);
|
||||
@@ -300,6 +302,17 @@ static int hiddev_open(struct inode *inode, struct file *file)
|
||||
list_add_tail(&list->node, &hiddev_table[i]->list);
|
||||
spin_unlock_irq(&list->hiddev->list_lock);
|
||||
|
||||
if (!list->hiddev->open++)
|
||||
if (list->hiddev->exist) {
|
||||
struct hid_device *hid = hiddev_table[i]->hid;
|
||||
res = usbhid_get_power(hid);
|
||||
if (res < 0) {
|
||||
res = -EIO;
|
||||
goto bail;
|
||||
}
|
||||
usbhid_open(hid);
|
||||
}
|
||||
|
||||
return 0;
|
||||
bail:
|
||||
file->private_data = NULL;
|
||||
|
||||
@@ -38,7 +38,10 @@ int usbhid_wait_io(struct hid_device* hid);
|
||||
void usbhid_close(struct hid_device *hid);
|
||||
int usbhid_open(struct hid_device *hid);
|
||||
void usbhid_init_reports(struct hid_device *hid);
|
||||
void usbhid_submit_report(struct hid_device *hid, struct hid_report *report, unsigned char dir);
|
||||
void usbhid_submit_report
|
||||
(struct hid_device *hid, struct hid_report *report, unsigned char dir);
|
||||
int usbhid_get_power(struct hid_device *hid);
|
||||
void usbhid_put_power(struct hid_device *hid);
|
||||
|
||||
/* iofl flags */
|
||||
#define HID_CTRL_RUNNING 1
|
||||
@@ -49,6 +52,9 @@ void usbhid_submit_report(struct hid_device *hid, struct hid_report *report, uns
|
||||
#define HID_CLEAR_HALT 6
|
||||
#define HID_DISCONNECTED 7
|
||||
#define HID_STARTED 8
|
||||
#define HID_REPORTED_IDLE 9
|
||||
#define HID_KEYS_PRESSED 10
|
||||
#define HID_LED_ON 11
|
||||
|
||||
/*
|
||||
* USB-specific HID struct, to be pointed to
|
||||
@@ -66,7 +72,6 @@ struct usbhid_device {
|
||||
struct urb *urbin; /* Input URB */
|
||||
char *inbuf; /* Input buffer */
|
||||
dma_addr_t inbuf_dma; /* Input buffer dma */
|
||||
spinlock_t inlock; /* Input fifo spinlock */
|
||||
|
||||
struct urb *urbctrl; /* Control URB */
|
||||
struct usb_ctrlrequest *cr; /* Control request struct */
|
||||
@@ -75,21 +80,22 @@ struct usbhid_device {
|
||||
unsigned char ctrlhead, ctrltail; /* Control fifo head & tail */
|
||||
char *ctrlbuf; /* Control buffer */
|
||||
dma_addr_t ctrlbuf_dma; /* Control buffer dma */
|
||||
spinlock_t ctrllock; /* Control fifo spinlock */
|
||||
|
||||
struct urb *urbout; /* Output URB */
|
||||
struct hid_output_fifo out[HID_CONTROL_FIFO_SIZE]; /* Output pipe fifo */
|
||||
unsigned char outhead, outtail; /* Output pipe fifo head & tail */
|
||||
char *outbuf; /* Output buffer */
|
||||
dma_addr_t outbuf_dma; /* Output buffer dma */
|
||||
spinlock_t outlock; /* Output fifo spinlock */
|
||||
|
||||
spinlock_t lock; /* fifo spinlock */
|
||||
unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */
|
||||
struct timer_list io_retry; /* Retry timer */
|
||||
unsigned long stop_retry; /* Time to give up, in jiffies */
|
||||
unsigned int retry_delay; /* Delay length in ms */
|
||||
struct work_struct reset_work; /* Task context for resets */
|
||||
struct work_struct restart_work; /* waking up for output to be done in a task */
|
||||
wait_queue_head_t wait; /* For sleeping */
|
||||
int ledcount; /* counting the number of active leds */
|
||||
};
|
||||
|
||||
#define hid_to_usb_dev(hid_dev) \
|
||||
|
||||
Reference in New Issue
Block a user